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 获取具有指定前缀的变量列表_Cmake - Fatal编程技术网

Cmake 获取具有指定前缀的变量列表

Cmake 获取具有指定前缀的变量列表,cmake,Cmake,是否有方法获取具有指定前缀的用户定义变量列表?例如: set(vars_MyVar1 something) set(vars_MyVar2 something) getListOfVarsStartingWith(vars_) SET(my_prefix_var1 "bob1") SET(my_prefix_var2 "bob2") # Get all variables GET_CMAKE_PROPERTY(vars VARIABLES) # Filter by prefix and b

是否有方法获取具有指定前缀的用户定义变量列表?例如:

set(vars_MyVar1 something)
set(vars_MyVar2 something)
getListOfVarsStartingWith(vars_)
SET(my_prefix_var1 "bob1")
SET(my_prefix_var2 "bob2")

# Get all variables
GET_CMAKE_PROPERTY(vars VARIABLES)

# Filter by prefix and build the "res" list
FOREACH(var ${vars})
    STRING(REGEX MATCH "^my_prefix" item ${var})
    IF(item)
        LIST(APPEND res ${var})
    ENDIF(item)
ENDFOREACH(var)

我不知道有什么函数可以做到这一点,但您可以通过使用
GET\u CMAKE\u属性
请求所有定义的变量,然后使用正则表达式过滤列表,轻松构建一个函数

例如:

set(vars_MyVar1 something)
set(vars_MyVar2 something)
getListOfVarsStartingWith(vars_)
SET(my_prefix_var1 "bob1")
SET(my_prefix_var2 "bob2")

# Get all variables
GET_CMAKE_PROPERTY(vars VARIABLES)

# Filter by prefix and build the "res" list
FOREACH(var ${vars})
    STRING(REGEX MATCH "^my_prefix" item ${var})
    IF(item)
        LIST(APPEND res ${var})
    ENDIF(item)
ENDFOREACH(var)

函数
getListOfVarsStartingWith
可以按以下方式编写:

function (getListOfVarsStartingWith _prefix _varResult)
    get_cmake_property(_vars VARIABLES)
    string (REGEX MATCHALL "(^|;)${_prefix}[A-Za-z0-9_]*" _matchedVars "${_vars}")
    set (${_varResult} ${_matchedVars} PARENT_SCOPE)
endfunction()
这些函数使用CMake函数
字符串(REGEX MATCHALL
计算所有匹配的变量名,无需循环。下面是一个使用示例:

set(vars_MyVar1 something)
set(vars_MyVar2 something)
getListOfVarsStartingWith("vars_" matchedVars)
foreach (_var IN LISTS matchedVars)
    message("${_var}=${${_var}}")
endforeach()
如果搜索只应返回缓存变量,请使用以下函数:

function (getListOfVarsStartingWith _prefix _varResult)
    get_cmake_property(_vars CACHE_VARIABLES)
    string (REGEX MATCHALL "(^|;)${_prefix}[A-Za-z0-9_]*" _matchedVars "${_vars}")
    set (_resultVars "")
    foreach (_variable ${_matchedVars})
        get_property(_type CACHE "${_variable}" PROPERTY TYPE)
        if (NOT "${_type}" STREQUAL "STATIC") 
            list (APPEND _resultVars "${_variable}")
        endif()
    endforeach()
    set (${_varResult} ${_resultVars} PARENT_SCOPE)
endfunction()

此函数查询
CACHE\u VARIABLES
属性,并确保不会返回类型为
STATIC
的缓存变量。

函数getListOfVarsStartingWith将做什么?将所有变量存储到单个变量中?它将创建一个变量列表,然后可以使用foreach.Hm遍历该列表,如果我在if(Item)中添加了一个“message(“Item:${Item}”)”,输出是:Item:my_prefix Item:my_prefix它不应该是my_prefix_var1和my_prefix_var2吗?我用它做的是这样的:-当我把它应用到我的真实案例中时,我注意到了(我添加了一个名为MyLibrary的库,然后有许多名为MyLibrary的变量,我想同时启用/禁用这些变量)它还捕获我没有创建的名为MyLibrary_LIB_dependens的变量。有没有办法避免这种情况?因为脚本只处理缓存变量,所以在搜索时使用
cache_variables
而不是
variables
(请参阅更新的答案)。这将返回更少的误报。这是有道理的,但它仍然会找到MyLibrary_LIB_dependens。以下是实际代码:-您的函数接近底部。我已为LIB_dependens(在这里它正在更改PTX_LIB_dependens)用灰色标记源代码树而且没有找到任何东西,所以它肯定不是我正在创建的东西。我无意中更改了该变量似乎是非常糟糕的事情?哈哈
\u LIB_dependens
变量是由CMake在内部创建的,用于跟踪库的依赖关系。因为CMake对这些缓存变量使用了一种特殊类型
STATIC
可能会将其过滤掉。请参阅更新的答案。