[CMake翻译]添加出口配置(步骤11)

1,075 阅读2分钟

原文地址:cmake.org/cmake/help/…

原文作者:

发表时间:

在教程的安装和测试(步骤4)中,我们增加了CMake安装项目库和头文件的功能。在构建安装程序的过程中(第7步),我们增加了将这些信息打包的能力,这样它就可以被分发给其他人。

下一步是添加必要的信息,以便其他CMake项目可以使用我们的项目,无论是从构建目录、本地安装还是打包时。

第一步是更新我们的 install(TARGETS) 命令,不仅指定 DESTINATION,而且指定 EXPORTEXPORT关键字会生成并安装一个CMake文件,该文件包含了从安装树中导入安装命令中列出的所有目标的代码。因此,让我们继续通过更新 MathFunctions/CMakeLists.txt 中的install命令来显式地 EXPORT MathFunctions 库。

install(TARGETS MathFunctions tutorial_compiler_flags
        DESTINATION lib
        EXPORT MathFunctionsTargets)
install(FILES MathFunctions.h DESTINATION include)

现在我们已经导出了MathFunctions,我们还需要显式安装生成的MathFunctionsTargets.cmake文件。通过在顶层 CMakeLists.txt 的底部添加以下内容来完成。

install(EXPORT MathFunctionsTargets
  FILE MathFunctionsTargets.cmake
  DESTINATION lib/cmake/MathFunctions
)

这时你应该尝试运行CMake。如果一切都设置正确,你会看到CMake会产生一个类似的错误。

Target "MathFunctions" INTERFACE_INCLUDE_DIRECTORIES property contains
path:

  "/Users/robert/Documents/CMakeClass/Tutorial/Step11/MathFunctions"

which is prefixed in the source directory.

CMake想说的是,在生成导出信息的过程中,它会导出一个与当前机器有内在联系的路径,在其他机器上是无效的。解决这个问题的办法是更新 MathFunctions target_include_directories(),让它明白当从构建目录内使用和从安装/包中使用时,需要不同的 INTERFACE 位置。这意味着将 MathFunctions 的 target_include_directories() 调用转换为如下样子。

target_include_directories(MathFunctions
                           INTERFACE
                            $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
                            $<INSTALL_INTERFACE:include>
                           )

一旦更新后,我们可以重新运行CMake,并验证它是否不再发出警告。

此时,我们已经让CMake正确地打包了所需的目标信息,但我们仍然需要生成一个MathFunctionsConfig.cmake,以便CMake find_package()命令能够找到我们的项目。因此,让我们继续在项目的顶层添加一个名为 Config.cmake.in 的新文件,内容如下。

@PACKAGE_INIT@

include ( "${CMAKE_CURRENT_LIST_DIR}/MathFunctionsTargets.cmake" )

然后,为了正确配置和安装该文件,在顶层CMakeLists.txt的底部添加以下内容。

install(EXPORT MathFunctionsTargets
  FILE MathFunctionsTargets.cmake
  DESTINATION lib/cmake/MathFunctions
)

include(CMakePackageConfigHelpers)
# generate the config file that is includes the exports
configure_package_config_file(${CMAKE_CURRENT_SOURCE_DIR}/Config.cmake.in
  "${CMAKE_CURRENT_BINARY_DIR}/MathFunctionsConfig.cmake"
  INSTALL_DESTINATION "lib/cmake/example"
  NO_SET_AND_CHECK_MACRO
  NO_CHECK_REQUIRED_COMPONENTS_MACRO
  )
# generate the version file for the config file
write_basic_package_version_file(
  "${CMAKE_CURRENT_BINARY_DIR}/MathFunctionsConfigVersion.cmake"
  VERSION "${Tutorial_VERSION_MAJOR}.${Tutorial_VERSION_MINOR}"
  COMPATIBILITY AnyNewerVersion
)

# install the configuration file
install(FILES
  ${CMAKE_CURRENT_BINARY_DIR}/MathFunctionsConfig.cmake
  DESTINATION lib/cmake/MathFunctions
  )

在这一点上,我们已经为我们的项目生成了一个可重定位的CMake配置,可以在项目安装或打包后使用。如果我们希望我们的项目也能在构建目录下使用,我们只需要在顶层 CMakeLists.txt 的底部添加以下内容。

export(EXPORT MathFunctionsTargets
  FILE "${CMAKE_CURRENT_BINARY_DIR}/MathFunctionsTargets.cmake"
)

通过这个导出调用,我们现在可以生成一个Targets.cmake,允许构建目录下配置的MathFunctionsConfig.cmake被其他项目使用,而不需要安装它。


www.deepl.com 翻译