【问题标题】:CMake: Is there a way to get a list of imported targets that belong to a packageCMake:有没有办法获取属于包的导入目标列表
【发布时间】:2022-01-26 03:26:02
【问题描述】:

有时我希望我能获得属于某个包的导入目标的列表。是否有一个变量来保存它们?

这样我就可以写出这样的东西了

find_package(Qt5 CONFIG REQUIRED)
message("Imported Qt5 targets: ${Qt5_IMPORTED_TARGETS}") # speculative code

根据我目前的知识,我必须依靠包的文档来为我提供所有导入目标的名称。从变量或属性中读取它们会更容易。

【问题讨论】:

  • 我不认为这是可能的,但实际上它会非常有用。好问题。
  • 好主意!我不相信目前有任何直接的方法可以做到这一点。很可能通过扫描 add_executable(...IMPORTED)add_library(...IMPORTED) 的 FindModule 文件(模块模式)和 targets.cmake 文件(配置模式)来破解某些东西。
  • 但是,您可以通过拦截对add_library 的调用来覆盖它,使用INTERFACE 保存调用并将其传递给实际的内置函数来破解它。例如。大致描述为here

标签: cmake package


【解决方案1】:

CMake 3.21 引入了目录属性IMPORTED_TARGETS,可用于获取所有导入目标的列表。当在调用find_package() 之前和之后查询它时,这可用于派生由单个find_package() 调用导入的目标列表。代码可能如下所示:

...
get_property(importTargets DIRECTORY "${CMAKE_SOURCE_DIR}" PROPERTY IMPORTED_TARGETS)

find_package(Qt5 COMPONENTS Core Widgets REQUIRED)

get_property(importTargetsAfter DIRECTORY "${CMAKE_SOURCE_DIR}" PROPERTY IMPORTED_TARGETS)
list(REMOVE_ITEM importTargetsAfter ${importTargets})

message("${importTargetsAfter}")
...

通常只打印所有导入目标的列表并从名称中猜测它们是由感兴趣的包导入的就足够了。

【讨论】:

    【解决方案2】:

    不正是你要求的,但对于Qt5,可以做到:

    cmake_minimum_required(VERSION 3.14)
    
    project(so)
    
    find_package(Qt5 COMPONENTS Core Widgets REQUIRED)
    
    get_cmake_property(_variableNames VARIABLES)
    foreach(_variableName ${_variableNames})
      if(_variableName MATCHES "^Qt5.*LIBRARIES")
          message(STATUS "${_variableName}")
          message(STATUS "\t${${_variableName}}")
      endif()
    endforeach()
    

    示例输出:

    -- Qt5Core_LIBRARIES
    --  Qt5::Core
    -- Qt5Gui_EGL_LIBRARIES
    --  Qt5::Gui_EGL
    -- Qt5Gui_LIBRARIES
    --  Qt5::Gui
    -- Qt5Gui_OPENGL_LIBRARIES
    --  Qt5::Gui_GL
    -- Qt5Widgets_LIBRARIES
    --  Qt5::Widgets
    -- Configuring done
    -- Generating done
    -- Build files have been written to: /path/to/build
    

    方法警告:需要知道组件名称。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-18
      • 1970-01-01
      • 1970-01-01
      • 2020-01-17
      • 2019-03-26
      相关资源
      最近更新 更多