Reputation: 10018
I am creating a library which I am building and installing with CMake. In the CMakeLists.txt
is install(TARGETS mylib ...)
to install the library itself and install(EXPORT ...)
to create a CMake config. The CMake config means that the library can be found with find_package()
by applications wanting to use the library from their own CMakeLists.txt
. So far, nothing surprising.
But in addition to that I have useful_fn.cmake
that contains a useful CMake function that I want to make available to the applications' CMakeLists.txt
. I can install it manually with install install(FILE useful_fn.cmake)
, but how will the applications know where to find it? Can it be referenced from the config?
Even better, could the CMake config include the installed version directly? So merely running find_package(mylib)
provides access to this CMake function? I could do this if I wrote my whole mylib-config.cmake by hand, rather than than getting CMake to generate it like it currently does, but I would really rather not do that just so that I can add one line (include(.../usefulfn.cmake)
).
Upvotes: 3
Views: 1923
Reputation: 2070
To clarify further, there is a module that helps your configure valid and relocatable config file.
See macro configure_package_config_file
provided by CMakePackageConfigHelpers module.
As mentioned by @Tsyvarev, the XXXConfig.cmake
file should still be written by hand but configured with configure_package_config_file
instead of configure_file
.
Upvotes: 2
Reputation: 66118
It is misconception that CMake should generate XXXConfig.cmake
script. As opposite, intended behavior that CMake generates every other script (names can be any):
XXXConfigTargets.cmake
with install(EXPORT)
XXXConfigVersion.cmake
with write_basic_package_version_file()
and these scripts are included in the XXXConfig.cmake
script written by hands, where you may define additional things:
# File: XXXConfig.cmake
include(${CMAKE_CURRENT_LIST_DIR}/XXXConfigVersion.cmake)
include(${CMAKE_CURRENT_LIST_DIR}/XXXConfigTargets.cmake)
# Here you may provide additional functions and other things.
function(my_func)
...
endfunction()
See more in the CMake packaging documentation.
Upvotes: 3