我是靠谱客的博主 甜美音响,最近开发中收集的这篇文章主要介绍Cmake语法详解,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、什么是CMake

在Android Studio 2.2及以上, 构建原生库的默认工具是CMake。

CMake是一个跨平台的构建工具,可以用简单的语句来描述所有平台的安装编译过程。能够输出各种各样的makefile或者project文件。CMake并不直接构建最终的软件,而是产生其他工具的脚步(如makefile),然后再依据这个工具的构建方式使用。

CMake是一个比make更高级的编译配置工具,他可以根据不同的平台、不同的编译器,生成相应的makefile或者vcproj项目,从而达到跨平台的目的。Android Studio利用CMake生成的是ninja。ninja是一个小型的关注速度的构建系统。我们不需要关系ninja的脚本,知道怎么配置CMake就可以了。

CMake其实是一个跨平台的支持产出各种不同的构建脚本的一个工具。

二、CMake源文件

CMake的源文件可以保护命令、注释、空格和换行。

以CMake编写的源文件以CMakeLists.txt命名或以.cmake为扩展名。

可以通过add_subdirectory()命令把子目录的CMake源文件添加进来。

CMake源文件中所有有效的语句都是命令,可以是内置命令或者自定义的函数/宏命令。

 

CMake注释

单行注释:#注释内容

多行注释:可以使用括号来实现多行注释:

#[[多行注释

多行注释

多行注释]]

 

CMake变量

CMake中所有的变量都是string类型。可以使用set() 和 unset() 命令来声明或者移除一个变量

变量的引用:${变量名}

#声明变量 set(变量名 变量值)

set(var 123)

#引用变量 message命令打印

message("var = ${var}")

 

CMake列表(lists)

列表也是字符串,可以把列表看做是一个特殊的变量,这个变量有多个值。

语法格式:

set(列表名 值1 值2 ... 值n)

set(列表名 “值1;值2;...值n”)

列表的引用:

${列表名}

#声明列表 set set(列表名 值1 值2 ... 值n)   或  set(列表名 “值1;值2;...值n”)

set(list_var 1 2 3 4 5)

#或者

set(list_var "1;2;3;4;5")

#打印列表

message("list_var = ${list_var}")

 

CMake流程控制-操作符

优先级 () > 一元 > 二元 > 逻辑

 

CMake流程控制-布尔常量值

 

CMake流程控制-条件命令

语法格式:

if (表达式)

    COMMAND(ARGS...)

elseif(表达式)

    COMMAND(ARGS...)

else(表达式)

    COMMAND(ARGS...)

endif(表达式)

 

elseif和else部分是可选的, 也可以使用多个elseif部分,缩进和空格对语句的解析没有影响。

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...)

endforeach(循环变量)

每次迭代设置循环遍历为参数。

foreach也支持 break() 和 continue() 命令跳出循环。

 

foreach(item 1 2 3)

    message("item = ${item}")

endforeach(item)

 

# RANGE 4  表示  0到4

foreach(item RANGE 4)

    message("item = ${item}")

endforeach(item)

 

语法格式:

foreach(循环变量 RANGE start stop step)

     COMMAND(ARGS...)

endforeach(循环变量)

循环范围 从 start 到 stop, 循环增量为step

 

# 打印 1 3 5

foreach(item RANGE 1 5 2)

    message("item = ${item}")

endforeach(item)

 

foreach支持对列表的循环

语法格式

foreach(循环遍历 IN LISTS 列表)

     COMMAND(ARGS...)

endforeach(循环变量)

 

set(list_var 1 2 3)

foreach(item IN LISTS list_var)

    message("item = ${item}")

endforeach(item)

 

CMake自定义函数命令

自定义函数命令格式:

function(<name>[arg1 [arg3 [arg3...]]])

     COMMAND(ARGS...)

endfunction(<name>)

函数命令调用格式

name(参数列表)

 

function(func x y z)

    message("call function func")

    message("x = ${x}")

    message("y = ${y}")

    message("z = ${z}")

    # ARGC 内置变量   参数个数

    message("ARGC = ${ARGC}")

    # ARGVn 内置变量   第 n 个参数,从0开始

    message("arg1 = ${ARGV0}")

    message("arg2 = ${ARGV1}")

    message("arg3 = ${ARGV2}")

     # ARGV 内置变量   参数列表

    message("all args = ${ARGV}")

endfunction(func)

 

fun(1 2 3)

 

CMake自定义宏命令

自定义宏命令格式:

macro(<name>[arg1 [arg3 [arg3...]]])

     COMMAND(ARGS...)

endmacro(<name>)

宏定义调用格式:

name(实参列表)

函数命令有自己的作用域,宏的作用域和调用者的作用域是一样的。

marco(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源文件中定义的变量。

函数层:在命令函数中定义的变量,属于函数作用域内的变量。

最后

以上就是甜美音响为你收集整理的Cmake语法详解的全部内容,希望文章能够帮你解决Cmake语法详解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部