使用CMake,如何识别目标的从属关系

使用CMake,如何识别目标的从属关系,cmake,Cmake,我有一个图书馆,可以建立多种口味。这些不同的风格(GUI/CLI和shared/static的组合)不完整且命名不一致。在修复此问题时,不再使用原始目标名称 该库作为许多其他项目的外部资源引入。为了避免让人心烦和困惑,我使用原始名称创建了“虚拟”目标,输出了有用的错误消息。我还设置了EXCLUDE\u FROM\u ALL属性,以便只有在某个地方显式使用这些虚拟目标时,才会生成这些虚拟目标 add_library(Utilities STATIC IMPORTED GLOBAL) set_tar

我有一个图书馆,可以建立多种口味。这些不同的风格(GUI/CLI和shared/static的组合)不完整且命名不一致。在修复此问题时,不再使用原始目标名称

该库作为许多其他项目的外部资源引入。为了避免让人心烦和困惑,我使用原始名称创建了“虚拟”目标,输出了有用的错误消息。我还设置了
EXCLUDE\u FROM\u 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生成器表达式,或者其他某种方式,我可以识别这个目标依赖的“祖先”目标?如果它包含在多个位置,我只关心“第一个”位置。

这是一个相当新的位置,我从未使用过它,但它可能是您正在寻找的:如果这对您不起作用,您可能需要要求用户修改其代码。例如,用于链接要使用的库而不是
target\u link\u库的宏可以链接真实名称而不是使用的名称,并打印警告。您还可以使用配置脚本来检查不推荐使用的名称,
find_package
。要求用户修改代码有点尴尬。整个目的已经是向用户标记要修改的代码部分。这个标志看起来是有可能的,但描述很简单。这需要大量的实验。