CMake

时间:2015-07-16 09:16:51

标签: 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)

如果 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是不切实际的。

1 个答案:

答案 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})