CMake 入门教程之二

大纲

前言

本文将介绍 CMake 的常用功能,包括注释、Message 等。

注释功能

注释功能的概述

  • 行注释

    • # 行注释,一直运行到行尾
  • 括号注释

    • 3.0 版本之前不支持括号注释
    • #[[ ... ]] 括号注释,在括号之间可以有多行注释内容

注释功能的使用

1
2
3
4
5
6
7
8
9
10
11
cmake_minimum_required(VERSION 3.15)

project(comment)

# 单行注释

#[[
多行注释
多行注释
多行注释
]]

Message 功能

在 CMake 中,Message 功能的本质就是日志打印,类似 Java 中的 Log4J 实现。

Message 基础功能的概述

  • 基础使用

    • message(arg1 arg2 arg3 ...)
  • 高级使用(指定日志级别)

    • message([<level>] arg1 arg2 arg3 ...)
    • --log-level=<FATAL_ERROR|SEND_ERROR|WARNING|NOTICE|STATUS|VERBOSE|DEBUG|TRACE>
    • 标准输出使用的是 stdout,标准错误输出使用的是 stderr
    • 日志级别
      • FATAL_ERROR
        • CMake 进程会停止运行和生成
        • 使用 stderr 输出日志
      • SEND_ERROR
        • CMake 进程会继续运行,但生成过程会跳过执行
        • 使用 stderr 输出日志
      • WARNING
        • 会打印代码路径和行号
        • 使用 stderr 输出日志
      • NOTICE
        • 等同于 none,也就是其效果相当于不加日志级别,比如 message("TEST NOTIC")
        • 使用 stderr 输出日志
      • STATUS
        • 项目用户可能感兴趣的信息
        • 使用 stdout 输出日志
        • 输出时会加前缀 --
        • 属于 CMake 的默认日志级别
      • VERBOSE
        • 针对项目用户的详细信息
        • 使用 stdout 输出日志
        • 输出时会加前缀 --
      • DEBUG
        • 项目本身的开发人员使用的调试信息
        • 使用 stdout 输出日志
        • 输出时会加前缀 --
      • TRACE
        • 项目非常底层实现细节的细粒度信息
        • 使用 stdout 输出日志
        • 输出时会加前缀 --

提示

  • CMake 的默认日志级别是 STATUS。
  • CMake 的日志级别从高到低分别是:FATAL_ERROR > SEND_ERROR > WARNING > NOTICE > STATUS > VERBOSE > DEBUG > TRACE。

Message 基础功能的使用

  • 基础使用
1
2
3
4
5
6
7
8
9
cmake_minimum_required(VERSION 3.15)

project(message)

message("参数1")

message("参数1" "参数2")

