【发布时间】:2014-07-10 09:46:27
【问题描述】:
我有一个 CMake 项目 Foobar,其中包含一个子目录 examples,它也可以用作独立的 CMake 构建。为此,此子目录执行find_package(Foobar) 并使用导出的目标。 Foobar 提供 FoobarConfig.cmake、FoobarConfigVersion.cmake 和 FoobarExports.cmake,并且可以在没有 FindModule 的情况下使用。
代码大致如下:
### 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)
问题在于export(EXPORT FoobarExports) 只会在生成时间结束时创建FoobarExports.cmake 文件,以确保它具有完整的FoobarExports 导出集。
所以这会失败:
cmake . -DBUILD_EXAMPLES=ON
# Error: FoobarExports.cmake not found
然而,有效的是:
cmake .
cmake . -DBUILD_EXAMPLES=ON # rerun cmake with changed cache variable
如果尚未创建文件,我如何在调用 export 时强制写入 FoobarExports.cmake 文件或强制 CMake 运行两次?
【问题讨论】:
标签: cmake build-system