# 当 expr 值为下列其中之一時,执行 command1:
# ON, 1, YES, TRUE, Y
# 当 expr 值为下列其中之一時,执行 command2:
# OFF, 0, NO, FALSE, N, NOTFOUND, *-NOTFOUND, IGNORE
if(expr)
command1(arg)
else(expr)
command2(arg)
endif(expr)
set(V alpha beta gamma)
message(${V})
foreach(i ${V})
message(${i})
endforeach()
在给出的 CMake 代码片段中,FOREACH
循环用于迭代一个范围内的数字。这个范围从 start
到 stop
,步长为 step
。
loop_var
是循环变量,代表当前迭代的数字。RANGE
是关键字,表示我们要迭代的范围。start
是范围的起始值。stop
是范围的结束值。step
是可选的,表示迭代的步长。如果没有提供 step
,那么步长默认为1。在给定的例子中:
SET(A 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17) |
|
FOREACH(A RANGE 5 15 3) |
|
MESSAGE(${A}) |
|
ENDFOREACH(A) |
这里,我们迭代变量 A
从5到15,步长为3。因此,循环会执行以下操作:
注意,SET(A 1 2 3 ... 17)
这行代码在这里并没有实际的作用,因为 A
在 FOREACH
循环中被重新定义,并且只在这个循环内部有效。循环外部的 A
的值不会改变。
总之,这个循环会按照指定的步长打印出从5到14的数字。
一元运算符:
EXISTS
: 用于检查文件或目录是否存在。COMMAND
: 用于检查指定的命令是否存在。DEFINED
: 检查变量是否已定义。二元运算符:
EQUAL
: 检查两个值是否相等。LESS
: 检查左边的值是否小于右边的值。GREATER
: 检查左边的值是否大于右边的值。STRLESS
: 字符串小于比较。STRGREATER
: 字符串大于比较。NOT(非运算符):对后面的条件进行否定。
AND(与运算符):前后两个条件都必须满足。
OR(或运算符):前后两个条件只要满足一个即可。
字符串比较是按照字典序(lexicographically order)进行的。这意味着“abc”小于“abd”,“apple”小于“banana”。
如果您想要基于变量的值进行比较,您需要确保变量已经被定义并且包含了一个字符串值。
EXISTS 判断
if(EXISTS file-name)
:这个条件判断名为 file-name
的文件是否存在。if(EXISTS directory-name)
:这个条件判断名为 directory-name
的目录是否存在。这些条件只对完整的、明确的路径有效。IS_NEWER_THAN 判断
if(file1 IS_NEWER_THAN file2)
:这个条件判断 file1
是否比 file2
新。如果 file1
的修改日期比 file2
新,或者 file1
不存在而 file2
存在,那么这个条件为真。同样,这些行为只对完整的、明确的路径有效。IS_ABSOLUTE 判断
if(IS_ABSOLUTE path)
:这个条件判断给定的 path
是否是绝对路径。在Unix系统中,绝对路径从根目录开始(例如 /usr/local/bin
),而相对路径则不是(例如 ../bin
)。在Windows系统中,绝对路径可能是 C:\Users\Username\Documents
这样的形式。这些条件在CMake的配置过程中非常有用,可以帮助您根据文件和目录的存在与否、新旧以及是否是绝对路径来执行不同的操作。
宏(Macro):
macro
和endmacro
来定义的。macro(myMacro) |
|
# 这里是宏的代码 |
|
endmacro() |
函数(Function):
function
和endfunction
来定义的。function(myFunction) |
|
# 这里是函数的代码 |
|
endfunction() |
比较:
macro(sum outvar)
# 获取所有传递给宏的参数,并将其存储在变量_args中
set(_args ${ARGN})
# 初始化结果变量为0
set(result 0)
# 遍历_args中的每一个元素(通过循环变量_var)
foreach(_var ${_args})
# 对当前的迭代值(_var)进行求和,并更新result的值
math(EXPR result "${result}+${_var}")
endforeach()
# 将求和的结果存储在变量${outvar}中
set(${outvar} ${result})
endmacro()
# 调用上面定义的sum宏,并将求和的结果存储在变量addResult中
sum(addResult 1 2 3 4 5)
# 打印出求和的结果
message("Result is :${addResult}")
macro(sum outvar)
set(_args ${ARGN})
list(LENGTH _args argLength)
if(NOT argLength LESS 4) # 限制参数个数不能超过 4
message(FATAL_ERROR "参数过多!")
endif()
set(result 0)
foreach(_var ${_args})
math(EXPR result "${result}+${_var}")
endforeach()
set(${outvar} ${result})
endmacro()
sum(addResult 1 2 3 4 5)
message("Result is :${addResult}")
# 定义一个宏
macro(macroTest)
# 在宏内部设置一个变量
set(test1 "aaa")
endmacro()
# 定义一个函数
function(funTest)
# 在函数内部设置一个变量
set(test2 "bbb")
endfunction()
# 调用宏
macroTest()
# 打印宏内部的变量
message("${test1}")
# 调用函数
funTest()
# 打印函数内部的变量(注意:在函数调用结束后,变量作用域结束,所以这里可能会得到一个未定义的变量)
message("${test2}")
macro(GetPrime output maxNum)
set(extArg ${ARGN})
if(NOT ${#extArg} EQUAL 0)
message(FATAL_ERROR "To much args!")
endif()
# 判断传入的变量是否为数字类型
if(NOT ${maxNum} MATCHES "^[0-9]+$")
message(FATAL_ERROR "maxNum must be a positive integer!")
endif()
set(result)
foreach(_var RANGE 2 ${maxNum})
set(isPrime 1)
math(EXPR upplimit ${_var}-1)
foreach(_subVar RANGE 2 ${upplimit})
math(EXPR _temp "${_var}%${_subVar}")
if(_temp EQUAL 0)
set(isPrime 0)
break()
endif()
endforeach()
if(isPrime)
list(APPEND result ${_var})
endif()
endforeach()
set(${output} ${result})
endmacro()
GetPrime(output 100)
message("${output}")