学习构建系统
本文对构建系统相关知识的学习,阅读文章可以学习到下面内容:
●元构建系统和构建系统区别
●cmake和gn等元构建系统
●make和ninja等构建系统
构建系统介绍
make和cmake
编译一份简单的代码,只需要通过gcc等编译工具直接执行源代码就可以获取到编译结果。
例如gcc main.cpp -o test
就可以得到一个名为test的可执行文件。
随着软件工程逐渐变得复杂,一个完整的软件工程有模块划分,有静态库,有动态库,要求链接输出执行文件,通过命令式地使用编译工具已经难以完成编译目标。因此需要用构建系统来定义编译规则,而编译工具按照既定规则去执行。
GNU make和 Ninja就是这种构建系统,它们定义编译规则,这种规则文件分别通过编写makefile文件和.gn文件来表示,可以指定编译器和链接器完成编译生成目标文件。
编译器:gcc, msvc,clang和llvm等。
链接器:lld和llvm等。
在makefile文件所在目录执行make命令,就可以按其规则编译链接。
但是软件规模更大时,编写makefile文件也变得很繁琐,甚至易出纰漏。为了解决这些问题,有了类似cmake这种可以生成makefile的工具。
cmake这种就属于元构建系统,因为要用它来创建构建系统的执行文件makefile。make是构建系统,按makefile定义的规则编译构建软件。
了解了上面这些,我们可以建立起这样的认知:元构建系统生成构建文件,构建系统利用构建文件编译源代码生成目标文件。
安装
在linux系统上,使用常规的安装方法安装cmake和make包就可以了。例如,unbuntu上你可以通过下面命令安装:
1 | sudo apt-get install cmake |
一个简单的案例
CMakeList.txt 文件:
1 | cmake_minimum_required(VERSION 3.5) |
main.cpp 文件:
1 |
|
gn和ninja
上面一节我们已经提到ninja是另外一种构建系统。Ninja 是Google的一名程序员推出的注重速度的构建工具,它被认为用来取代make,按google官方说法它通过并行方式好几倍的提升编译速度。
gn是一种元构建系统,可以生成.ninja文件,实际上cmake也可以生成.ninja文件。ninja可以很好的组合gyp和CMake一起使用,后者为其生成.ninja文件。
常见构建方案:cmake+ninja构建,gn+ninja构建。
ninja项目的最终编译产出物是一个可执行文件ninja。
安装
ninja 编译需要依赖 re2c,re2c 是一款语法分析器。
1 | sudo apt install re2c |
ninja工具也可以直接命令安装
1 | sudo apt-get install ninja-build |
gn安装需要下载源码编译安装, gn的官方源码。