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

Brad King brad.king at kitware.com
Tue Feb 14 16:14:53 EST 2012


On 2/14/2012 2:44 PM, Alexander Neundorf wrote:
> In the BarConfig.cmake file there would still be either a
>
> set(BAR_INCLUDE_DIR "@INCLUDE_INSTALL_DIR@")
> which would work for absolute paths, or a
>
> set(BAR_INCLUDE_DIR "${SomePrefix}/@INCLUDE_INSTALL_DIR@")
> which would work only for relative paths, but a simple set() cannot work for
> both cases. Am I missing something ?

  $ cat BarConfig.cmake.in
  @PACKAGE_INIT@
  set(BAR_INCLUDE_DIR "@PACKAGE_INCLUDE_INSTALL_DIR@")

  $ cat CMakeLists.txt
  ...
  set(INCLUDE_INSTALL_DIR ...)
  cmake_package_config_for_install(Bar
    DESTINATION ${CMAKECONFIG_INSTALL_DIR}
    PATH_VARS INCLUDE_INSTALL_DIR)

The macro should check the value of INSTALL_INCLUDE_DIR.

Relative case:

  $ cat BarConfig.cmake
  get_filename_component(BAR_INSTALL_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH)
  get_filename_component(BAR_INSTALL_PREFIX "${BAR_INSTALL_PREFIX}" PATH)
  get_filename_component(BAR_INSTALL_PREFIX "${BAR_INSTALL_PREFIX}" PATH)
  # ... repeated based on depth of BarConfig install location
  set(BAR_INCLUDE_DIR "${BAR_INSTALL_PREFIX}/include/bar)

Absolute case when value happens to be under ${CMAKE_INSTALL_PREFIX}:

  $ cat BarConfig.cmake
  get_filename_component(BAR_INSTALL_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH)
  get_filename_component(BAR_INSTALL_PREFIX "${BAR_INSTALL_PREFIX}" PATH)
  get_filename_component(BAR_INSTALL_PREFIX "${BAR_INSTALL_PREFIX}" PATH)
  # ... repeated based on depth of BarConfig install location
  set(BAR_INCLUDE_DIR "${BAR_INSTALL_PREFIX}/include/bar)

Outside absolute case:

  $ cat BarConfig.cmake
  get_filename_component(BAR_INSTALL_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH)
  get_filename_component(BAR_INSTALL_PREFIX "${BAR_INSTALL_PREFIX}" PATH)
  get_filename_component(BAR_INSTALL_PREFIX "${BAR_INSTALL_PREFIX}" PATH)
  # ... repeated based on depth of BarConfig install location
  set(BAR_INCLUDE_DIR "/somewhere/include/bar)

The replacement for @PACKAGE_INIT@ is always the same, and can handle
computing BAR_INSTALL_PREFIX at load time.

In all cases the macro replaces @PACKAGE_INCLUDE_INSTALL_DIR@ with
something that it knows how to compute at configuration time.  It
can replace it with a literal ${BAR_INSTALL_PREFIX} in the relative
and relocatable cases so that the proper prefix appears at load time.

-Brad


P.S. Yury, I apologize for spelling your name incorrectly in my other post.



More information about the cmake-developers mailing list