CMake基础介绍

1. CMake组织结构

  1. 目录
    CMakeLists.txt,此文件名区分大小写
    CMake处理项目源代码时,入口点是在源码顶级目录中调用的CMakeLists.txt文件。
    该文件可能包含整个构建规范或使用add_subdirectory()命令将子目录添加到构建中。
    该命令添加的每个子目录还必须包含一个文件(CMakeLists.txt)作为该目录的入口点。
    对于每个处理其文件的源目录,CMake在构建过程中会生成一个相应的目录(默认为build目录),作为默认的工作和输出目录
  2. 脚本
    <script>.cmake
    脚本模式只运行给定CMake语言源文件中的命令,不会生成构建系统。
    它不允许CMake命令定义构建目标或操作。
  3. 模块
    <module>.cmake
    目录或脚本中的CMake代码中可以使用include()命令在包含上下文的范围内加载CMake源文件。
    项目源代码也可以提供它们自己的模块并在CMAKE_MODULE_PATH变量中指定它们的位置

2. CMake语法

CMake源文件由零个或多个命令调用组成
命令调用是一个名称,后跟用空格分割的括号括起来的参数,如add_executable(hello xxx.c)
CMake语言不区分大小写,但是参数区分大小写

2.1 命令参数的类型

  1. 括号参数
    括号参数的参数内容,是左括号[跟零个或多个=以右括号结束
    括号参数,不执行转义序列或变量引用,如下所示:

    message([=[
    			This is the first line in a bracket argument with bracket length 1.
    			No \-escape sequences or ${variable} references are evaluated.
    			This is always one argument even though it contains a ; character.
    			The text does not end on a closing bracket of length 0 like ]].
    			It does end in a closing bracket of length 1.
    			]=] [=[ddd]=])
    
  2. 带引号参数
    带引号的参数的参数内容,在双引号之间

    message("\
    			This is the first line of a quoted argument. \
    			In fact it is the only line but since it is long \
    			the source code uses line continuation.\
    			" "\nssdsd")
    
  3. 不带引号参数
    参数用 空格、分号及换行符分割不同的参数,转移字符\并不分割参数

    foreach(arg
    	NoSpace
    	Escaped\ Space
    	This;Divides;Into
    	Five Arguments
    	Escaped\;Semicolon
    	)
      message("${arg}")
    endforeach()
    

2.2 自定义变量的方式

  1. 隐式定义
    <project_name>_BINARY_DIR
    <project_name>_SOURCE_DIR
  2. 显式定义
    1. 普通变量
      set(变量名 变量值列表)
    2. 环境变量
      set(ENV{变量名} 变量值)
    3. 缓存变量
      set(变量名 变量值列表 CACHE type 描述字符串)
      type主要分为BOOLFILEPATHPATHSTRINGINTERNAL

2.3 变量引用

  1. CMake使用${变量名}进行变量的引用
  2. 对环境变量的引用$ENV{变量名}
  3. 对缓存的引用$CACHE{变量名}
  4. if语句中对除环境变量及缓存以外的变量引用时直接使用变量名即可

2.4 注释

  1. #:单行注释
  2. #[[]]:多行注释

2.5 控制结构

  1. 条件结构
    if(expression1)
    # commands ...
    elseif(expression2)
    # commands ...
    else()
    # commands ...
    endif()
    
  2. 循环结构
    1. 遍历所有

      foreach(<loop_var> <items>)
      	<command>
      endeach()
      
      set(LIST_SRC a.cpp b.cpp c.cpp)
      foreach(item ${LIST_SRC })
      	<command>
      endeach()
      
    2. 从零开始到目标结果,stop不可为负数,默认步长为1

      foreach(<loop_var> RANGE <stop>) 
      
      foreach(i RANGE 5)
      	message(STATUS "i = ${i}")
      endforeach()
      
    3. 存在起始位置和截至位置的跳动,左右都是闭区间,步长可指定,默认为1

      foreach(<loop_var> RANGE <start> <stop> [<step>])
      
      foreach(j RANGE 3 6)
      	message("j = ${j}") 
      endforeach()
      foreach(k RANGE 3 6 2)
      	message("k = ${k}") 
      endforeach()
      
    4. 多集合的并集

      foreach(loop_var IN [LISTS [<lists>] [ITEMS [<items>]]])
      
      set(A a b c)
      set(B "1 2 3")
      # ITEMS可以认为是一个匿名的集合,如A B
      foreach(i IN ITEMS A B)
      	message("i = ${i}")
      endforeach()
      # LISTS可以认为是一个有名的集合,如set(A a b c)
      foreach(i IN LISTS A B)
      	message("i = ${i}")
      endforeach()
      

2.6 命令定义

  1. macro()/endmacro()
    macro(<name> [<arg1> ...])
      <commands>
    endmacro()
    
  2. function()/endfunction()
    function(<name> [<arg1> ...])
    	<commands>
    endfunction()
    

参考

  1. foreach
  2. cmake language
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值