CMake语法详解
2020-07-28 本文已影响0人
Epimenides
-
什么是CMake?
- 在Android Studio 2.2 及以上,构建原生库的默认工具是
CMake
。 -
CMake
是一个跨平台的构建工具,可以用简单的语句来描述所有平台的安装(编译过程)。能够输出各种各样的makefile
或者project
文件。CMake
并不能直接构建出最终的软件,而是产生其他工具的脚本(makefile
),然后再依据这个工具的构建方式使用。 -
CMake
是一个比make更高级的编译配置工具,它可以根据不同的平台、不同的编译器,生成相应的makefile
或者vcproj
项目,从而达到跨平台的目的。Android Studio
利用CMake
生成的是ninja
。ninja
是一个小型的关注速度的构建系统。我们不需要关心ninja
的脚本,知道怎么配置CMake
就可以了。 -
CMake
其实是一个跨平台的支持产出各种不同的构建脚本的一个工具。
- 在Android Studio 2.2 及以上,构建原生库的默认工具是
-
CMake源文件
-
CMake
的源码文件可以包含命令、注释、空格和换 行 - 以
CMake
编写的源文件以CMakeList.txt
命名或者以.cmake
为扩展名。 - 可以通过
add_subdirectory()
命令把子目录的CMake
源文件添加进来。 -
CMake
源文件中所有有效的语句都是命令,可以是内置命令或者自定义的函数/宏命令。
-
-
CMake基本语法
-
注释
- 单行注释:#注释内容(注释从#开始到行尾结束)
- 多行注释:可以使用括号来实现多行注释:#[[多行注释]]
-
变量声名
-
CMake中的所有变量都是
string
类型。可以使用set()
和unset()
命令来声名或者移除一个变量 -
变量的引用方式:
${变量名}
-
声名变量:set(
变量名
变量值
)set(var 123)
-
引用变量 (PS. message命令用来打印)
message("var = ${var}")
-
-
-
列表(lists)
-
列表也是字符串,可以把列表看作一个特殊的变量,这个变量有多个值。
-
语法格式:
set(列表名 值1 值2··· 值N) set(list_var 1 2 3 4 5)
或
set(列表名 "值1;值2;...;值N") set(list_var "1; 2; 3; 4; 5") message("list_var = ${list_var}")
-
列表的引用:
${列表名}
-
-
-
CMake流程控制
-
CMake
中的操作符都是大小写敏感的
类型 名称 一元 EXIST, COMMAND, DEFINED 二元 EQUAL, LESS, LESS_EQUAL, GREATER, GREATER_ EQUAL, STREQUAL, STRLESS, STRLESS_EQUAL, STRGREATER, STRGREATER_EQUAL,VERSION_EQUAL, VERSION_LESS, VERSION_LESS_EQUAL, VERSION_GREATER, VERSION_GREATER_EQUAL, MATCHES 逻辑 NOT, AND, OR -
CMake
布尔常量值类型 值 true 1, ON, YES, TRUE, Y, 非0的值 false 0,OFF, NO, FALSE, N, IGNORE, NOTFOUND, 空字符串, 以-NOTFOUND结尾的字符串 -
Cmake
中的条件命令:-
语法格式:
if (表达式) COMMAND(ARGS ...) elseif (表达式) COMMAND(ARGS...) else (表达式) COMMAND(ARGS...) endif (表达式)
-
-
- `elseif` 和 `else` 部分是可选的,也可以有多个`elseif`部分,**缩进和空格对语句解析没有影响**
```cmake
set (if_tap OFF)
set (elseif_tap ON)
if (${if_tap})
message("if")
elseif(${elseif_tap})
message("elseif")
else(${if_tap})
message("else")
endif (${if_tap})
```
-
CMake
中的循环命令-
语法格式:
while(表达式) COMMAND(ARGS..) endwhile(表达式)
-
break()
命令可以跳出整个循环,continue()
可以跳出当前循环
set (a "") while(NOT a STREQUAL "xxx") set(a "${a}x") message("a = ${a}") endwhile()
-
-
-
CMake
中的循环遍历-
语法格式:
foreach(循环变量 参数1 参数2 ··· 参数N) COMMAND(ARGS ...)
-
每次的带设置循环变量为参数
-
foreach也支持break()和continue()命令跳出循环
foreach (item 1 2 3) message("item = $ {item}") endforeach(item)
-
foreach(循环变量 RANGE total) #循环从0到total
COMMAND(ARGS ...)
endforeach(循环变量)
foreach(item RANGE 3) message("item = ${item}")
- foreach还支持对列表的循环。
foreach(循环变量 IN LISTS 列表) COMMAND(ARGS ...) endforeach(循环变量)
-
-
-
CMake
中自定义函数命令-
自定义函数命令格式:
function(<name>[arg1 [arg2 [arg3]]]) COMMAND() endfunction(<name>)
function(func a b c) message("a = ${a}") message("b = ${b}") message("c = ${c}") message("ARGC = ${ARGC}") message("ARGV = ${ARGV}") message("ARGV1 = ${ARGV1}") message("ARGV2 = ${ARGV2}") message("ARGV3 = ${ARGV3}") endfunction(func)
7.
CMake
中自定义宏命令- 自定义宏命令格式:
macro(<name> [arg1 [arg2 [arg3]]]) COMMAND() endmacro(<name>)
- 宏命令调用格式:
name(实参列表)
-
-
CMake变量的作用域
- 函数层的变量会覆盖目录层的变量,目录层的变量会覆盖全局层的变量
- 全局层:
cache
变量,在整个项目范围可见,一般在set定义变量时,指定CACHE参数就能定义为cache变量。 - 目录层:在当前目录
CMakeList.txt
中定义,以及在该文件包含的其他cmake
源文件中定义的变量。 - 函数层:在命令函数中定义的变量,属于函数作用域的变量。