message("参数1" "参数2" #[[注释在 message 中]] "参数3")
  • 高级使用(指定日志级别)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
cmake_minimum_required(VERSION 3.15)

project(message)

# CMake 进程会停止运行和生成
# message(FATAL_ERROR "Test FATAL_ERROR")

# CMake 进程会继续运行,但生成过程会跳过执行
message(SEND_ERROR "TEST SEND_ERROR")

# WARNING 会打印代码路径和行号
message(WARNING "TEST WARNING")

# NOTICE 等同于 `none`,也就是其效果相当于不加日志级别,比如 message("TEST NOTIC")
message(NOTICE "TEST NOTICE")

# STATUS 输出时会加前缀 --
message(STATUS "TEST STATUS")

# VERBOSE 输出时会加前缀 --
message(VERBOSE "TEST VERBOSE")

# DEBUG 输出时会加前缀 --
message(DEBUG "TEST DEBUG")

# TRACE 输出时会加前缀 --
message(TRACE "TEST TRACE")

CMake 的默认日志级别是 STATUS,若需要输出比 STATUS 日志级别更低的日志信息(比如 VERBOSE),则需要在 CMake 执行构建或者编译的时候,通过 --log-level 参数来指定日志级别:

1
2
# 指定日志级别
cmake -S . -B build --log-level=VERBOSE

CMake 的标准输出(stdout)默认会将日志信息输出到控制台(终端),另外还可以将标准输出(stdout)重定向到指定的文件,也就是将普通日志信息输出到文件中:

1
2
# 标准输出重定向到指定文件
cmake -S . -B build --log-level=VERBOSE > output.log

CMake 的标准错误输出(stderr)默认会将日志信息输出到控制台(终端),另外还可以将标准错误输出(stderr)重定向到标准输出,也就是将错误日志信息也输出到文件中:

1
2
# 标准错误输出重定向到标准输出
cmake -S . -B build --log-level=VERBOSE > output.log 2>&1

Message 查找库日志的概述

Message Reporting Checks 查找库日志的使用说明如下:

  • 语法:message(<checkState> "message text" ...)
    • CHECK_START:开始记录将要执行检查的消息
    • CHECK_PASS:记录检查的成功结果
    • CHECK_FAIL:记录不成功的检查结果
  • 支持嵌套使用
  • 支持 STATUS 日志级别

Message 查找库日志的使用

  • 查找库日志
1
2
3
4
5
6
7
8
9
10
11
cmake_minimum_required(VERSION 3.15)

project(message)

# 开始查找库
message(CHECK_START "Find xcpp")

# 查找库的代码(暂时省略)

# 结束查找(查找失败)
message(CHECK_FAIL "Not found")

执行后输出的结果:

1
2
-- Find xcpp
-- Find xcpp - Not found
  • 嵌套查找库日志
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
cmake_minimum_required(VERSION 3.15)

project(message)

# 开始查找库
message(CHECK_START "Find xcpp")

# 查找库的代码(暂时省略)

# 开始查找库(嵌套)
message(CHECK_START "Find xlog")

# 查找库的代码(暂时省略)

# 结束查找(查找成功)
message(CHECK_PASS "Success")

# 结束查找(查找失败)
message(CHECK_FAIL "Not found")

执行后输出的结果:

1
2
3
4
-- Find xcpp
-- Find xlog
-- Find xlog - Success
-- Find xcpp - Not found
  • 嵌套查找库日志 + 显示缩进
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
cmake_minimum_required(VERSION 3.15)

project(message)

# 开始查找库
message(CHECK_START "Find xcpp")

# 查找库的代码(暂时省略)

# 设置显示缩进
set(CMAKE_MESSAGE_INDENT "-- ")

# 嵌套查找库
message(CHECK_START "Find xlog")

# 查找库的代码(暂时省略)

# 结束查找(查找成功)
message(CHECK_PASS "Success")

# 取消显示缩进
set(CMAKE_MESSAGE_INDENT "")

# 结束查找(查找失败)
message(CHECK_FAIL "Not found")

执行后输出的结果:

1
2
3
4
-- Find xcpp
-- -- Find xlog
-- -- Find xlog - Success
-- Find xcpp - Not found

变量功能

变量功能的概述

  • 变量语法

    • set(<variable> <value>)
      • set 将⼀个 CMAKE 变量设置为给定值
      • set(<variable> <value>) 将变量 <variable> 的值设置为 <value>。如果没有指定 <value>,那么这个变量就会被撤销⽽不是被设置
    • unset(<variable>)
      • unset 取消 CMAKE 变量的设置
  • 变量使用

    • 变量引用是值替换,如果未设置变量,会返回空字符串
    • 变量引用可以嵌套,并从内向外求值
    • 变量名大小写敏感
    • 引用已设置的变量:${VAR}
  • 变量与字符串

    • string(ASCII 27 Esc)
    • 直接在字符串中引用变量 ${VAR}
  • 变量让 Message 输出不同的颜色

    • \033[1;31;40m :1 - 高亮显示,31 - 前景色红色,40 - 背景色黑色
    • \033[0m:采用终端默认设置,即取消颜色设置
    • 显示方式
      • 0:终端默认设置
      • 1:高亮显示
      • 4:使用下划线
      • 5:闪烁
      • 7:反白显示
      • 8:不可见
    • 颜色
      • 参考下述颜色表
前景色背景色颜色
3040 黑色
3141 红色
3242 绿色
3343 黃色
3444 蓝色
3545 紫红色
3646 青蓝色
3747 白色

变量功能的使用

  • 基础使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
cmake_minimum_required(VERSION 3.15)

project(variable)

# 定义变量
set(VAR1 "测试变量VAR1的值")

# 引用变量
message("VAR1 = " ${VAR1})

# 在字符串中引用变量
message("VAR1 in string ${VAR1}")

# 在字符串中引用变量(使用转义符)
message("\${VAR1} = ${VAR1}")

# 取消定义变量
unset(VAR1)

# 在字符串中引用变量
message("VAR1 in string ${VAR1}")

执行后输出的结果:

1
2
3
4
VAR1 = 测试变量VAR1的值
VAR1 in string 测试变量VAR1的值
${VAR1} = 测试变量VAR1的值
VAR1 in string
  • 嵌套使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cmake_minimum_required(VERSION 3.15)

project(variable)

# 定义变量
set(VAR1 "测试变量VAR1的值")

# 引用变量
set(VAR2 "VAR1")

# 引用变量
message("VAR2 = " ${VAR2})

# 变量的嵌套引用(从内向外求值)
message("VAR2 = " ${${VAR1}})

执行后输出的结果:

1
2
VAR2 = VAR1
VAR2 = 测试变量VAR1的值
  • 让 Message 输出不同的颜色
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
cmake_minimum_required(VERSION 3.15)

project(message_color)

# 将变量 Esc 设置为 ASCII 值 27 对应的字符
string(ASCII 27 Esc)

# 定义红色
set(RED "${Esc}[1;31;41m")

# 定义蓝色
set(BLUE "${Esc}[1;34;44m")

# 定义绿色
set(GREEN "${Esc}[1;32m")

# 定义取消颜色设置
set(NORMAL "${Esc}[0m")

message("${RED}红色内容${NORMAL} 默认颜色")

message("${BLUE}蓝色内容${NORMAL} 默认颜色")

message("${GREEN}绿色内容${NORMAL} 默认颜色")

执行后输出的结果: