概念
在Android Studio 2.2以上,构建原生库的默认工具是CMake。
CMake是一个跨平台的构建工具,可以用简单的语句描述所有平台的安装(编译过程)。能够输出各种各样的makefile或者project文件。CMake并不直接构建出最终软件,而是产生其他工具的脚本(如makefile),然后再根据这个工具的构建方式使用。
CMake是一个比make更高级的编译配置工具,它可以根据不同的平台、不同的编译器,生成相应的makefile或vcproj项目,从而达到跨平台的目的。
CMake其实是个跨平台的支持产出各种不同的构建脚本的一个工具。
CMake文件
1.CMake源码文件可以包含命令、注释、空格和换行。
2.以CMake编写的源文件以CMakeLists.txt命名或以.cmake为扩展名。
3.可以通过add_subdirectory()命令将子目录的CMake源文件添加进来。
4.CMake源文件中所有有效的语句都是命令,可以是内置命令或自定义的函数/宏命令。
CMake语法
注释
#单行注释
#[[
多行注释
多行注释
]]
变量
CMake中所有变量都是string类型。
使用set()和unset()声明或移除一个变量
${变量名}
#声明变量
set(var 123)
#引用变量 message命令用来打印
message("var = ${var}")
列表
#声明列表
set(list 1 2 3 4)
set(list2 "1;2;3")
message("list=${list}")
message("list=${list2}")
#打印结果
#list=1;2;3;4
#list=1;2;3
流程控制
操作符
优先级:括号>一元>二元>逻辑

布尔常量值

条件命令
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})

循环命令
set(a " ")
while(NOT a STREQUAL "xxx")
set(a "${a}x")
message("a=${a}")
endwhile()





自定义函数
function(func a b c)
message("func a=${a} b=${b}")
#内置变量:输出参数个数
message("ARGC ${ARGC}")
#内置变量:输出参数列表
message("ARGV ${ARGV}")
#第一个参数
message("ARGV0 ${ARGV0}")
#第二个参数
message("ARGV1 ${ARGV1}")
endfunction(func)
func(1 2 3)

自定义宏命令

变量作用域
1.全局层
cache变量,在整个项目范围可见,一般在set定义变量时,指定CACHE参数就能定义为cache变量
2.目录层
在当前目录CMakeLists.txt中定义,以及在该文件包含的其他cmake源文件中定义的变量
3.函数层
在命令函数中定义的变量,属于函数作用域内的变量。
优先级
函数层覆盖目录层,目录层覆盖全局层。
在函数层用到了目录层的变量,对其进行了修改,并不会改变目录层该变量的值。
网友评论