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

Michael Hertling mhertling at online.de
Fri May 20 07:30:16 EDT 2011


On 05/10/2011 11:24 AM, Pere Mato Vila wrote:
>>
>> To my regret, I don't see any easy solution for your concern, but if
>> the unnecessary rebuilds due to the the RPATH placeholder mechanism
>> are a serious issue in your project, the above-noted approach can
>> possibly be adapted to your needs.
>>
>> 'hope that helps.
> Dear Michael,
> 
> Thank-you very much for your interest and the time you have spend developing this solution. But I am afraid that the added complexity  in the coding and procedure does not balance with benefits of having an installation RPATH. We will continue with what we have been doing and set the LD_LIBRARY_PATH when using the installed project. Nevertheless I must say that this solution has been very educative for me, since I have learnt a few things (or tricks) that I was not aware you could do with CMake. Thanks again.  
> 
> Pere

Hi Pere,

sorry for re-entering this thread so late, but recently, I stumbled over
the CMAKE_NO_BUILTIN_CHRPATH variable which possibly provides an easy
solution for your issue. Look at the following exemplary project:

# CMakeLists.txt:
CMAKE_MINIMUM_REQUIRED(VERSION 2.8 FATAL_ERROR)
PROJECT(RPATH C)
SET(CMAKE_VERBOSE_MAKEFILE ON)
SET(CMAKE_NO_BUILTIN_CHRPATH ON)
ADD_EXECUTABLE(gen gen.c)
ADD_CUSTOM_COMMAND(OUTPUT main.c COMMAND gen > main.c DEPENDS gen)
ADD_EXECUTABLE(main main.c)
SET(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
ADD_LIBRARY(f SHARED f.c)
ADD_LIBRARY(g SHARED g.c)
INSTALL(TARGETS f g LIBRARY DESTINATION lib)
TARGET_LINK_LIBRARIES(gen f g)

/* f.c: */
void f(void){}

/* g.c: */
void g(void){}

/* gen.c: */
#include <stdio.h>
int main(void)
{
    printf("int main(void){return 0;}\n"); return 0;
}

Essentially, it's the same as in my previous posting, but without the
somewhat weird gen-on-f/g dependency. Instead, it is the usual simple
setup of a code generator which depends on two libraries. Without the
CMAKE_NO_BUILTIN_CHRPATH set to ON, a change in CMAKE_INSTALL_PREFIX
would result in relinking the f/g libraries, and subsequently in re-
building gen and main due to their dependency relations. This is what
you complained about, IIRC. Now, with CMAKE_NO_BUILTIN_CHRPATH set to
ON, the concerned binaries are actually relinked at installation time
to get the RPATHs right, so there's no need anymore to provide enough
space for the final RPATHs at build time. As a consequence, the f/g
libraries aren't relinked when CMAKE_INSTALL_PREFIX changes, and gen
along with main doesn't become out-of-date. However, lib{f,g}.so are
relinked at installation time, but this should be by far a cheaper
alternative to the nearly complete project's recompilation you've
reported.

'hope that helps.

Regards,

Michael


More information about the CMake mailing list