[CMake] Trying to set up a "superbuild" with external project and install it...

Alexander Neundorf a.neundorf-work at gmx.net
Sat May 14 13:57:51 EDT 2011


On Thursday 12 May 2011, Michael Hertling wrote:
> On 05/11/2011 09:07 PM, Alexander Neundorf wrote:
> > Hi,
> > 
> > I'd like to set up a kind of meta super project, which builds a bunch of
> > subprojects, which contains executable and shared libraries.
> > These subprojects come from different repositories, mostly git
> > repositories.
> > 
> > AFAIK I can basically do this using the ExternalProject_add() feature of
> > cmake, it will get the sources, configure and build them.
> > 
> > So far so good.
> > 
> > 
> > Now, what do I do with installing ?
> > Usually the external projects are installed at the end of their build
> > step at make-time, and usually somewhere in the build tree.
> > 
> > But finally I'd like to have these projects installed into a proper
> > system- wide directory.
> > 
> > If I simply do install(DIRECTORY ... ) in the "superproject", stuff which
> > depends on CMAKE_INSTALL_PREFIX, like e.g. RPATH will be wrong after the
> > final install step (since the RPATHs will still point to the install
> > locations in the build tree).
> > 
> > If I put the final install location as install location in the
> > ExternalProject_Add() call, I will have to build with permissions to
> > install into the final install directory, which is generally not the
> > case. E.g. to install in /opt/ I would basically have to build as root
> > (or change the permissions of /opt/, but that's not possible on a
> > standard system).
> > 
> > I could maybe also setuid cmake root (ugly too).
> > 
> > Always set a relative RPATH always using $ORIGIN ?
> > (but this will be kind of hard to enforce)
> > 
> > Any other ideas ?
> > Am I missing something ?
> > Any ideas how support for this could be added in a clean way ?
> > 
> > Alex
> 
> A quite similar topic has been touched on recently in [1]. My personal
> opinion on this particular issue with regard to subprojects is roughly:
> 
> 1. In the end, each project - subproject or not - must be installed at
> the location it has been configured for; this is the only bullet-proof
> way to ensure that things like RPATH or incorporated paths derived from
> the installation prefix, e.g. <prefix>/etc or /etc if <prefix> is /usr,
> will work as expected, or in other words: Relocation after installation
> is critical, unless it's taken into account by any appropriate measures.
> 
> 2. For the, say, intermediate installation of a subproject in the build
> tree of the superproject, I'd suggest to use the DESTDIR feature, i.e.:
> 
> - Configure and build the subproject with its final installation prefix.
> - Install with "make DESTDIR=${CMAKE_BINARY_DIR}/externals" or the like
>   with the superproject's CMAKE_BINARY_DIR. Thereafter, you could call
>   FIND_PACKAGE() on the subproject with CMAKE_PREFIX_PATH and friends
>   set to ${CMAKE_BINARY_DIR}/externals/${CMAKE_INSTALL_PREFIX}[/...]
>   which may be important for the actual main project. Nevertheless,
>   the subproject's binaries might not run if they strictly require
>   to reside at the location they've been configured for.
> - At the superproject's installation, use
> 
> INSTALL(DIRECTORY ${CMAKE_BINARY_DIR}/externals/${CMAKE_INSTALL_PREFIX}/
>         DESTINATION ${CMAKE_INSTALL_PREFIX})
> 
>   to relocate the subprojects to their configured installation prefix.


Yes, this work pretty good.
But it still has a problem.
Assume subproject foo installs a shared library libfoo, amd subprojects foo-
bar and foo-blub are plugins for this shared library.

foo-bar and foo-blub will find libfoo.so in CMAKE_BINARY_DIR/Install/, and 
link against it happily.

But they will have a problem with their RPATH.
If they use e.g. ${FOO_LIBRARY_DIR} as RPATH, this would point to the 
temporary install location of libfoo, not the final one.
If they use INSTALL_RPATH_USE_LINK_PATH they will have the same problem.

I guess I have to install the subprojects to their final destination already 
in the install-step of the external project.

Alex


More information about the CMake mailing list