[cmake-developers] Making Config.cmake files easier to write

Alexander Neundorf neundorf at kde.org
Tue Feb 14 13:26:08 EST 2012


On Monday 13 February 2012, Brad King wrote:
> On 2/13/2012 4:52 PM, Alexander Neundorf wrote:
> > we are hoping that more and more libraries will install Config.cmake
> > files (and for kdelibs this is actually happening right now), so we
> > should make sure it is straighforward to create proper Config.cmake
> > files.
> 
> This is a worthwhile goal, but I do not like the approach proposed:
> 
> (1) It makes BarConfig.cmake depend on a file not distributed with it.

Well, CMakeConfigHelpers.cmake would be shipped with cmake, so as long as the 
Config.cmake file says
cmake_minimum_required(VERSION 2.8.8)
it would be fine.

> (2) The content of a relocatable BarConfig.cmake should not depend on where
> it happened to be installed when the package was built.

I don't see a real problem with this.
Actually it is a good thing if the Config.cmake file can detect whether it is 
in the location where it should be according to CMAKE_INSTALL_PREFIX, e.g. to 
ensure that the libraries are installed in the right location (so the builtin 
RPATHs point to the right location).

> I'd rather see an approach that processes paths during configuration
> of the original package.  Provide some helper macros that can configure
> BarConfig.cmake with the proper code in it to compute paths relative
> to its location:
> 
>   include(CMakePackageConfigHelper)
>   cmake_package_config_for_install(Bar
>     DESTINATION lib/cmake/Bar # install destination
>     # INPUT BarConfig-install.cmake.in # alternate input
>     )
> 
> This would look for "BarConfig.cmake.in" (or whatever INPUT says) and
> do configure_file along with install(FILES).  The module can document
> some standard @CONFIG@ variables that can be used inside the input
> file to get various paths:
> 
>   $ cat BarConfig.cmake.in
>   @PACKAGE_INIT@
>   set(BAR_INCLUDE_DIRS "@PACKAGE_PREFIX@/include/bar")
>   ...
> 
> The @PACKAGE_INIT@ would be replaced by code to compute the install
> prefix using knowledge the of the install DESTINATION of the config
> file and store it in an unspecified variable (say Bar_PREFIX) that
> is referenced by @PACKAGE_PREFIX@, which is replaced by ${Bar_PREFIX}.

How would that work if INCLUDE_INSTALL_DIR is an absolute path ?
set(BAR_INCLUDE_DIRS "@INCLUDE_INSTALL_DIR@")

Would the case that DATA_INSTALL_DIR and LIB_INSTALL_DIR point to completely 
different locations be handled ?

Alex


More information about the cmake-developers mailing list