[CMake] Requiring exported CMake targets within the exporting build tree
Philipp Möller
bootsarehax at gmail.com
Thu Jul 10 06:12:17 EDT 2014
I have a CMake Project Foobar that contains a subdirectory examples
that can also be used as a stand-alone CMake build. To do that this
sub-directory performs a find_package(Foobar) and uses the exported
targets. Foobar provides a FoobarConfig.cmake,
FoobarConfigVersion.cmake, and a FoobarExports.cmake and can be used
without a FindModule.
The code looks roughly like this:
### Top-Level CMakeLists.txt ###
cmake_minimum_required(VERSION 3.0.0)
project(Foobar)
add_library(X SHARED ${my_sources})
install(TARGETS X EXPORT FoobarExports
LIBRARY DESTINATION ${my_install_destination})
install(EXPORT FoobarExports DESTINATION ${my_install_destination})
# Create the FoobarExports.cmake for the local build tree
export(EXPORT FoobarExports) # the problematic command
# Setup FoobarConfig.cmake etc
# FoobarConfig.cmake includes FoobarExports.cmake
# ...
# Force find_package to FOOBAR_DIR
option(BUILD_EXAMPLES "Build examples" ON)
if(BUILD_EXAMPLES)
set(FOOBAR_DIR "${CMAKE_BINARY_DIR}")
add_subdirectory(examples)
endif()
### examples/CMakeLists.txt ###
cmake_minimum_required(VERSION 3.0.0)
project(FoobarExamples)
# Uses FOOBAR_DIR set above
find_package(Foobar NO_MODULE REQUIRED)
add_executable(my_exe ${some_sources})
# Use X from Foobar
target_link_library(my_exe X)
The problem is that export(EXPORT FoobarExports) will only create the
FoobarExports.cmake file at the end of generation time to make sure it
has the complete FoobarExports export set.
So this will fail:
cmake . -DBUILD_EXAMPLES=ON
# Error: FoobarExports.cmake not found
What works, however, is:
cmake .
cmake . -DBUILD_EXAMPLES=ON # rerun cmake with changed cache variable
How can I either force the FoobarExports.cmake file to be written at
the time of the call to export or force CMake to run twice, if the
file has not been created yet?
I also posted this question on StackOverflow [1], but realized to late
that it might be a bit too specific and a better place would be this
list.
Thanks,
Philipp
[1] :
http://stackoverflow.com/questions/24673331/requiring-exported-cmake-targets-within-the-exporting-build-tree
More information about the CMake
mailing list