所有的CMake项目都以一个名为CMakeLists.txt的文件开始,它应该放在源代码树的顶部。它定义了从源代码和目标到测试、打包和其他定制任务的所有构建内容。这种定义的能力,来自于CMake自己的语言。CMake语言有许多程序员熟悉的东西,比如变量、函数、宏、条件逻辑、循环、代码注释等等。这些概念和特性将在接下来的文章中介绍。
下面内容是一个简单的CMakeLists.txt文件,只包含三行,用以生成一个基本的可执行文件。
cmake_minimum_required(VERSION 3.12)
project(hello)
add_executable(hello main.cpp)
这里牵扯到CMake的第二个概念,命令。(前面说到,第一个概念是目录)
每一行都叫做CMake命令,类似于其他语言的函数调用,可以使用参数,但是不会直接返回值(有相应的技巧可以实现返回值,牵扯到变量作用域的相关概念,后面介绍)。
需要注意的是,CMake命令是不区分大小写的,所以add_executable和ADD_EXECUTABLE是一样的效果。
慎重选择CMake版本
CMake处在不断地开发进化之中,新版本可能支持更多的特性,新的工具,以及新的平台。其后向兼容性非常好,以至于新版本的软件几乎总是可以处理旧版本的CMakeLists.txt文件。但旧版本软件往往不能处理新特性,所以需要明确告知CMake应该表现的至少像哪个版本一样。
cmake_minimum_required(VERSION major.minor[.patch[.tweak]])
选择版本非常重要,以至于cmake_minimum_required()需要放在所有其他命令之前。cmake_minimum_required()命令告诉CMake项目要求的最低版本,并强制设置CMake的某些行为与指定的版本相匹配。事实上,使用cmake_policy()可以提供更精细的控制,后文再说。
需要注意的是,3.2版是提供现代CMake完整特性的最古老版本,当然越新的版本支持的特性越完善。
Project()命令
每一个项目都需要一个Project命令,且它出现在cmake_minimum_required()命令之后。其命令格式为:
project(projectName
[VERSION major[.minor[.patch[.tweak]]]]
[LANGUAGES languageName ...]
)
projectName是必须提供的,在很多地方可以用到,比如VS等IDE的解决方案名字,或者作为元信息打包使用等。
VERSION可选,且CMake3.0之后的版本才支持。定义工程的版本是个好习惯,但也没啥大用处。
LANGUAGES可选,支持C,CXX,Java,Fortran,ASM等。也可以设为NONE,此时CMake将不会配置编译器等信息,在某些情况下可能会有用,比如一个Latex项目的管理,基本用不到上述语言的相关信息。默认是C和CXX。
add_executable命令
add_executable() 告诉CMake生成一个可执行文件类型的目标。当然,CMake支持的目标有很多种,后文详述。命令的格式为:
add_executable(targetName [WIN32] [MACOSX_BUNDLE]
[EXCLUDE_FROM_ALL]
source1 [source2 ...]
)
大多都是可选项目,后面说CMake目标类型的时候,在详细介绍。
总结
到此为止,一个简单的CMake项目配置完成。前文所示的HelloWorld例子中,CMakeLists.txt文件内容如下:
cmake_minimum_required(VERSION 3.2)
project(HelloWorld)
add_executable(hello main.cpp)
main.cpp文件内容如下:
#include <iostream>
int main(int argc, char** argv){
std::cout << "Hello World" << std::endl;
return 0;
}
有兴趣的可以回去对照着倒腾一遍,也挺有意思。