【问题标题】:Check if a CMake component exists检查 CMake 组件是否存在
【发布时间】:2018-03-05 11:19:59
【问题描述】:

CMake 支持表达式if(TARGET target-name) 来检查目标target-name 是否实际存在。有没有类似的东西来检查一个给定名称的 CMake component 是否存在?我找不到if(COMPONENT ...)

我的用例是我们有 CMake install-foo 目标,将目标 foo 安装到 <CMAKE_INSTALL_PREFIX>。我们还有自定义的 cmake 函数来声明 install-foo 目标所依赖的组件,当您“构建”这样的 install-foo 目标时,这不仅会安装目标本身,还会安装它所依赖的所有组件。

但我们目前无法检查目标所依赖的组件是否实际存在(安装不存在的组件只会静默失败)。因此开发者可以轻松地重命名组件,而无需更新依赖目标,从而打破安装依赖,导致部署不完整。

【问题讨论】:

  • “CMake 组件”是什么意思?一,由install 命令的COMPONENT 选项指定?还是什么?
  • @Tsyvarev 是的,完全正确。
  • 嗯,但是 CMake 组件 存在 是什么意思?在install 命令一个只是引用 某个组件,CMake 代码不定义 组件。 [这与 targets 相反,后者实际上是在 CMake 代码中定义。] 此外,组件仅在 CPack 中具有意义。您能否详细说明您的问题,为什么您需要组件检查?你想用它实现什么?
  • @Tsyvarev 完成。
  • 我不知道如何从 CMake 脚本中检查,但您可以使用 grep 脚本 cmake_install.cmake,它实际上执行安装。因为这个脚本可能会执行per-component installation,所以它应该包含所有使用的组件。

标签: cmake


【解决方案1】:

如果使用 CPACK,可以在 include(CPack) 行之后访问组件列表,如下所示:

include(CPack)

message("DEBUG: List of all components => ${CPACK_COMPONENTS_ALL}")
foreach(component ${CPACK_COMPONENTS_ALL})
    message("INFO - component ${component}")
    message("INFO - ...is part of ${CPACK_COMPONENT_${component}_GROUP}")
endforeach(component)

${CMAKE_BINARY_DIR} 中提供了由于每个组件而安装的文件列表:

install_manifest_<COMPONENT>.txt

如果组件没有要安装的文件,则相应的 install_manifest 文件将为空。

使用上述信息应该可以检查是否有僵尸组件。

【讨论】:

    猜你喜欢
    • 2012-10-15
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 2021-10-26
    • 2021-12-22
    相关资源
    最近更新 更多