1. Directory
当CMake处理一个项目时,入口点是一个名为CMakeLists.txt
的源文件,这个一定是根目录下的CMakeLists.txt。这个文件包含整个工程的构建规范,当我们有多个子文件夹需要编译时,使用add_subdirectory(<dir_name>)
命令来为构建添加子目录。添加的每个子目录也必须包含一个CMakeLists.txt
文件作为该子目录的入口点。每个子目录的CMakeLists.txt文件被处理时,CMake在构建树中生成相应的目录作为默认的工作和输出目录。记住这一点非常关键,这样我们就可以使用外部构建了,而不必每次都使用蛋疼的内部构建,然后删除一堆文件才能从新构建。
2. Script
一个单独的<script>.cmake
源文件可以使用cmake命令行工具cmake -P <script>.cmake
选项来执行脚本。脚本模式只是在给定的文件中运行命令,并且不生成构建系统。它不允许CMake命令定义或执行构建目标。
3. Module
在Directory或Script中,CMake代码可以使用include()命令来加载.cmake。cmake内置了许多模块用来帮助我们构建工程,前边文章中提到的CheckFunctionExists
。也可以提供自己的模块,并在CMAKE_MODULE_PATH
变量中指定它们的位置。
cmake基本编写格式
先看一下定义的方式
名称 | 表达式 | 我认为的 | 例子 |
---|---|---|---|
space | <match '[ \t]+'> |
任意个空格或者tab | a b |
newline | <match '\n'> |
换行符 | a\nb |
line_comment | '#' <any text not starting in a bracket_argument and not containing a newline> |
以’#"开头,不在’[]'块中,不包含换行符 | #bus |
separation | space\|newline |
空格或者换行 | a b=a\nb |
lineending | linecomment?newline |
从注释开头到换行符都不执行 | |
command_invocation | space* identifier space* '(' arguments ')' |
||
quoted_argument | "quoted_element* " |
用引号包裹的参数 | “a” |
文档看起来很蛋疼,我直接写一个最简单的
add_executable(hello world.c foo.c) #这是一个注释
也等于
add_executable(hello
world.c
foo.c)
#这是一个注释
就是这么easy。注意参数这一块,可以用引号包裹起来,这代表一个参数,假如一行不能写完,则用\\
符号来表示连接成一行,也可以不用引号,但是假如参数带有分隔符,则会被认为是多个参数。
定义变量
定义变量常用的函数是set(KEY VALUE)
,取消定义变量是unset(KEY)
。 它们的值始终是string类型的,有些命令可能将字符串解释为其他类型的值。变量名是区分大小写的,可能包含任何文本,但是我们建议只使用字母数字字符加上_和-这样的名称。
变量的作用域和java基本一致,不多做讲解。
变量引用的形式为${variable_name}
,并在引用的参数或未引用的参数中进行判断。变量引用被变量的值替换,或者如果变量没有设置,则由空字符串替换。变量引用可以嵌套,并从内部进行替换,例如${outer_${