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
可能会将其过滤掉。请参阅更新的答案。