CMake 学习笔记 04 - 常用变量和指令
CMake 学习笔记 04 - 常用变量和指令
源代码见 https://github.com/fengyc/cmake-tutorial
常用变量
cmake 中支持变量来控制构建过程。一个变量可通过 ${变量名} 取得其值,在 IF 语句里面,直接使用变量名而不需要取值。
通过 SET 指令能显式地自定义变量,有一些指令会隐式地创建变量,如 PROJECT 指令,会同时创建 <project_name>_SOURCE_DIR 和 <project_name>_BINARY_DIR 变量。
常用的一些变量 ::
PROJECT_NAME 项目名
CMAKE_BINARY_DIR PROJECT_BINARY_DIR <project_name>_BINARY_DIR 构建目录
CMAKE_SOURCE_DIR PROJECT_SOURCE_DIR <project_name>_SOURCE_DIR 工程根目录
CMAKE_CURRENT_SOURCE_DIR 当前 CMakeLists.txt 所在的目录
CMAKE_CURRRENT_BINARY_DIR 当前 target 的构建目录
CMAKE_CURRENT_LIST_FILE 当前 CMakeLists.txt 完整路径
CMAKE_CURRENT_LIST_LINE 当前执行的行号
CMAKE_MODULE_PATH 加入 cmake 的扩展模块路径
EXECUTABLE_OUTPUT_PATH 可执行目标文件输出路径
LIBRARY_OUTPUT_PATH 库目标文件输出路径
在 cmake 中调用 shell 环境变量用 $ENV{变量名} ,通过 SET(ENV{变量名} 值) 设置。
跟系统相关的一些变量::
CMAKE_MAJOR_VERSION,CMAKE 主版本号,比如 2.4.6 中的 2
CMAKE_MINOR_VERSION,CMAKE 次版本号,比如 2.4.6 中的 4
CMAKE_PATCH_VERSION,CMAKE 补丁等级,比如 2.4.6 中的 6
CMAKE_SYSTEM,系统名称,比如 Linux-2.6.22
CMAKE_SYSTEM_NAME,不包含版本的系统名,比如 Linux
CMAKE_SYSTEM_VERSION,系统版本,比如 2.6.22
CMAKE_SYSTEM_PROCESSOR,处理器名称,比如 i686.
UNIX,在所有的类 UNIX 平台为 TRUE,包括 OS X 和 cygwin
WIN32,在所有的 win32 平台为 TRUE,包括 cygwin
常用指令
以下是常用的指令
ADD_DEFINITIONS 添加一个 define 标志
ADD_DEPENDENCIES 定义依赖关系,ADD_DEPENDENCIES(target depends-on-target;depends-on-target)
AUX_SOURCE_DIRECTORY 自动找到目录下的源文件,保存到变量 AUX_SOURCE_DIRECTORY(dir VARIABLE)
CMAKE_MINIMUM_REQUIRED cmake 最小版本依赖
EXEC_PROGRAM 执行一个命令
FILE 文件操作
INCLUDE 载入 CMakeLists.txt 或 cmake 模块,INCLUDE 后直接执行
INSTALL 安装
FIND_* 系列指令,包含 FILE LIBRARY PATH PROGRAM PACKAGE 等
MESSAGE 输出消息
IF ELSE ENDIF 分支指令
分支指令
分支指令经常用到,结构为 ::
IF(expression)
# THEN section.
COMMAND1(ARGS ...)COMMAND2(ARGS ...)
...
ELSE(expression)
# ELSE section.
COMMAND1(ARGS ...)
COMMAND2(ARGS ...)
...
ENDIF(expression)
表达式不为空、0、N、NO、OFF、FALSE、NOTFOUND 等,表达式为真。表达式可用 NOT AND OR EXISTS IS_NEWER_THAN IS_DIRECTORY MATCHES 等进行比较。
对数字进行比较时,用 LESS GREATER EQUAL 等。
对字符串比较时,用 STRLESS STRGREATER STREQUAL 等。
循环指令
cmake 中使用 WHILE 和 FOREACH 循环指令。
WHILE(condition)
COMMAND1(ARGS ...)
COMMAND2(ARGS ...)
...
ENDWHILE(condition)
FOREACH(loop_var arg1 arg2 ...)
COMMAND1(ARGS ...)
COMMAND2(ARGS ...)
...
ENDFOREACH(loop_var)
FOREACH 可与 RANGE 指令结合使用(有点像 python) ::
FOREACH(var RANGE total)
...
ENDFOREACH()
到这里,已经基本能够使用 cmake 来管理项目的构建了,更加复杂的用法需要学习 cmake 的模块写法 .cmake 文件,以及熟悉 cmake 在不同平台上的工具,像 ccmake、 cmake-qt-gui 等。
浙公网安备 33010602011771号