3

在 Daniel Pfeiffer ( Effective CMake ) 和 Deniz Bahadir ( More Modern CMake ) 的会谈中,甚至在CMake 文档中,建议(至少).cmake生成文件以在其他项目中使用带有 CMake 的存储库:foo-config.cmakefoo-config-version.cmake(对于包foo;另一种可能的命名方案是FooConfig.cmakeFooConfigVersion.cmake)。

这对我来说已经很奇怪了。为什么不应该foo-config.cmake有关于已安装版本的信息/命令?这两个单独的文件存在是否有一些客观原因,或者它只是 CMake 设计的“失态”?

编辑:剪掉了这个问题的其余部分,为了集中注意力,因为我出了点问题。

4

2 回答 2

0

太多的评论但不是完整的答案:

我生成的项目中的一个典型序列是使用 CMake 中的CMakePackageConfigHelperGNUInstallDirs模块。

无需生成foo-config-version.cmake模板。只需使用write_basic_package_version_file此模块中的命令即可完成工作。

export如果您想使用构建目录中的配置包而不需要安装它们,该命令会派上用场。

参见示例:

# Support find_package(Foo NO_MODULE).
set(FOO_DOC_DIR ${CMAKE_INSTALL_DOCDIR})
set(FOO_INCLUDE_DIR ${CMAKE_INSTALL_INCLUDEDIR})
set(FOO_LIB_DIR ${CMAKE_INSTALL_LIBDIR})
set(FOODIR ${CMAKE_INSTALL_PREFIX})

include(CMakePackageConfigHelpers)
include(GNUInstallDirs)

configure_package_config_file(foo-config.cmake.in "${CMAKE_CURRENT_BINARY_DIR}/foo-config.cmake"
  INSTALL_DESTINATION ${FOO_CONFIG_PACKAGE_LOCATION}
  PATH_VARS FOODIR FOO_INCLUDE_DIR FOO_LIB_DIR FOO_DOC_DIR
)

write_basic_package_version_file("${CMAKE_CURRENT_BINARY_DIR}/foo-config-version.cmake"
  VERSION ${PROJECT_VERSION}
  COMPATIBILITY SameMajorVersion
)

# To make the component usable not only from the install directory but also from the build directory
export(
  TARGETS Foo
  FILE foo-export.cmake
)

install(FILES "${CMAKE_CURRENT_BINARY_DIR}/foo-config.cmake" "${CMAKE_CURRENT_BINARY_DIR}/foo-config-version.cmake"
  DESTINATION ${FOO_CONFIG_PACKAGE_LOCATION}
  COMPONENT development
)

install(EXPORT Foo
  DESTINATION ${FOO_CONFIG_PACKAGE_LOCATION}
  NAMESPACE ${PROJECT_NAME}::
  FILE foo-export.cmake
  COMPONENT development
)
于 2020-01-17T15:51:06.797 回答
0

为什么 foo-config.cmake 不应该也有关于已安装版本的信息/命令?

包脚本foo-config.cmake可以自由创建目标(不能删除),在父作用域中设置变量等等。拆分foo-config-version.cmake为在隔离范围内运行的脚本可以轻松进行包搜索,而不必担心破坏变量。可以将所有这些功能合并到一个文件中(查找模块的方式),但历史表明这种做法容易出错且冗余。

基本上,有两个优点:

  1. 隔离。运行版本脚本不会破坏find_package调用者中的变量。一旦foo-config.cmake运行,它可以设置包变量、创建目标等,完全相信用户打算执行此操作。
  2. 减少样板。可以以文件CMakePackageConfigHelpers中的两行为代价生成良好的版本脚本CMakeLists.txt。鉴于 CMake 3.19 中的新版本范围功能,这是一项受欢迎的自动化任务。
于 2021-07-01T06:19:45.233 回答