【cmake开发(5)】cmake 设置常规变量、环境变量、内置变量;cmake 带参数编译和 -D 选项; c++源码通过-D 选项的宏定义进行条件编译
1、变量是CMake语言的最基本的存储单元。2、变量的值始终为字符串类型,尽管一些命令将会将其理解为其他类型的值。3、命令set()和unset()用于显式地设置或重置一个变量,其他命令有可能改变变量的语义。4、变量名是区分大小写、可以是几乎所有的文本类型5、变量可以通过set和unset的选项设置不一样的范围:函数范围,目录范围,永久缓存# 设置常规变量# 取消常规变量# 使用 ${} 语法进行
文章目录
在【cmake开发(3)】中,我们设置了
make install
安装目录。这就是变量控制。
一、CMake变量的定义
1、变量是CMake语言的最基本的存储单元。
2、变量的值始终为字符串类型,尽管一些命令将会将其理解为其他类型的值。
3、命令set()和unset()用于显式地设置或重置一个变量,其他命令有可能改变变量的语义。
4、变量名是区分大小写、可以是几乎所有的文本类型
5、变量可以通过set和unset的选项设置不一样的范围:函数范围,目录范围,永久缓存
1.1 定义常规变量
# 设置常规变量
set(<variable> <value> ...)
# 取消常规变量
unset(<variable>)
# 使用 ${<variable>} 语法进行引用。
${<variable>}
取消常规变量,我们可以使用 unset(PATH),也可以使用 set(PATH “”)
使用常规变量
set(PATH "/tmp" "/bin" "/lib")
message("${PATH}")
1.2 打印变量
如何打印一个变量?使用message函数,分为三个消息类型:FATAL_ERROR(致命错误) WARNING(警告) STATUS(正常)
message(WARNING "OpenCV requires Android SDK tools revision 14 or newer.")
1.3 环境变量
1、通过特殊的形式$ENV{varName}
设置,要以ENV{varName}
开头外。
set(ENV{PATH} "$ENV{PATH}:/opt/myDir")
2、 环境变量在 CMake 执行过程中具有全局范围,并且它们永远不会被缓存。
3、引用环境变量是形式为 $ENV{}。
4、 环境变量的初始化是调用进程时的初始化。我们可以使用 set() 命令设置环境变量,使用 unset() 命令取消环境变量。这些命令只影响正在运行的 CMake 进程,而不影响整个系统环境。更改环境变量的值,不会写入调用进程,也不会被后续的构建或检测进程看到。
5、在 Linux 中通过 export 命令,查看环境变量
1.4 持久缓存
什么是持久缓存的变量?
CMake 存储一组单独的 “缓存变量” 或 “缓存条目”,因为在项目构建树中的多次运行时,我们需要变量的值保持不变。
如何引用缓存的变量?
使用 $CACHE{} 或 ${} 引用缓存条目的值。
如何设置或取消缓存的变量?
一般的情况下,我们不会在源码文件中去设置或取消设置缓存的变量,我们只会引用它。
# 设置缓存条目
set(<variable> <value> ... CACHE <type> <docstring> [FORCE])
# 取消缓存条目
unset(<variable> CACHE)
为:
BOOL: 布尔 ON/OFF 值
FILEPATH: 文件的路径
PATH: 目录的路径
STRING: 目录的路径
1.5 持久缓存原理
CMakeCache.txt 文件用于存储缓存条目,第一次构建时会生成该文件,之后的构建并不会创建该文件。在引用缓存条目时,会去查找该文件,并返回值。
在使用 set() 命令时,默认情况下,如果缓存条目在 CMakeCache.txt 文件不存在,会创建缓存条目,并写入到 CMakeCache.txt 文件中。如果缓存条目在 CMakeCache.txt 文件存在,忽略 set() 命令,不会覆盖现有的缓存条目。但是我们想强制覆盖现有的缓存条目,我们可以 FORCE 选项。
set(BUILD_DEBUG "ON" CACHE STRING "Value Created by Me")
message("BUILD_DEBUG: ${BUILD_DEBUG}")
1.6 内置变量
CMAKE_SOURCE_DIR
PROJECT_SOURCE_DIR
<projectname>_SOURCE_DIR 主cmake所在路径(静态)
CMake编译系统中源CMakeLists.txt目录。需要理解的一个概念是CMake编译系统中,源文件指的是CMakeLists.txt。这个是指整个编译系统最上层的CMakeLists.txt所在的目录,有点像是Workspace目录。
CMAKE_CURRENT_SOURCE_DIR 当前正在处理的源文件目录
CMake编译树中可能包含多个CMakeLists.txt,前面我们知道顶层CMakeLists.txt由变量CMAKE_SOURCE_DIR表示,CMake编译系统会分别进入不同的CMakeLists.txt所在的目录执行cmake命令,此时进入的子目录就是CMAKE_CURRENT_SOURCE_DIR
更多解释可以查看:https://blog.csdn.net/weixin_39258979/article/details/110225829
二、 带参数编译
cmake编译参数
进入源码目录后
cmake . -LH --查看之前编译参数
ccmake . 使用cmake gui界面进行查看和编辑编译用到的参数
源码目录下 INSTALL-SOURCE 文件后面有详细说明
举例:
一般常用参数如下:
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ #安装路径
-DMYSQL_DATADIR=/usr/local/mysql/data \ #数据文件存放位置
-DCMAKE_BUILD_TYPE=:
debug, 充满了调试信息的版本,没优化,coding的时候测试用
release,一点调试信息都没有的版本,最终发布用。
relwithdebinfo(默认),优化过带有调试信息的版本,我在内测的时候用,甚至对最终发布也会用。它会有调试信息,所以只要有debugger,出了问题好查。
2.1 我们可以看到了 -D 选项,一般配合 option 命令
通过使用 cmake 工具,添加 -D 选项,通过设置变量,来改变选项。
-D 选项,语法如下:
-D <var>[:<type>]=<value>
可以忽略<type>
类型,-D 选项中,-D 与<var>
变量之间,可以有空格,但是 <var>
变量之后必须有 = 等号。
以选项变量 TEST_DEBUG 为例:
# 下面形式是相同的
cmake -DTEST_DEBUG=ON ..
cmake -D TEST_DEBUG=ON ..
# 如果我们要使用选项,一般赋值为 ON。其实选项的值只要是除 OFF 之外任意的值,都算使用了该选项,一般我们不使用这种形式
cmake -DTEST_DEBUG=ON ..
cmake -DTEST_DEBUG=123 ..
# 如果我们忽略使用选项,一般赋值为 OFF。其实赋值为空 或者 不出添加 -D 选项,都不会使用
cmake -DTEST_DEBUG=OFF ..
cmake -DTEST_DEBUG= ..
cmake ..
我们在Cmakelists 中一般使用option(<variable> "<help_text>" [value])
配合 -D。给定说明的文本 和 默认值。在阅读 CMakeLists.txt 脚本时,我们可以很好的知道有哪些可选功能。
cmake_minimum_required(VERSION 3.0.0)
project(file_system)
option(TEST_DEBUG "option for debug" ON)
message("TEST_DEBUG Value: ${TEST_DEBUG}")
if(TEST_DEBUG)
message("Select Option TEST_DEBUG")
add_definitions(-DTEST_DEBUG")
endif()
你可以 option 命令,设置选项值 [value] 为 ON 或 OFF,如果默认是使用选项变量,设置为 ON 值。
如果我们想使用 TEST_DEBUG 功能,因为默认该功能是使用,则执行 cmake …。如果不想使用该功能,则执行 cmake -DTEST_DEBUG=OFF …。
2.2 c++源码通过-D 选项的宏定义进行条件编译
test.c 源码使用 TEST_DEBUG 宏,结合 预处理器定义
和 C/C++ 条件编译
#ifdef TEST_DEBUG
...
#endif
参考
https://blog.csdn.net/weixin_39258979/article/details/110225829
https://blog.csdn.net/m0_57845572/article/details/118412228
https://blog.csdn.net/m0_57845572/article/details/118400027
更多推荐
所有评论(0)