美文网首页
Cmake语法详解

Cmake语法详解

作者: migill | 来源:发表于2019-11-20 15:30 被阅读0次
    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流程控制-操作符

    image.png

    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源文件中定义的变量。
    • 函数层:在命令函数中定义的变量,属于函数作用域内的变量。

    相关文章

      网友评论

          本文标题:Cmake语法详解

          本文链接:https://www.haomeiwen.com/subject/mhpbictx.html