在导出构建树中要求导出CMake目标

时间:2014-07-10 09:46:28

标签: cmake build-system

我有一个CMake项目Foobar,其中包含一个子目录examples,也可以用作独立的CMake构建。为此,此子目录执行find_package(Foobar)并使用导出的目标。 Foobar提供了FoobarConfig.cmakeFoobarConfigVersion.cmakeFoobarExports.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运行两次,如果尚未创建文件?

1 个答案:

答案 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)