美文网首页
CMake语法详解

CMake语法详解

作者: Epimenides | 来源:发表于2020-07-28 20:46 被阅读0次
  1. 什么是CMake?

    • 在Android Studio 2.2 及以上,构建原生库的默认工具是CMake
    • CMake是一个跨平台的构建工具,可以用简单的语句来描述所有平台的安装(编译过程)。能够输出各种各样的makefile或者project文件。CMake并不能直接构建出最终的软件,而是产生其他工具的脚本(makefile),然后再依据这个工具的构建方式使用。
    • CMake是一个比make更高级的编译配置工具,它可以根据不同的平台、不同的编译器,生成相应的makefile或者vcproj项目,从而达到跨平台的目的。Android Studio 利用CMake生成的是ninjaninja是一个小型的关注速度的构建系统。我们不需要关心ninja的脚本,知道怎么配置CMake就可以了。
    • CMake其实是一个跨平台的支持产出各种不同的构建脚本的一个工具。
  2. CMake源文件

    • CMake的源码文件可以包含命令、注释、空格和换 行
    • CMake编写的源文件以CMakeList.txt命名或者以.cmake为扩展名。
    • 可以通过add_subdirectory()命令把子目录的CMake源文件添加进来。
    • CMake源文件中所有有效的语句都是命令,可以是内置命令或者自定义的函数/宏命令。
  3. CMake基本语法

    1. 注释

      1. 单行注释:#注释内容(注释从#开始到行尾结束)
      2. 多行注释:可以使用括号来实现多行注释:#[[多行注释]]
    2. 变量声名

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

      2. 变量的引用方式:${变量名}

        • 声名变量:set(变量名 变量值)

          set(var 123)

        • 引用变量 (PS. message命令用来打印)

          message("var = ${var}")

    3. 列表(lists)

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

      2. 语法格式:

        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}")
        
      3. 列表的引用:

        ${列表名}
        
  4. CMake流程控制

    1. 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
    1. CMake布尔常量值

      类型
      true 1, ON, YES, TRUE, Y, 非0的值
      false 0,OFF, NO, FALSE, N, IGNORE, NOTFOUND, 空字符串, 以-NOTFOUND结尾的字符串
    2. Cmake中的条件命令:

      1. 语法格式:

        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})
     ```
  1. CMake中的循环命令

    1. 语法格式:

      while(表达式)
             COMMAND(ARGS..)
      endwhile(表达式)
      
      • break()命令可以跳出整个循环,continue()可以跳出当前循环
      set (a "")
      
      while(NOT a STREQUAL "xxx")
         set(a "${a}x")
         message("a = ${a}")
      endwhile() 
      
  2. CMake中的循环遍历

    1. 语法格式:

      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(循环变量)
      
  3. CMake中自定义函数命令

    1. 自定义函数命令格式:

      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中自定义宏命令

    1. 自定义宏命令格式:
    macro(<name> [arg1 [arg2 [arg3]]])
      COMMAND()
    endmacro(<name>)
    
    1. 宏命令调用格式:
    name(实参列表)
    
  4. CMake变量的作用域

    1. 函数层的变量会覆盖目录层的变量,目录层的变量会覆盖全局层的变量
    • 全局层:cache变量,在整个项目范围可见,一般在set定义变量时,指定CACHE参数就能定义为cache变量。
    • 目录层:在当前目录CMakeList.txt中定义,以及在该文件包含的其他cmake源文件中定义的变量。
    • 函数层:在命令函数中定义的变量,属于函数作用域的变量。

相关文章

  • Cmake详解

    一、Cmake语法详解 1、什么是CMake 在Android Studio 2.2及以上,构建原生库的默认工具是...

  • AndroidNDK——Cmake详解

    一、Cmake语法详解 1、什么是CMake 在Android Studio 2.2及以上,构建原生库的默认工具是...

  • CMake语法详解

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

  • CMake语法详解

    什么是CMake .在Android studio2.2及以上,构建原生库的默认工具是CMake. .CMake是...

  • Cmake语法详解

    1、什么是CMake? 在Android Studio 2.2及以上,构建原生库的默认工具是CMake。 CMak...

  • CMake语法详解

    1.注释 单行注释# 我是一行注释 多行注释#[[我是多行注释我是多行注释]] 2.变量定义与使用 在Cmake中...

  • cmake基础教程

    目录;cmake语法CMAKE_MINIMUM_REQUIREDSETMESSAGEINCLUDE_DIRECTO...

  • 十三、cmake语法

    cmake语法

  • cmake 常见命令

    cmake cmake_minimum_required命令语法:cmake_minimum_required(V...

  • 十四、编译ffmpeg

    关于cmake语法,请参考这篇文章十三、cmake语法 build_android.sh-->configure-...

网友评论

      本文标题:CMake语法详解

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