cmake_第二章 CMake基础语法_set(),缓存变量set(CACHE)

文章目录

  • [第二章 CMake基础语法](#第二章 CMake基础语法)
    • [2.4 cmake定义普通变量set()](#2.4 cmake定义普通变量set())
      • [2.4.1 set() 语法格式](#2.4.1 set() 语法格式)
      • [2.4.2 变量类型和作用域详解](#2.4.2 变量类型和作用域详解)
      • [2.4.3 CMake运行脚本 .cmake 文件](#2.4.3 CMake运行脚本 .cmake 文件)
      • [2.4.4 编译 .cmake脚本-- cmake -P选项](#2.4.4 编译 .cmake脚本-- cmake -P选项)
      • [2.4.5 使用-D选项定义变量](#2.4.5 使用-D选项定义变量)
      • [2.4.6 普通变量总结](#2.4.6 普通变量总结)
    • [2.5 CMake定义缓存变量set(CACHE)](#2.5 CMake定义缓存变量set(CACHE))
      • [2.5.1 缓存变量语法](#2.5.1 缓存变量语法)
      • [2.5.2 CMake变量类型](#2.5.2 CMake变量类型)
      • [2.5.3 CMake定义缓存变量](#2.5.3 CMake定义缓存变量)
      • [2.5.4 CMake引用缓存变量](#2.5.4 CMake引用缓存变量)
      • [2.5.5 探究CMakeCache.txt作用](#2.5.5 探究CMakeCache.txt作用)
      • [2.5.6 option() 命令](#2.5.6 option() 命令)

本文介绍cmake的普通变量set()和缓存变量set(CACHE)。

第二章 CMake基础语法

2.4 cmake定义普通变量set()

CMake中的变量分为普通变量和缓存变量,本节讲解普通变量。

CMake变量是 CMake 语言中的基本存储单元,变量的值是字符串类型。变量名称区分大小写,变量名称几乎可以包含任何文本,但建议使用仅由 "字母数字"加上"_"和"-"组成的名称。字母 数字 _ - 下划线和中划线。

CMake中使用set() 定义一个变量,下面开始逐步介绍set()的使用。

2.4.1 set() 语法格式

set语法格式如下:

clike 复制代码
set(<variable> <value>... [PARENT_SCOPE])
variable :		变量名,区分大小写
Value... :			变量值。如果提供多个只,多个变量之间以";"分号分隔,多个变量组成LIst列表。如果未提供值,则该变量被取消设置。
PARENT SCOPE:	作用域设置,想在函数内部或子目录中修改变量,必须使用此标记。

作用域讲解:

1 目录作用域。当处理CMakeLists.txt时,会创建一个新的作用域。当执行上一节中的add_subdirectory时会进入子目录,子目录会复制父目录当前的变量副本,所以在子目录的CMakeLists.txt中修改变量,不影响父目录的变量。

2 函数作用域。当创建一个函数时,里边的变量是局部的。

2.4.2 变量类型和作用域详解

CMake中的变量分如下几类,下面分别介绍:

1 普通变量

这是最常见的变量.

bash 复制代码
set(var "Hello World")
message("var = ${var}")
# var = Hello World

# 设置多个值,定义时,多个值之间使用空格分隔。输出时,多个值之间用分号分隔
set(multi_var "Value1" "Value2" "Value3")
message("multi_var = ${multi_var}")
# multi_var = Value1;Value2;Value3
set (multi_var_list VALUE_A VALUE_B VALUE_C)
message("multi_var_list = ${multi_var_list}")
# multi_var_list = VALUE_A;VALUE_B;VALUE_C

2 PARENT_SCOPE作用域

如果在函数内部或者在子目录中修改父级目录的变量,必须使用此参数标记。

bash 复制代码
function(set_global_var)
    set(MY_GLOBAL 67890 PARENT_SCOPE) # 修改全局变量,需要加PARENT_SCOPE
endfunction()

set(MY_GLOBAL 12345)
set_global_var()
message("Result: ${MY_GLOBAL}") 
# 输出: Result: 67890

2.4.3 CMake运行脚本 .cmake 文件

在cmake中,如果只想打印,将变量写在.cmake脚本中,直接输出脚本文件中的变量。

构建时,使用cmake -P 选项直接运行CMake语法的脚本文件,而不执行任何项目配置(Configure)或生成(Generate)步骤,并且不修改缓存。在-P选项之前,我们还可以使用-D选项定义缓存变量。

bash 复制代码
cmake [-D 变量=值 ]... -P <cmake-script-file>

测试源码:test.cmake

bash 复制代码
cmake_minimum_required(VERSION 3.22)

# 脚本文件中不能直接加 project
#project(cmakescriptTest)

# 定义变量: 变量名字区分大小写
set(a "Hello CMake!") 
message(a=${a})		
#a=Hello CMake!

# 大写变量名子, 变量名字没有加引号,变量值之间的空格被忽略
set(A Hello CMake!) # HelloCMake! 
message("A=${A}") # A=Hello;CMake!

2.4.4 编译 .cmake脚本-- cmake -P选项

-P选项用于生成cmake脚本(.cmake文件),-P选项的全称是,script,理解为处理脚本(Process script),cmake -P xxx.cmake

使用 cmake -P选项只输出,而不进行编译。

可以看到,使用cmake文件,再使用-P选项只输出,而不进行编译。

2.4.5 使用-D选项定义变量

在cmake 编译时,使用-D(define)可自定义变量,然后在cmake文件中引用该变量。-D选项放在-P选项之前,理解为先定义再使用。

bash 复制代码
cmake_minimum_required(VERSION 3.22)

# 脚本文件中不能直接加 project
#project(cmakescriptTest)

# 定义变量: 变量名字区分大小写
set(a "Hello CMake!") 
message(a=${a})     
#a=Hello CMake!

# 大写变量名子, 变量名字没有加引号,变量值之间的空格被忽略
set(A Hello CMake!) # HelloCMake! 
message("A=${A}") # A=Hello;CMake!

# 输出-D 定义的变量
message("Define=${Define}")

2.4.6 普通变量总结

可以使用set() 方法定义变量;变量命名区分大小写;cmake的变量总是字符串。

.cmake 结尾的脚本文件;

-D选项定义变量:可以在编译时,使用-D选项定义变量,然后在脚本文件中使用该变量,格式:变量名="2222"

2.5 CMake定义缓存变量set(CACHE)

上一节讲了CMake中的普通变量,本节讲CMake中的缓存变量。

CMake缓存变量(或缓存条目)用于存储CMake的一些配置或由用户在cmake-gui界面上配置的选项,如禁用启用特定的功能、指定第三方库的路径等。

CMake首次执行时会进行配置,并在构建目录中创建CMakeCache.txt缓存文件来保存这些配置的值,缓存文件存在之后,CMake后续运行将直接使用,无需每次都让用户来配置一遍,除非手动修改或清除缓存!

2.5.1 缓存变量语法

使用set命令来设置缓存变量,语法如下.可以看到比普通变量定义时,多了一个"CACHE"关键字。

cpp 复制代码
set(<variable> <value> CACHE <type> <docstring> [FORCE])

variable: 变量名
value: 默认值
type: 变量类型,如:(BOOL|FILEPATH|PATH|STRING|INTERNAL)
docstring: 变量描述,在GUI中显示。
FORCE: 可选参数,强制更新已存在的缓存值,修改时不加FORCE选项则修改无效,
<>是必选参数, [ ]可选参数。

2.5.2 CMake变量类型

BOOL 布尔值 ON/OFF,cmake-gui界面显示为一个复选框,

FILEPATH 磁盘上文件的路径,cmake-gui界面显示为一个文件对话框;

PATH 磁盘上目录的路径, cmake-gui界面显示为一个文件对话框。

STRING 字符串,cmake-gui界面显示为文本框或下拉选择(如果STRINGS缓存条目属性已设置)

INTERNAL 内部字符串,cmake-gui界面不显示任何内容。它们可用于跨运行持久存储变量。使用这种类型意味着FORCE;

2.5.3 CMake定义缓存变量

测试脚本仍然是test.cmake,在其中定义如下:

cpp 复制代码
# 定义一个缓存变量
set(MyCacheVar "2222" CACHE STRING "这是一个缓存变量")
message("MyCacheVar=${MyCacheVar}")
# 输出:MyCacheVar=2222

# 另一种访问缓存变量的方式,使用 CACHE 关键字
message("MyCacheVar=$CACHE{MyCacheVar}")
# MyCacheVar=2222

强制修改缓存变量值:下面测试中可以发现,如果不加FORCE就不能修改缓存变量的值。

cpp 复制代码
# 定义一个缓存变量
set(MyCacheVar "2222" CACHE STRING "这是一个缓存变量")
message("MyCacheVar=${MyCacheVar}")
# 输出:MyCacheVar=2222

# 另一种访问缓存变量的方式,使用 CACHE 关键字
message("MyCacheVar=$CACHE{MyCacheVar}")
# MyCacheVar=2222

# 强制修改缓存变量的值,不加FORCE
set (MyCacheVar "3333" CACHE STRING "这是一个缓存变量")
message("MyCacheVar=${MyCacheVar}")
# 输出:MyCacheVar=2222

# 强制修改缓存变量的值,加FORCE
set (MyCacheVar "4444" CACHE STRING "这是一个缓存变量" FORCE)
message("MyCacheVar=${MyCacheVar}")
# 输出:MyCacheVar=4444

2.5.4 CMake引用缓存变量

在CMakeLIsts.txt中,定义一个缓存变量,然后使用cmake-gui打开,查看缓存变量。

cpp 复制代码
cmake_minimum_required(VERSION 3.10)

project(VariableExample)

# 1 布尔类型缓存变量
set(A1 ON CACHE BOOL "复选框")
message(A1 = "$CACHE{A1}") 
# 输出 A1 = ON 
message(A1 = ${A1}) 
# 输出 A1 = ON

# # 2 文件类型缓存变量 CACHE FILEPATH 
set(A2 "E:/practice_Code/cmake/14cache" CACHE FILEPATH "文件选择对话框")
message(A2 = "$CACHE{A2}") # 输出 A2 = E:/practice_Code/cmake/14cache

# # 3 目录路径类型缓存变量 CACHE PATH
set(A3 "E:/practice_Code/cmake/14cache" CACHE PATH "目录选择对话框")
message(A3 = "$CACHE{A3}") # 输出 A3 = E:/practice_Code/cmake/14cache

# 4 字符串类型缓存变量 CACHE STRING
set(A4 "字符串1" CACHE STRING "字符串输入框")
message(A4 = "$CACHE{A4}")
 # 输出 A4 = 字符串1

set(A4 "字符串2" CACHE STRING "字符串输入框")
message(A4 = "$CACHE{A4}") 
# 输出 A4 = 字符串1

# # 5 FORCE 强制设置缓存变量
set(A4 "字符串3" CACHE STRING "字符串输入框" FORCE)
message(A4 = "$CACHE{A4}") 
# 输出 A4 = 字符串3

查看生成的缓存文件:

2.5.5 探究CMakeCache.txt作用

主要作用保存用户的配置选择和系统环境变量检测结果,一遍在后续的构建过程中重复使用,而无需每次都重新检测。

在之前,当运行 cmake -D A1=ON,这个 ON 的状态就被写入了 Cache 文件。下次只需运行 cmake ...,CMake 会自动读取 Cache 中的 A1=ON,而不需要再次输入。

CMakeCache.txt 本质上是一个简单的存储键值对的文本数据库,存储格式为 变量名:类型=值。

用户交互接口:当使用 GUI 工具(如 cmake-gui)时,界面上显示的列表正是读取自这个文件。你在界面上修改的值,点击 "Configure" 后会写回这个文件。

2.5.6 option() 命令

使用option()命令来简化布尔类型缓存变量,语法如下:

cpp 复制代码
option( <variable> <help text>[value] )

参数:

bash 复制代码
<variable>  变量的名称
<help text> 描述文本
value 		如果不提供此参数,则默认为OFF,如果variable普通变量或缓存变量已经存在,那么 此命令什么也不做。
bash 复制代码
# 6 使用option 定义 set(CACHE BOOL) 缓存变量
option(A5 "选项1" ON) 
# 等价于 : set(A5 ON CACHE BOOL "复选框")
message(A5 = "$CACHE{A5}") # 输出 A5 = ON
相关推荐
十五年专注C++开发1 天前
CMake进阶:核心命令get_filename_component 完全详解
开发语言·c++·cmake·跨平台编译
麻辣长颈鹿Sir3 天前
CMAKE指令集
linux·运维·windows·cmake·cmake指令集
lunatic74 天前
CMake 常用内置变量说明
c++·cmake
ALex_zry5 天前
CMake变量传递与宏定义技术详解:从问题到解决方案
开发语言·spring·cmake·条件编译
十五年专注C++开发7 天前
CMake进阶:vcpkg中OpenSSLConfig.cmake详解
c++·windows·cmake·openssl·跨平台编译
Source.Liu9 天前
【CMake】CMake 基础笔记
cmake
Source.Liu10 天前
【CMake】 `set_target_properties()` 命令详解
cmake
Source.Liu10 天前
【CMake】 `target_link_libraries()` 命令详解
cmake
Source.Liu11 天前
【CMake】`add_library()` 命令详解
cmake
十五年专注C++开发11 天前
CMake进阶:find_package使用总结
开发语言·c++·cmake·跨平台编译