为什么 foo-config.cmake 和 foo-config-version.cmake 应该分开?

ein*_*ica 5 packaging cmake software-packaging buildconfiguration

在 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 设计的“失误”?

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

Ale*_*ing 0

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

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

基本上有两个优点:

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