Cmake就是一门脚本语言,用于生成Makefile.
在 CMakeList.txt 文件中运行一条shell命令
示例
exec_program("export LD_LIBRARY_PATH=../../third-64/protobuf/lib/ && ../../third-64/protobuf/bin/protoc --cpp_out=./c/ *.proto" ${DIR})
表示在${DIR}目录里运行字符串里的命令
该命令指明了对cmake的最低(高)版本的要求,...为低版本和高版本之间的连接符号
示例
cmake_minimum_required (VERSION 3.12.2...3.10.2)
语法
project(<PROJECT-NAME> [<language-name>...])
project命令用于指定cmake工程的名称,实际上,它还可以指定cmake工程的版本号(VERSION关键字)、简短的描述(DESCRIPTION关键字)、主页URL(HOMEPAGE_URL关键字)和编译工程使用的语言(LANGUAGES关键字)。
这个命令的有个附加功能,就是给默认变量进行赋值。如:
· PROJECT_NAME:将当前工程的名称赋值给PROJECT_NAME,对于本例子,就是${PROJECT_NAME}=mytest。
· PROJECT_SOURCE_DIR:当前工程的源码路径。
· <PROJECT-NAME>_SOURCE_DIR:指定工程的源码路径,这个变量和PROJECT_SOURCE_DIR的区别就是,<PROJECT-NAME>_SOURCE_DIR跟具体的工程名字关联起来,若<PROJECT-NAME>就是当前工程,则该变量和PROJECT_SOURCE_DIR相等。
· PROJECT_BINARY_DIR:当前工程的二进制路径。
· <PROJECT-NAME>_BINARY_DIR:指定工程的二进制路径,这个变量和PROJECT_BINARY_DIR的区别就是,<PROJECT-NAME>_BINARY_DIR跟具体的工程名字关联起来,若<PROJECT-NAME>就是当前工程,则该变量和PROJECT_BINARY_DIR相等。
· CMAKE_PROJECT_NAME:顶层工程的名称。例如当前调用的CMakeLists.txt位于顶层目录(可以理解为使用cmake命令首次调用的那个CMakeLists.txt),那么工程名还会赋值给CMAKE_PROJECT_NAME。
可以对三类变量进行赋值,分别是一般变量,缓存变量和环境变量
语法
set(<variable> <value>... [PARENT_SCOPE])
语法
set(<variable> <value>... CACHE <type> <docstring> [FORCE])
和命令行中使用 -D的形式保持一致
它是跨作用域的
如果之前设置过,则不会覆盖之前的值,除非使用FORCE
语法
set(ENV{<variable>} [<value>])
1)该命令设置的环境变量只在当前的cmake进程生效,既不会影响调用者的环境变量,也不会影响系统环境变量。(与schell环境独立)
2)如果<value>
值为空或者ENV{<variable>}
后没有参数,则该命令会清除掉当前环境变量的值。
3)<value>
后的参数会被忽略。
通常用法,CMake中的option用于控制编译流程,相当于C语言中的宏条件编译。与add_definitions配合使用。
语法
option(<variable> "<help_text>" [value])
使用场景 : 编译脚本传递参数 -> CMake脚本接收option -> 源代码宏
make 中的 message 命令就像是 C 语言中的 printf 函数,该命令可以将变量的值显示到终端。
语法
message([<mode>] "message text" ...)
mode 的值包括 FATAL_ERROR、WARNING、AUTHOR_WARNING、STATUS、VERBOSE等。我主要使用其中的 2 个——FATAL_ERROR、STATUS。
FATAL_ERROR:产生 CMake Error,会停止编译系统的构建过程;
STATUS:最常用的命令,常用于查看变量值,类似于编程语言中的 DEBUG 级别信息。
"message text"为显示在终端的内容。可以将变量(缓存变量、环境变量)值打印出来,注意需要在双引号内部。
语法
list (subcommand <list> [args...])
subcommand为具体的列表操作子命令,例如读取、查找、修改、排序这四大类。<list>为待操作的列表变量,[args...]为对列表变量操作需要使用的参数表,不同的子命令对应的参数也不一致。
list命令即对列表的一系列操作,cmake中的列表变量是用分号;分隔的一组字符串,创建列表可以使用set命令,例如:set (var a b c d)创建了一个列表 "a;b;c;d"
命令 | 格式 | 解释 | 示例 |
LENGTH | list (LENGTH <list> <output variable>) | 读取列表长度
| |
GET | list ( | 读取列表中指定索引的的元素,可以指定多个索引 从0开始编号,索引0的元素为列表中的第一个元素;索引也可以是负数, | |
JOIN | list ( | 将列表中的元素用连接字符串连接起来组成一个字符串 | |
SUBLIST | list ( | 用于获取列表中的一部分(子列表) | |
列表的查找
命令 | 格式 | 解释 | 示例 |
FIND | list ( | 查找列表是否存在指定的元素 | |
列表的修改
命令 | 格式 | 解释 | 示例 |
APPEND | list ( | 用于将元素追加到列表 | |
FILTER | list ( | 根据正则表达式包含或排除列表中的元素 | |
INSERT | list ( | 在指定位置将元素(一个或多个)插入到列表中 | |
| list ( | 将列表中最后元素移除
| |
| list ( | 将列表中第一个元素移除 | |
| list ( | 将元素插入到列表的0索引位置 | |
| list ( | 将指定的元素从列表中移除 | |
|
| 当指定的值在列表中存在重复的时候,会删除所有重复的值 |
列表的排序
命令 | 格式 | 解释 | 示例 |
| list ( | 用于将整个列表反转 | |
SORT | list ( | 对列表进行排序 | |