gpt4 book ai didi

cmake - find_package 包含组件的配置文件

转载 作者:行者123 更新时间:2023-12-04 02:05:12 26 4
gpt4 key购买 nike

我有一个带有配置文件支持组件的 cmake 包,例如

find_package(myPack REQUIRED COMPONENTS foo bar)

在 myPackConfig.cmake 中我通常这样做

foreach(comp ${myPack_FIND_COMPONENTS})
if(TARGET myPack::${comp})
find_package(${comp})
endif()
endif()

即循环所有组件并找到它们。但是,如果没有给出,是否可以包括所有组件?例如。做的时候

find_package(myPack)

我想要所有组件(foo、bar、baz 等)

谢谢

最佳答案

通常,您需要遍历所有目标的列表,并找到与给定模式 (myPack::*) 匹配的目标。

CMake 具有属性 BUILDSYSTEM_TARGETS ...但它仅列出非IMPORTED 目标,因此不适合。

获取已创建“对象”列表的常见 CMake 模式是拦截创建此类对象的命令,并强制它们将对象添加到列表中。这种方法适用于收集目标列表:

myPackConfig.cmake:

# ... Somewhere at the beginnning, before including other files.
set(targets_list) # It will be maintained as a list of targets created
# Replace `add_library()` call
function (add_library name)
# Add library target name to the list
list(APPEND targets_list ${name})
# And perform original actions
_add_library (${name} ${ARGN})
endfunction (add_library)

# Include `*.cmake` files created by CMake.
...

# After all 'include()'s iterate over targets list and collect needed ones.
set(all_component_targets)
foreach(t ${targets_list})
if(t MATCHES "myPack::.*")
list(APPEND all_component_targets ${t})
endif()
endforeach()

# Now 'all_component_targets' contains all targets prefixed with "myPack::".

(该方法已在 CMake mailing list 中提出)。

关于cmake - find_package 包含组件的配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44047551/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com