Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cmake 查找包含组件的\u包配置文件_Cmake - Fatal编程技术网

Cmake 查找包含组件的\u包配置文件

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.循环所有组件并找到它们。但是如果

我有一个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)
我想要所有组件(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_目标被限制在导入的目标上。