"set" CMake 中的语法

"set" syntax in CMake

我正在尝试从 http://www.cmake.org/cmake-tutorial/ 学习 CMake。我不遵循 set 语法的工作原理。 例如,从本教程中,

set (EXTRA_LIBS ${EXTRA_LIBS} MathFunctions)

我能理解这里我们要将MathFunctions赋值给EXTRA_LIBS变量。 但我感到困惑的是为什么我们想要 EXTRA_LIBS ${EXTRA_LIBS}。 为什么不

set (EXTRA_LIBS MathFunctions)

此外,我用下面的代码进行测试

set (VALUE_1 "value 1")  # A
set (VALUE_2 ${VALUE_2} "value 2")  # B

message("value 1:" ${VALUE_1})
message("value 2:" ${VALUE_2})

在这种情况下,#A 和#B 都会产生相同格式的结果。

所以我的问题是#A 和#B 之间有什么区别?

So my question is what is difference between # A and # B

在第一种情况下 #A 您将 "value 1" 分配给变量 VALUE_1,但在第二种情况下您分配给变量 VALUE_2 已经存在该变量的连接值"value 2".

例如:

set (VALUE_1 "default value")
set (VALUE_2 "default value")

set (VALUE_1 "value 1")  # A
set (VALUE_2 ${VALUE_2} "value 2")  # B

message("value 1:" ${VALUE_1})
message("value 2:" ${VALUE_2})

输出:

...
value 1:value 1
value 2:default valuevalue 2
...

换句话说第二种情况就是修改已经存在的变量的方法

当您不想覆盖现有值时它会很有用,例如:

MainProject/CMakeLists.txt:

set (CXX_COMPILER_FLAG "some optimization flags")
add_subdirectory (SubProject)

MainProj/SubProject/CMakeLists.txt:

set (CXX_COMPILER_FLAG "some warning flags") #<- wrong, overwrite flags.
set (CXX_COMPILER_FLAG "${CXX_COMPILER_FLAG} some warning flags") #<- correct, safe existed flags and add new flags.
set (var_a "value a") # just like: var_a = "value a"
set (var_b ${var_b} "value b") # just like: var_b = var_b + "value b"