Cmake 查找包含组件的\u包配置文件
我有一个cmake软件包,带有支持组件的配置文件,例如Cmake 查找包含组件的\u包配置文件,cmake,Cmake,我有一个cmake软件包,带有支持组件的配置文件,例如 find_package(myPack REQUIRED COMPONENTS foo bar) 在myPackConfig.cmake中,我通常这样做 foreach(comp ${myPack_FIND_COMPONENTS}) if(TARGET myPack::${comp}) find_package(${comp}) endif() endif() i、 e.循环所有组件并找到它们。但是如果
find_package(myPack REQUIRED COMPONENTS foo bar)
在myPackConfig.cmake中,我通常这样做
foreach(comp ${myPack_FIND_COMPONENTS})
if(TARGET myPack::${comp})
find_package(${comp})
endif()
endif()
i、 e.循环所有组件并找到它们。但是如果没有给出任何组件,是否可以包含所有组件?例如在做某事时
find_package(myPack)
我想要所有组件(foo、bar、baz等)
谢谢一般来说,您需要遍历所有目标的列表,并找到与给定模式匹配的目标(
myPack::*
)
CMake有属性。。。但它只列出了未导入的目标,因此不适合
获取已创建“对象”列表的常见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中建议了这种方法)。检查是否没有为
find_package()
调用提供任何组件,或者查找与myPack::*
匹配的所有目标是否有问题?要查找与您刚才所说的匹配的所有有效目标,一种方法是添加一个没有名称空间的MyPack库,然后glob所有componentConfig.cmake文件,这可能会起作用。。。也许这是可行的,但也有点不妥。奇怪的是,它并不更受支持。实际上,您想要的(自动生成组件列表)是某种“黑客”。更自然的方法是手动创建完整的组件列表:CMake对您的案例中“组件”的含义一无所知。但所有目标的清单似乎是CMake能够提供的。不确定为什么BUILDSYSTEM_目标被限制在导入的目标上。