CMake笔记(1)简单语法

简单语法

  • 注释
#
  • 命令格式
COMMAND(参数1 参数2 ...)
  • 分隔符
A;B;C D #用分号或者空格分割
  • 变量
set(VAR a b c) 设置变量VAR
command(${VAR}) 引用变量VAR的值,等价于command(a b c)
command("${VAR}") 等价于 command("a b c")
command("/${VAR}") 使用转义,和 a b c无关联
  • 流控制结构

IF:

IF (expression)
    COMMAND1(ARGS ...)
    COMMAND2(ARGS ...)
    ...
ELSE (expression)
    COMMAND1(ARGS ...)
    COMMAND2(ARGS ...)
    ...
ENDIF (expression) # 一定要有ENDIF与IF对应

IF (expression), 当expression不为:空,0,N,NO,OFF,FALSE,NOTFOUND或<var>_NOTFOUND这些值时为真,否则为假
IF (not exp),与上面相反
IF (var1 AND var2)
IF (var1 OR var2)
IF (COMMAND cmd) ,如果cmd确实是命令并可调用,为真
IF (EXISTS dir) IF (EXISTS file) ,如果目录或文件存在,为真
IF (file1 IS_NEWER_THAN file2),当file1比file2新,或file1/file2中有一个不存在时为真,文件名需使用全路径
IF (IS_DIRECTORY dir) ,当dir是目录时,为真
IF (DEFINED var) ,如果变量被定义,为真
IF (var MATCHES regex) ,此处var可以用var名,也可以用${var}
IF (string MATCHES regex),当给定的变量或者字符串能够匹配正则表达式regex时为真。

比如:

IF ("hello" MATCHES "ell")
    MESSAGE("true")
ENDIF ("hello" MATCHES "ell")

数字比较表达式
IF (variable LESS number)
IF (string LESS number)
IF (variable GREATER number)
IF (string GREATER number)
IF (variable EQUAL number)
IF (string EQUAL number)

按照字母表顺序进行比较
IF (variable STRLESS string)
IF (string STRLESS string)
IF (variable STRGREATER string)
IF (string STRGREATER string)
IF (variable STREQUAL string)
IF (string STREQUAL string)

一个小例子,用来判断平台差异:
IF (WIN32)
    MESSAGE(STATUS “This is windows.”)
ELSE (WIN32)
    MESSAGE(STATUS “This is not windows”)
ENDIF (WIN32)
上述代码用来控制在不同的平台进行不同的控制,但是,阅读起来却并不是那么舒服,ELSE(WIN32)之类的语句很容易引起歧义。
可以SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON)
这时候就可以写成:
IF (WIN32)
ELSE ()
ENDIF ()
配合ELSEIF使用,可能的写法是这样:
IF (WIN32)
    #do something related to WIN32
ELSEIF (UNIX)
    #do something related to UNIX
ELSEIF(APPLE)
    #do something related to APPLE
ENDIF (WIN32)

WHILE:


WHILE(condition)
    COMMAND1(ARGS ...)
    COMMAND2(ARGS ...)
    ...
ENDWHILE(condition)

其真假判断条件可以参考IF指令。

FOREACH:

FOREACH指令的使用方法有三种形式:

1.列表

语法

FOREACH(loop_var arg1 arg2 ...)
     COMMAND1(ARGS ...)
     COMMAND2(ARGS ...)
 ...
ENDFOREACH(loop_var)

示例


AUX_SOURCE_DIRECTORY(. SRC_LIST)
FOREACH(F ${SRC_LIST})
     MESSAGE(${F})
ENDFOREACH(F)

2.范围

语法

FOREACH(loop_var RANGE total)
    COMMAND1(ARGS ...)
    COMMAND2(ARGS ...)
    ...
ENDFOREACH(loop_var)

示例:

从0到total以1为步进
FOREACH(VAR RANGE 10)
   MESSAGE(${VAR})
ENDFOREACH(VAR)
输出:
012345678910

3.范围和步进

语法:

FOREACH(loop_var RANGE start stop [step])
    COMMAND1(ARGS ...)
    COMMAND2(ARGS ...)
    ...
ENDFOREACH(loop_var)

从start开始到stop结束,以step为步进,注意:直到遇到ENDFOREACH指令,整个语句块才会得到真正的执行。

FOREACH(A RANGE 5 15 3)
    MESSAGE(${A})
ENDFOREACH(A)
输出:
581114

 

猜你喜欢

转载自blog.csdn.net/weicao1990/article/details/81200047