[CMake] Changing installation prefix triggers re-linking of all libraries

Michael Hertling mhertling at online.de
Mon May 2 19:05:38 EDT 2011


On 04/29/2011 03:39 PM, Pere Mato Vila wrote:
> Perhaps somebody can give me some hints on this problem I have. I build a project and install it in <path>/install with "make install".  Then I do change the installation prefix with 
>  cmake -DCMAKE_INSTALL_PREFIX=<path>/install2 ../root_cmake/
> and if I execute again "make install" it rebuilds basically every library of the project.  I have traced the dependency to the generated link.txt file, which contains the link command. In one case the contents of the file is: 
> 
> /usr/bin/c++  -fPIC  -pipe -m64 -Wall -W -Woverloaded-virtual -fPIC -O2 -g  -shared -Wl,-soname,libCint.so -o ../../lib/libCint.so CMakeFiles/Cint.dir/src/loadfile.o ../../lib/libCint_static.a -lpthread -Wl,-rpath,:::::::::::::::::::::::::::: 
> 
> and in the other is:
> 
> /usr/bin/c++  -fPIC  -pipe -m64 -Wall -W -Woverloaded-virtual -fPIC -O2 -g  -shared -Wl,-soname,libCint.so -o ../../lib/libCint.so CMakeFiles/Cint.dir/src/loadfile.o ../../lib/libCint_static.a -lpthread -Wl,-rpath,::::::::::::::::::::::::::::: 
> 
> Notice the different number of colons in the -rpath settings. The first question I have is what is the origin of these many colons in the rpath settings? The second question, why is different when I choose another installation directory. My CMake variables that control RPATH are the following:
> 
> first 
> 
> CMAKE_INSTALL_RPATH -->/build/mato/ROOT/install/lib
> CMAKE_INSTALL_RPATH_USE_LINK_PATH -->TRUE
> CMAKE_SKIP_BUILD_RPATH -->FALSE
> CMAKE_BUILD_WITH_INSTALL_RPATH -->FALSE
> 
> and later 
> 
> CMAKE_INSTALL_RPATH -->/build/mato/ROOT/install2/lib
> CMAKE_INSTALL_RPATH_USE_LINK_PATH -->TRUE
> CMAKE_SKIP_BUILD_RPATH -->FALSE
> CMAKE_BUILD_WITH_INSTALL_RPATH -->FALSE

AFAIK, changing CMAKE_INSTALL_PREFIX - or any other variable in CMake's
cache - doesn't trigger a recompilation or relinking by itself. Look at
the following CMakeLists.txt

CMAKE_MINIMUM_REQUIRED(VERSION 2.8 FATAL_ERROR)
PROJECT(PREFIX C)
SET(CMAKE_VERBOSE_MAKEFILE ON)
ADD_LIBRARY(f SHARED f.c)
INSTALL(TARGETS f
    RUNTIME DESTINATION bin
    LIBRARY DESTINATION lib
    ARCHIVE DESTINATION lib)

with ${CMAKE_SOURCE_DIR}/f.c containing just "void f(void){}". After
configuring/building/installing, a reconfiguration with a modified
CMAKE_INSTALL_PREFIX does not result in recompiling or relinking.

Nevertheless, what may be very well is that there are files which get
generated during a (re)configuration, typically configured headers, so
their regeneration will invalidate other files that depend on them and,
thus, trigger recompilations and the relinking of the affected targets.

There's a further mechanism beyond the regeneration of headers or
source files that triggers recompilations in this regard: Add

SET_SOURCE_FILES_PROPERTIES(
    ${CMAKE_SOURCE_DIR}/f.c
    PROPERTIES
    COMPILE_DEFINITIONS "PREFIX=${CMAKE_INSTALL_PREFIX}")

to the above-noted CMakeLists.txt and you'll see that a modified
CMAKE_INSTALL_PREFIX does result in a rebuild now. Refer to the
${CMAKE_BINARY_DIR}/CMakeFiles/f.dir/flags.make file for the
reason.

Regards,

Michael


More information about the CMake mailing list