1、什么是CMake?
- 在Android Studio 2.2及以上,构建原生库的默认工具是CMake。
- CMake是一个跨平台的构建工具,可以用简单的语句来描述所有平台的安装(编译过程)。能都输出各种各样的makefile或者project文件。CMake并不直接构建出最终的软件,而是产生其他工具的脚本(如makefile),然后在依据这个工具的构建方式使用。
- CMake是一个比make更高级的编译配置工具,它可以根据不同的平台,不同的编译器,生成相应的makefile或者vcproj项目,从而达到跨平台的目的。Android Studio利用CMake生成的是ninja。ninja是一个小型的关注速度的构建系统。我们不需要关心ninja的脚本,知道怎么配置CMake就可以了。
- CMake其实是一个跨平台的支持产出各种不同的构建脚本的一个工具。
2、CMake源文件
- CMake的源文件可以包含命令、注释、空格和换行。
- 以CMake编写的源文件以CMakelists.txt命名或以.cmake为扩展名。
- 可以通过add_subdirectory()命令把子目录的CMake源文件添加进来。
- CMake源文件中所有有效的语句都是命令,可以是内置命令或自定义的函数/宏命令。
3、CMake
注释
- 单行注释:#注释内容(注释从#开始到行尾结束)
- 多行注释:可是使用括号来实现多行注释,#[[多行注释]]
变量
- CMake中所有变量都是string类型。可以使用set()和unset()命令来声明或移除一个变量
- 变量引用:${变量名}
#声明变量:set(变量名 变量值)
set(var 123)
#引用变量 message命令用来打印
message("var = ${var}")
列表(lists)
- 列表也是字符串,可以把列表看作一个特殊的变量,这个变量有多个值。
- 语法格式:set(列表名 值1 值2 ... 值N) 或者 set(列表名 “值1;值2; ...;值N”)
- 列表引用:${列表名}
#声明列表 set(列表名 值1 值2 ··· 值N)
#或 set(列表名 "值1;值2; ··· ;值N")
set(list_var 1 2 3 4 5 6)
#或者
set(list_var1 "1;2;3;4;5;6")
message("list_var = ${list_var}")
CMake流程控制-操作符
CMake流程控制-布尔常量值
CMake流程控制-条件命令
set(if_tap OFF)
set(elseif_tap ON)
if(${if_tap})
message("if")
elseif(${elseif_tap})
message("elseif_tap")
else(${if_tap})
message("else")
endif(${if_tap})
CMake流程控制-循环命令
- break()命令可以跳出整个循环,continue()可以跳出当前循环。
set(a "")
while(NOT a STREQUAL "xxx")
set(a "${a}x")
message("a = ${a}")
endwhile()
CMake流程控制-循环遍历
- 每次迭代设置循环变量为参数。
- foreach也支持break()和continue()命令跳出循环。
foreach(item 1 2 3)
message("item = ${item}")
endforeach(item)
# 循环范围是从0到3
foreach(item RANGE 3)
message("item = ${item}")
endforeach(item)
# 循环范围是从0到7,循环增量为3。
foreach(item RANGE 0 7 3)
message("item = ${item}")
endforeach(item)
#foreach还支持对列表的循环。
set(list_var 1 2 3)
foreach(item IN LISTS list_var)
message("item = ${item}")
endforeach(item)
CMake自定义函数命令
自定义函数命令格式:
function(<name> [arg1 [arg2 [arg3···]]])
COMMAND()
endfunction(<name>)
函数命令调用格式:
name(实参列表)
function(func x y z)
message("call function func")
message("x = ${x}") #1
message("y = ${y}") # 2
message("z = ${z}") # 3
message("ARGC = ${ARGC}") #表示我们传入参数的个数 3
#ARGV表示我们传入参数的列表1;2;3
message("arg1 = ${ARGV0} arg2 = ${ARGV1} arg3 = ${ARGV2}")
message("all args = ${ARGV}")
endfunction(func)
func(1 2 3)
CMake自定义宏命令
自定义宏命令格式:
macro(<name> [arg1 [arg2 [arg3···]]])
COMMAND()
endmacro(<name>)
函数命令调用格式:
name(实参列表)
macro(ma x y z)
message("call macro ma")
message("x = ${x}")
message("y = ${y}")
message("z = ${z}")
endmacro(ma)
ma(1 2 3)
CMake变量的作用域
- 全局层:cache变量,在整个项目范围可见,一般在set定义变量时,指定CACHE参数就能定义为cache变量。
- 目录层:在当前目录CMakeLists.txt中定义,以及在该文件包含的其他cmake源文件中定义的变量。
- 函数层:在命令函数中定义的变量,属于函数作用域内的变量。
网友评论