CMake 中的变量列表

Sli*_*red 3 cmake

有没有办法在 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由于组合爆炸,多次调用是不切实际的。

Tsy*_*rev 5

用命令METALIST简单替换后,您的带有变量的伪代码就可以工作meta_listlist。此外,您可以将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)