有没有办法在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)
如果 A
评估为true,则${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})
注意:由于组合爆炸,多次调用find_package_handle_standard_args
是不切实际的。
答案 0 :(得分:2)
带有METALIST
变量的伪代码在使用meta_list
命令进行简单替换list
后变为有效。此外,您可以从其他变量(" bar")中划分A
相关变量(" foo")。
顺便说一下,最好使用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})