1. CMake组织结构
- 目录
CMakeLists.txt
,此文件名区分大小写
CMake
处理项目源代码时,入口点是在源码顶级目录中调用的CMakeLists.txt
文件。
该文件可能包含整个构建规范或使用add_subdirectory()
命令将子目录添加到构建中。
该命令添加的每个子目录还必须包含一个文件(CMakeLists.txt
)作为该目录的入口点。
对于每个处理其文件的源目录,CMake
在构建过程中会生成一个相应的目录(默认为build
目录),作为默认的工作和输出目录 - 脚本
<script>.cmake
脚本模式只运行给定CMake语言源文件中的命令,不会生成构建系统。
它不允许CMake命令定义构建目标或操作。 - 模块
<module>.cmake
目录或脚本中的CMake代码中可以使用include()命令在包含上下文的范围内加载CMake源文件。
项目源代码也可以提供它们自己的模块并在CMAKE_MODULE_PATH变量中指定它们的位置
2. CMake语法
CMake源文件由零个或多个命令调用组成
命令调用是一个名称,后跟用空格分割的括号括起来的参数,如add_executable(hello xxx.c)
CMake语言不区分大小写,但是参数区分大小写
2.1 命令参数的类型
-
括号参数
括号参数的参数内容,是左括号[
跟零个或多个=
以右括号结束
括号参数,不执行转义序列或变量引用,如下所示:message([=[ This is the first line in a bracket argument with bracket length 1. No \-escape sequences or ${variable} references are evaluated. This is always one argument even though it contains a ; character. The text does not end on a closing bracket of length 0 like ]]. It does end in a closing bracket of length 1. ]=] [=[ddd]=])
-
带引号参数
带引号的参数的参数内容,在双引号之间message("\ This is the first line of a quoted argument. \ In fact it is the only line but since it is long \ the source code uses line continuation.\ " "\nssdsd")
-
不带引号参数
参数用 空格、分号及换行符分割不同的参数,转移字符\
并不分割参数foreach(arg NoSpace Escaped\ Space This;Divides;Into Five Arguments Escaped\;Semicolon ) message("${arg}") endforeach()
2.2 自定义变量的方式
- 隐式定义
<project_name>_BINARY_DIR
<project_name>_SOURCE_DIR
- 显式定义
- 普通变量
set(变量名 变量值列表)
- 环境变量
set(ENV{变量名} 变量值)
- 缓存变量
set(变量名 变量值列表 CACHE type 描述字符串)
type
主要分为BOOL
、FILEPATH
、PATH
、STRING
、INTERNAL
- 普通变量
2.3 变量引用
CMake
使用${变量名}
进行变量的引用- 对环境变量的引用
$ENV{变量名}
- 对缓存的引用
$CACHE{变量名}
- 在
if
语句中对除环境变量及缓存以外的变量引用时直接使用变量名即可
2.4 注释
#
:单行注释#[[]]
:多行注释
2.5 控制结构
- 条件结构
if(expression1) # commands ... elseif(expression2) # commands ... else() # commands ... endif()
- 循环结构
-
遍历所有
foreach(<loop_var> <items>) <command> endeach()
set(LIST_SRC a.cpp b.cpp c.cpp) foreach(item ${LIST_SRC }) <command> endeach()
-
从零开始到目标结果,stop不可为负数,默认步长为1
foreach(<loop_var> RANGE <stop>)
foreach(i RANGE 5) message(STATUS "i = ${i}") endforeach()
-
存在起始位置和截至位置的跳动,左右都是闭区间,步长可指定,默认为1
foreach(<loop_var> RANGE <start> <stop> [<step>])
foreach(j RANGE 3 6) message("j = ${j}") endforeach() foreach(k RANGE 3 6 2) message("k = ${k}") endforeach()
-
多集合的并集
foreach(loop_var IN [LISTS [<lists>] [ITEMS [<items>]]])
set(A a b c) set(B "1 2 3") # ITEMS可以认为是一个匿名的集合,如A B foreach(i IN ITEMS A B) message("i = ${i}") endforeach() # LISTS可以认为是一个有名的集合,如set(A a b c) foreach(i IN LISTS A B) message("i = ${i}") endforeach()
-
2.6 命令定义
macro()/endmacro()
macro(<name> [<arg1> ...]) <commands> endmacro()
function()/endfunction()
function(<name> [<arg1> ...]) <commands> endfunction()