CMake使用CMakeLists.txt进行管理程序的编译链接过程,CMakeLists.txt拥有自己的语法。
注释
# 我是一行注释 复制代码
变量
语法格式: set(<varName> <varValue>)
注意:变量也有作用域的概念,更多的细节参考官方手册
- 变量的定义和赋值
set(test "a") # test="a" 复制代码
- list变量:使用空格分割
set(test "a" "b") # test="a b" list(APPEND test "c") # test="a b c" 复制代码
- 环境变量
# 定义环境变量 set(ENV{qt} ./user/bin/qt) # 使用环境变量 message($ENV{qt}) 复制代码
- 引用变量:
${varName}
set(test1 "a") # test1="a" set(test2 ${test1}) # test2="a" set(test3 ${test1}/main.cpp) # test3="a/main.cpp" 复制代码
- 打印变量
message(${test}) 复制代码
mode可选参数: (无) = 重要消息; STATUS = 非重要消息; WARNING = CMake 警告, 会继续执行; AUTHOR_WARNING = CMake 警告 (dev), 会继续执行; SEND_ERROR = CMake 错误, 继续执行,但是会跳过生成的步骤; FATAL_ERROR = CMake 错误, 终止所有处理过程; 复制代码
- CMake内置的变量,大部分都是以
CMAKE_
开头
内置变量 | 说明 |
CMAKE_CURRENT_SOURCE_DIR | 当前处理的CMakeLists.txt所在的路径 |
CMAKE_CURRRENT_BINARY_DIR | 工程的编译目录 如果是in-source编译,等价与CMAKE_CURRENT_SOURCE_DIR 如果是out-source编译,指的是所在的外部目录 |
CMAKE_CURRENT_LIST_DIR | 当前文件夹路径 |
CMAKE_LIBRARY_OUTPUT_DIRECTORY (优先使用) LIBRARY_OUTPUT_PATH (旧版本变量) |
生成库文件的路径 |
CMAKE_RUNTIME_OUTPUT_DIRECTORY (优先使用) EXECUTABLE_OUTPUT_PATH (旧版本变量) |
生成可执行文件的路径 |
基本上掌握以上几个变量的含义,就能看懂大部分的CMake文件
流程控制
- 条件语句
if(xx) # todo else(xx) # todo endif if() # todo elseif() # todo endif 复制代码
- 循环语句
foreach(xx list) message(${xx}) endforeach() while() # todo endwhile() 复制代码
foreach例子
set(myList a b c d e) foreach(xx ${myList}) message(${xx}) endforeach() # 输出结果:a b c d e 复制代码
逻辑表达式书写例子:
set(test 100) if(test EQUAL 100) # 成立 endif 复制代码
函数、过程
function() # todo endfuntion() marco() endmarco() 复制代码
模块
CMAKE_MODULE_PATH
模块查找路径
- find_path(VAR_NAME includefile path1 path2 ...) 定义头文件目录 如果文件未找到,
VAR_NAME
会赋值为VARIABLE_NAME-NOTFOUND
- find_library同理,寻找库文件
综合运用例子
- 打印CMake的所有变量
get_cmake_property(_variableNames VARIABLES) list (SORT _variableNames) foreach (_variableName ${_variableNames}) message(STATUS "${_variableName}=${${_variableName}}") endforeach() 复制代码
所有的一切都是Command
如果你对CMake足够熟悉,其实上文中使用的set、message、list、if、foreach等都是cmake-command,CMake提供了非常多的Command,在后续会慢慢介绍。