CMake教程4:语法简介

410 阅读1分钟

CMake使用CMakeLists.txt进行管理程序的编译链接过程,和大部分的编程语言一样,CMakeLists.txt拥有自己的语法。

注释

# 我是一行注释

变量

cmake的设置变量是借助set命令,取消变量是借助unset命令,变量没有类型的概念,所以记得在使用前进行下判断。

语法格式: set(<varName> <varValue>)

注意:变量也有作用域的概念,更多的细节参考官方手册

  • 变量的定义和赋值
set(test "a") # test="a"
  • array变量:使用空格分割
set(test "a" "b") # test="a b"
# 通过list命令,为变量追加值
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})

语法: message([<mode>] "message text" ...),mode参数实际开发中也会经常使用,而且非常有用:

STATUS = 非重要消息
WARNING = CMake 警告, 会继续执行
AUTHOR_WARNING = CMake 警告 (dev), 会继续执行
SEND_ERROR = CMake 错误, 继续执行,但是会跳过生成的步骤
FATAL_ERROR = 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(funcName arg1 arg2)
    # todo
endfuntion()

marco(marco arg1 arg2)
    # todo
endmarco()

marco和function的区别:

  • marco:将代码在当前位置展开,可以理解为字符串替换
  • function: 是真正的函数调用

综合运用例子

  • 打印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,在后续会慢慢介绍。