首页 > 解决方案 > 使用 CMake,如何识别目标的依赖项

问题描述

我有一个构建为多种口味的库。这些不同的风格(GUI/CLI 和共享/静态的组合)不完整且命名不一致。在修复此问题时,不再使用原始目标名称。

该库作为许多其他项目的外部引入。为了避免让人们感到不安和让他们感到困惑,我使用输出有用错误消息的原始名称创建了“虚拟”目标。我还设置了该EXCLUDE_FROM_ALL属性,以便这些虚拟目标仅在它们在某处明确使用时才会被构建。

add_library(Utilities STATIC IMPORTED GLOBAL)
set_target_properties(Utilities PROPERTIES
    IMPORTED_LOCATION "${CMAKE_CURRENT_BUILD_DIR}/Utilities.warning"
    INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/inc"
    EXCLUDE_FROM_ALL TRUE
)
add_custom_command(OUTPUT "${CMAKE_CURRENT_BUILD_DIR}/Utilities.warning"
    COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --red "The 'Utilities' target has been replaced by 'Utilities_shared'. Please update your CMakeLists.txt."
    COMMAND ${CMAKE_COMMAND} -E false
)
add_custom_target(Utilities_fail DEPENDS "${CMAKE_CURRENT_BUILD_DIR}/Utilities.warning")
add_dependencies(Utilities Utilities_fail)

到目前为止一切顺利,一切都很好......除了当这些虚拟目标之一被击中时,我不知道它是从哪里包含的。我们的项目包括许多库,其中一些也使用这个特定的库。我想更新打印的错误消息,以确定需要更新哪些CMakeLists.txt。例如:

The 'Utilities' target has been replaced by 'Utilities_shared'. Please update the 'other_library' CMakeLists.txt.

甚至:

The 'Utilities' target has been replaced by 'Utilities_shared'. Please update /home/Me/Work/MyProject/libs/OtherLib/CMakeLists.txt.

是否有 CMake 生成器表达式或其他方式,我可以识别该目标所依赖的“祖先”目标?如果它包含在多个地方,我只真正关心“第一个”。

标签: cmake

解决方案


推荐阅读