(三)CMake核心语法

0 阅读4分钟

变量类型详解

1.按作用域分类

一般函数变量都是我们用户自己创建的。

全局变量和目录变量这些以CMAKE_开头的,都是CMake自己自带的预设变量,例如CMAKE_VERSION标识的就是cmake的版本,CMAKE_CURRENT_SOURCE_DIR就是你将获取当前CMakeLists.txt的路径。

image.png

2.按内容类型分类

类型示例说明
字符串"hello"用引号包裹的最常用类型
列表"a;b;c"分号分隔的字符串,CMake的"数组"
路径/usr/include自动处理路径分隔符
布尔值ON/OFF建议用ON/OFF,而非TRUE/FALSE
数字42实际上也是字符串

示例:

image.png

其实虽然上面的区分了很多类型,有字符串类型,有bool类型,但其实,他们本质都是字符串类型,我们在最开始就说过,我们在理解cmake时,要用“文本替换”的思路去理解它的语法,就像下面的bool变量:

image.png

虽然我们常常用ON/OFF标识,但是你用YES,TRUE,Y这些都可以表示,cmake的本质就是文本替换,当cmake自己编译你写的代码的时候,他会将你所有想到的可能表示true的可能性都考虑进去,只要你符合他的这个判断规则,就是真值。

变量操作命令详解

1.基本操作命令

我们变量的声明,一般使用set(),变量的删除用unset()

其实大部分情况我们不需要考虑unset(),但是cmake为什么支持删除变量呢?因为cmake底层就是字符串,它是一个替换、配置型的脚本语言,既然是配置型的,那就可以有取消某个配置项这种概念,也就是删除。

2.set() - 变量的创建与修改

image.png

3.unset() - 删除变量

image.png

4.list() - 列表操作

image.png

5.变量测试与判断

image.png

6.特殊变量命令

option() - 用户选项

option变量其实就是针对bool类型的变量,做的一个支持的缓存的接口,方便大家进行设置。这类变量在cmake界面是对应显示就是一个勾选框,常用来干什么呢,举个例子,我们一个软件,可以分成三个部分,

  • 软件代码主体,一般放到src

  • 软件代码示例程序,这种一般是提供给用户二次开发用的,一般放到samples

  • 软件代码自动化单元测试,这个也是代码只不过是自动化测试代码,一般放到Test,是用来跑测试用例的

好,你你就可以搞三个option,用来对应上面的三个,并不是每个开发者在拉取代码的时候,都需要编译上面的三个,可能大部分情况下,只需要编译src就够了。所以它在编译的时候,就可以取消samples和Test,然后你写的cmake代码,要判断一下,如果这两个是off,那就不要把示例程序和自动化测试的代码加到工程构建里面了。

image.png 类似这样的框框:

image.png

configure_file() - 配置生成

image.png

7.作用域与变量传递

变量传递总结

  1. 目录(add_subdirectory) ◦ 爹 → 儿子:会复制一份过去 ◦ 儿子改 → 爹不变
  2. 函数(function) ◦ 内部变量外面看不见 ◦ 想往外传,必须加 PARENT_SCOPE
  3. 宏(macro) ◦ 没有自己的作用域,在哪调用就在哪生效
  4. 全局(CACHE/GLOBAL) ◦ 整个项目共用一个值,谁改都影响所有人

(1)目录作用域(add_subdirectory)

父 CMakeLists.txt(外层)

image.png

sub/CMakeLists.txt(子目录)

image.png 结论:子目录继承父变量,但修改互不影响。

(2)函数作用域(function)

image.png

(3)宏作用域(macro)

  • 宏定义:位置自由,只管能不能调用到
  • 宏作用域:跟宏本身无关,只看粘贴位置
  • 粘贴到顶层 → 顶层变量
  • 粘贴到函数 → 函数局部变量
  • 粘贴到子目录 → 子目录变量 image.png
  • 第一句:父目录定义 → 子目录完全可以调用
  • 第二句:必须父目录先执行,子目录后执行
  • 第三句:宏在哪调用,作用域就是哪

(4)全局 / CACHE 作用域(整个项目共用)

image.png

8.预定义变量大全

1 系统信息变量

image.png

2 项目路径变量

image.png

3 编译器与构建变量

image.png

9.推荐命名模式:

image.png

10.变量作用域管理技巧

image.png

11.条件编译与变量组合

image.png