有没有办法在 CMake中获得变量列表?具体来说,我想要做的是调用一个现有的函数,该函数接受多个变量并检查它们是否评估为true。
在某些情况下,其中一些变量将是空列表(计算结果为false)并且函数失败(如预期)。但有时我什至不需要这些变量,所以如果它们是空的并且函数不应该因此失败就可以了。有没有办法只在某些情况下传递一些变量?
我目前处理的代码是一个用于查找包的 CMake 模块:
include(FindPackageHandleStandardArgs)
# create empty list
list(APPEND mylib_LIBRARIES "")
# in some cases, the list contains elements
if(A)
list(APPEND mylib_LIBRARIES "foo")
endif(A)
# if the list mylib_LIBRARIES is empty, this will fail
find_package_handle_standard_args(mylib REQUIRED_VARS bar mylib_LIBRARIES)
Run Code Online (Sandbox Code Playgroud)
如果A评估为真,${mylib_LIBRARIES}则包含内容并且一切正常。否则,列表为空,内部计算结果为false,最后一行给出错误。
理想情况下,有一种方法可以创建一个元变量,其中包含我想传递给函数的变量列表。然后,我mylib_LIBRARIES只能在某些情况下添加。
伪代码:
include(FindPackageHandleStandardArgs)
# create empty list
list(APPEND mylib_LIBRARIES "")
# the bar variable is always used
meta_list(APPEND METALIST bar)
# in some cases add the used variable mylib_LIBRARIES to the METALIST
if(A)
list(APPEND mylib_LIBRARIES "foo")
meta_list(APPEND METALIST mylib_LIBRARIES)
endif(A)
# METALIST will contain exactly the variables that need evaluation
find_package_handle_standard_args(mylib REQUIRED_VARS ${METALIST})
Run Code Online (Sandbox Code Playgroud)
注意:find_package_handle_standard_args由于组合爆炸,多次调用是不切实际的。
用命令METALIST简单替换后,您的带有变量的伪代码就可以工作meta_list了list。此外,您可以将A相关变量 ("foo") 与其他变量 ("bar")分隔开。
顺便说一句,最好使用set(). 这将防止与外部范围内的名称发生意外冲突。
include(FindPackageHandleStandardArgs)
# List of variables dependent from 'A' condition.
set(A_VARS "")
if(A)
set(mylib_LIBRARIES "foo") # Other libraries can be added via list()
list(APPEND A_VARS mylib_LIBRARIES)
endif(A)
find_package_handle_standard_args(mylib REQUIRED_VARS bar ${A_VARS})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14430 次 |
| 最近记录: |