我问这个问题是为了提醒自己下次使用CMake。它从来没有坚持过,谷歌的结果也不是很好。
在CMake中设置和使用变量的语法是什么?
这里有几个基本的例子可以让你快速上手。
设置变量:
SET(INSTALL_ETC_DIR "etc")
使用变量:
SET(INSTALL_ETC_CROND_DIR "${INSTALL_ETC_DIR}/cron.d")
SET(PROGRAM_SRCS program.c program_utils.c a_lib.c b_lib.c config.c )
add_executable(program "${PROGRAM_SRCS}")
CMake docs on variables
在编写CMake脚本时,你需要了解很多关于语法以及如何在CMake中使用变量的知识。
使用set()的字符串:
set()
set(MyString "Some Text")
set(MyStringWithVar "Some other Text: ${MyString}")
set(MyStringWithQuot "Some quote: \"${MyStringWithVar}\"")
或者使用string():
string()
string(APPEND MyStringWithContent " ${MyString}")
使用set()列出:
set(MyList "a" "b" "c")
set(MyList ${MyList} "d")
或者更好地使用list():
list()
list(APPEND MyList "a" "b" "c")
list(APPEND MyList "d")
文件名称列表:
set(MySourcesList "File.name" "File with Space.name")
list(APPEND MySourcesList "File.name" "File with Space.name")
add_excutable(MyExeTarget ${MySourcesList})
首先是“正常变量”;关于它们的范围你需要知道的事情:
CMakeLists.txt
add_subdirectory()
include()
macro()
function()
set(...)
set(... PARENT_SCOPE)
function(xyz _resultVar)
set(${_resultVar} 1 PARENT_SCOPE)
其次是“全局变量缓存”。关于缓存你需要知道的事情:
CMakeCache.txt
type
docstring
set(... CACHE INTERNAL "")
请注意,INTERNAL缓存变量类型确实包含FORCE
INTERNAL
FORCE
set(... CACHE ... FORCE)
cmake -D var:type=value
cmake -D var=value
cmake -C CMakeInitialCache.cmake
unset(... CACHE)
缓存是全局的,你可以在CMake脚本的任何地方设置它们。但是我建议你在使用缓存变量时三思(它们是全局的并且是持久化的)。我通常更喜欢用set_property(GLOBAL PROPERTY ...)和set_property(GLOBAL APPEND PROPERTY ...)语法来定义我自己的非持久化全局变量。
set_property(GLOBAL PROPERTY ...)
set_property(GLOBAL APPEND PROPERTY ...)
为了避免陷阱,你应该了解以下关于变量的知识:
find_...
set(MyVar a b c)
"a;b;c"
set(MyVar "a b c")
"a b c"
functions()
macros()
project()
enable_language()
有时只有调试变量才有帮助。以下建议可能会对你有所帮助:
message()
printf
cmake --trace ...
$ENV{...}
set(ENV{...} ...)
$<...>
${${...}}
if()
if(MyVariable)
${...}
1
ON
YES
TRUE
Y
0
OFF
NO
FALSE
N
IGNORE
NOTFOUND
-NOTFOUND
if(MSVC)
set(CMAKE_${lang}_COMPILER ...)
CMAKE_CXX_COMPILER_ID
"MSVC"
MSVC
"1"
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
if("1" STREQUAL "1")
if(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
if("MSVC" STREQUAL "1")
cmake_policy(SET CMP0054 NEW)
option()
option
set
$ENV{FOO}用于使用,其中FOO是从环境变量中提取的。否则使用${FOO},其中FOO是其他变量。对于设置,SET(FOO "foo")将在CMake中使用。
$ENV{FOO}
FOO
${FOO}
SET(FOO "foo")