我有一个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
如果在调用FoobarExports.cmake
时强制export
文件被强制写入,或者强制CMake运行两次,如果尚未创建文件?
答案 0 :(得分:3)
如果您将项目作为子项目进行构建,则无需查找任何内容。检查一下 目标存在,如果不存在,尝试找到它。这样的事情:
### examples/CMakeLists.txt ###
cmake_minimum_required(VERSION 3.0.0)
project(FoobarExamples)
if(NOT TARGET X)
find_package(Foobar CONFIG REQUIRED)
endif()
# Use X from Foobar
target_link_library(my_exe X)