CMake
同样可以使用变量,比如当依赖文件过多或需要生成的项目繁杂,就可以使用变量统一管理,也便于以后的条件编译。
CMake
变量分为环境变量和普通变量:
环境变量: 在 CMake
进程中具有全局范围,其初始值为进程调用时的值,后面可以通过set()
和unset()
修改,但修改的值仅在当前进程有效,不影响整个系统环境。
普通变量: 通过set()
和unset()
创建和销毁,具有动态作用域。
4.1 定义变量(赋值)
CMake 定义变量分显式和隐式两种。
显式定义: 即使用 set()
等语句,可以自定义变量。
隐式定义: 是在使用其他语句时自动创建的变量,如 project
是定义项目名称的,但在定义的同时,<projectname>_BINARY_DIR
和 <projectname>_SOURCE_DIR
两个变量就被隐式定义了。
例如:
只执行下面语句:
project(test_4)
test_4_BINARY_DIR
和 test_4_SOURCE_DIR
两个变量就被隐式定义了。
set语句语法:
set(<variable> [<value>...]) // 普通变量
set(ENV{<variable>} [<value>]) // 环境变量
- 如给定变量值value,则将该值赋给该变量,如:
set(TEST test)
- 如不给定变量值value,则会销毁该变量,同
unset
,如:set(TEST)
如:
set(USER_KEY "Hello World")
# USER_KEY = "Hello World"
对于普通变量,可以为一个变量赋多值,会返回一个以;
分隔的列表:
set(USER_KEY
"Hello World"
"Hello CMake"
)
# USER_KEY = "Hello World;Hello CMake"
4.2 引用变量(取值)
使用 ${variable}
进行变量引用。在 if
等语句中,直接使用变量名而不通过 ${variable}
取值。
对于环境变量,需要使用$ENV{variable}
。
例如 CMake学习(一)中CMakeLists.txt内容:
# CMakeLists.txt
# CMake最低版本要求
cmake_minimum_required(VERSION 3.5)
# 项目名称
project(test_1)
# 生成可执行文件,test_1是可执行文件的名字,hello.c是源文件名称,如有其他源文件,可在后面添加
add_executable(test_1 hello.c)
可以修改为:
# CMakeLists.txt
# CMake最低版本要求
cmake_minimum_required(VERSION 3.5)
# 项目名称
project(test_1)
set(SOURCE hello.c)
# 生成可执行文件,test_1是可执行文件的名字,hello.c是源文件名称,如有其他源文件,可在后面添加
add_executable(test_1 ${SOURCE})
4.3 一些常用的CMAKE变量
-
PROJECT_NAME
当前项目
project()
指定的项目名称 -
CMAKE_PROJECT_NAME
顶级项目的名称。
该变量保存顶级 CMakeLists.txt 文件中指定的项目名称
project()
命令。如果顶层 CMakeLists.txt 包含多个project()
调用时,将使用顶层 CMakeLists.txt 中最近调用的一个确定CMAKE_PROJECT_NAME
包含的名称。例如,考虑以下顶级 CMakeLists.txt:cmake_minimum_required(VERSION 3.0) project(First) project(Second) add_subdirectory(sub) project(Third)
并
sub/CMakeLists.txt
具有以下内容:project(SubProj) message("CMAKE_PROJECT_NAME = ${CMAKE_PROJECT_NAME}")
最近看到的
project()
来自顶层 CMakeLists.txt 的命令将为project(Second)
,因此将打印:CMAKE_PROJECT_NAME = Second
-
CMAKE_BINARY_DIR
顶层构建树生成二进制文件的目录
-
PROJECT_BINARY_DIR / _BINARY_DIR / CMAKE_CURRENT_BINARY_DIR
当前项目生成二进制文件的目录
-
CMAKE_SOURCE_DIR
顶层构建树的目录,即工程顶层 CMakeLists.txt 目录
-
PROJECT_SOURCE_DIR / _SOURCE_DIR / CMAKE_CURRENT_SOURCE_DIR
当前项目所在的目录,即当前项目的 CMakeLists.txt 目录
-
CMAKE_VERSION
CMake版本号。它包含
<major>.<minor>.<patch>
三部分,可以通过以下三个变量分别获取:
CMAKE_MAJOR_VERSION
、CMAKE_MINOR_VERSION
、CMAKE_PATCH_VERSION
。并且可以使用以下操作符对版本号进行条件判断:
VERSION_LESS
、VERSION_GREATER
、VERSION_EQUAL
、VERSION_LESS_EQUAL
、VERSION_GREATER_EQUAL
,这里注意版本号不能与浮点数比较。 -
更多
CMake
变量见 CMake变量 。