关于CMAKE系统内置的变量,可以在此查看:https://cmake.org/cmake/help/latest/manual/cmake-variables.7.html
变量是CMake语言的最基本的存储单元。变量的值始终为字符串类型,尽管一些命令将会将其理解为其他类型的值。命令set()
和unset()
用于显式地设置或重置一个变量,其他命令有可能改变变量的语义。变量名是区分大小写、可以是几乎所有的文本类型,但是我们还是建议大家命名只是用加(+)、减(-)和点划线(-.)。变量可以通过set
和unset
的选项设置不一样的范围:
如何打印一个变量?使用message函数,分为三个消息类型:FATAL_ERROR(致命错误) WARNING(警告) STATUS(正常)
message(WARNING "OpenCV requires Android SDK tools revision 14 or newer.")
通过命令Set
可一个普通、缓存和环境变量的值。语法格式:
set(<variable> <value>... [PARENT_SCOPE])
这一部分可以是零个以上的值,也就是意味着可以为空。多个参数将以分号分隔的列表形式连接,以形成要设置的实际变量值。如果值为空,那么等价于unset
访问一个值,格式${
。不太理解为什么CMake变量设置简单(不用带任何符号),使用起来复杂(美元符号+大括号包裹要使用的变量名)
CMAKE_BINARY_DIR
PROJECT_BINARY_DIR
_BINARY_DIR
顶层二进制目录(静态)CMake编译系统的二进制相关的目录其实指的都是cmake命令。你在哪里调用这个二进制cmake,其的目录就在哪里。
CMAKE_SOURCE_DIR
PROJECT_SOURCE_DIR
_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
CMAKE_CURRRENT_BINARY_DIR
CMake当前工作目录如果是 in-source 编译,它跟 CMAKE_CURRENT_SOURCE_DIR 一致,如果是 out-of-source 编译,他指的是 target 编译目录。
使用我们上面提到的 ADD_SUBDIRECTORY(src bin)可以更改这个变量的值。
使用 SET(EXECUTABLE_OUTPUT_PATH <新路径>)并不会对这个变量造成影响,它仅仅修改了最终目标文件存放的路径。
输出调用这个变量的 CMakeLists.txt 的完整路径
输出这个变量所在的行
这个变量用来定义自己的 cmake 模块所在的路径。如果你的工程比较复杂,有可能会自己编写一些 cmake 模块,这些 cmake 模块是随你的工程发布的,为了让 cmake 在处理CMakeLists.txt 时找到这些模块,你需要通过 SET 指令,将自己的 cmake 模块路径设置一下。比如SET(CMAKE_MODULE_PATH${PROJECT_SOURCE_DIR}/cmake)这时候你就可以通过 INCLUDE 指令来调用自己的模块了。
分别用来重新定义最终结果的存放目录,前面我们已经提到了这两个变量。
返回通过 PROJECT 指令定义的项目名称。
返回系统名称。Linux下是返回Linux内核版本,如Linux-5.13.0-35-generic
系统平台名称。如Linux
、FreeBSD
和Windows
系统版本号。如5.13.0-35-generic
处理器名称。如:x86_64
这个通常会被用在根据不同平台选择额外的编译选项,一个典型的应用就是使用M_PI
的值,在WINDOWS下除了需要定义cmath/math.h外还需要定义一个宏:_USE_MATH_DEFINES
IF (WIN32)
add_compile_definitions(_USE_MATH_DEFINES)
ELSEIF (APPLE)
MESSAGE(STATUS "Now is Apple systens.")
ELSEIF (UNIX)
MESSAGE(STATUS "Now is UNIX-like OS's.")
ENDIF ()
以2.8.6作为例子,2表示主版本号,8表示次版本号,6表示补丁等级
C编译器和C++编译器,也可以通过ADD_DEFINITION来指定,默认为/usr/bin/gcc
/usr/bin/c++
编译时传递给编译器的选项,如-g
头文件包含路径。默认为空,配合指令FIND_FILE和FIND_PATH使用
库文件搜索路径。默认为空,配合FIND_LIBRARY使用
定义cmake默认安装路径。不加定义则为/usr/local
默认为空。指定命令find_package
find_program
find_library
find_file
和find_path
的前缀。
默认为空。CMake为上百个软件包提供了查找器(FindXXX.cmake),使用非CMake自带的查找器需要指定目录,也就是设定CMAKE_MODULE_PATH,非自带的需要配合FIND_PACKAGE
控制构建类型。None默认,Debug带调试,Release发布版本。你可以通过命令行指定,如: cmake -DCMAKE_BUILD_TYPE=Debug
所有程序库的目标设置为共享库,如果没有设置且没有ADD_LIBRARY,默认生成静态库。
定义目标二进制文件存放位置,默认为空
定义目标链接库文件存放位置,默认为空
对于gcc编译器选项而言,
set(CXX "-CXX -Wall -pthread")
set(CMAKE_CXX_FLAGS ${CXX})
其实若只有一个参数,可以这么写:
set(CMAKE_CXX_FLAGS -pthread)
[1] https://www.cnblogs.com/xianghang123/p/3556425.html