首页 > 解决方案 > CMake 设置变量

问题描述

在下面的 CMake 代码片段中,我对 if elseif 检查感到困惑。我的理解是 BL 永远是“Ei”,所以不需要检查其他值。是否有任何情况下 BL 可以被其他东西覆盖?我是 CMake 的新手,所以在这里需要一些帮助。

set(BL "Ei" CACHE STRING "library")
set_property(CACHE BL PROPERTY STRINGS "Ei;AT;Op")
message(STATUS "The backend of choice:" ${BL})
if(BL STREQUAL "Ei")
...
elseif(BL STREQUAL "AT")
...
elseif(BL STREQUAL "Op")
...
else()
message(FATAL_ERROR "Unrecognized option:" ${BL})
endif()

标签: cmake

解决方案


该代码set(BL "Ei" CACHE STRING "library")定义了一个 CMake 缓存变量。但是,如果语句中没有FORCE选项set,这意味着如果变量先前在缓存中定义,它将不会被覆盖。

用户设置不同值的一种方法BL是在cmake命令行上。例如:cmake ../sourcedir -DBL:STRING=AT

通过在缓存中输入变量作为 type STRING(而不是 type INTERNAL),这也使变量可用于配置 incmake-gui或 in ccmake。(此外,该set_property(... STRINGS ...)指令告诉生成一个包含、和cmake-gui的下拉列表并从中进行选择。但是,对于从命令行设置变量并没有强制执行此操作,这就是为什么使用默认情况仍然是一个好主意发出错误信号。)EiATOp

有关更多信息,请参阅CMake 文档set下的“设置缓存条目”部分。


推荐阅读