在本篇博客中,我想介绍七大顶尖的开源 C++ 构建系统。当然,我们并不是简单排名列举,而是要细加分析这些顶级开源 C++ 构建系统是什么,又是为什么能成为顶尖系统。
“别告诉我月光很明亮,让我看到那碎玻璃上闪烁的光”。——安东·契诃夫
我当然成为不了契诃夫,但要赏‘月光’,先从‘玻璃’开始。?
1. Make
Make 无处不在。但这也不难理解,Make 创建于1977 年,在计算机行业的影响深远。Make 广泛适用于所有类 Unix 系统、Macintosh 系统,以及 Windows 的所有版本中,可通过 Cygwin 或本地 nmake 执行。Make 使用简单的文本文件 makefiles 来指导构建。makefile 包含如下规则:
shownottell: show.c tell.c
gcc –o shownottell show.c tell.c
规则包含 Target(目标)和 Recipe(命令)。Target 是文件名,在上面的例子中是 shownottell。分号分隔的是 Prerequisites(依赖文件)。Recipe 行由 shell 命令组成,需要以 Tab 键开始。执行这些shell 命令更新目标,我们要做两件事:
- Target 是否需要更新?即 Prerequisites 是否需要更改;
- 如果是,如何更新 Target ?即是否需要运行 Recipe。
这就是 Make 的规则。对于简单的项目,Make 构建系统易于实现和维护。随着项目的发展,makefile 会变得非常复杂。尽管年代久远,Make 仍然是构建软件最常用的工具。
2.现代 CMake
现代 CMake 是 Make 的真正继任者。在之前的一系列文章中,我一直在谈论CMake。相关链接如下:
为什么说现代 CMake 是 Make 的继承者?事实胜于雄辩,我把悬念留到CMake 的博客中,大家可以自行研究。但是,我相信,许多新的开源 C++ 项目要么已经在使用,要么正准备使用 CMake 了。点击链接了解 CMake 开源项目。
3. Ninja
一个产品的存在必须有一个独特的卖点(USP)。Ninja 的独特卖点(USP)是对速度的执著。本着“事实为先”的精神,我们先看图:
Ninja 是一个小型的开源构建系统,其输入文件由更高级别的构建系统(比如CMake)生成,Ninja 的设计专注速度,高速运行构建。在 Visual Studio 2019 中,可以使用 CMake 和 Ninja 直接构建 Linux 项目。点击链接了解 Ninja 开源项目。
4. SCons
在著作《软件构建系统:原则和经验》中,Peter Smith 深入观察了 SCons,引用他的原话:
“如果你正在编写一个新的 C/C++ 软件构建系统,建议首选 SCons 或CMake。”
这句话的原文是与 GNU Make(了解更多 GNU Make 的信息)进行比较。但是可以清楚地看到,SCons 是 CMake 强有力的竞争对手。SCons 作为一个升级的跨平台开源构建,足以替代经典的 Make。SCons 的配置文件是用 Python 编写的,Python 也是 SCons 的独特卖点(USP),主张使用真正的编程语言来解决构建问题。当前版本的 SCons 需要 Python 版本 3.5 才能运行。点击链接了解 SCons 开源项目。
5. Meson
科技不断发展——我们正在进入粒子物理学时代。? 玩笑归玩笑,Meson 是一个开源的构建系统,速度快,易使用。正如大自然无法忍受真空环境一样,Meson 也无法忍受:
- 开发人员在编写、调试构建定义上浪费太多时间;
- 为构建系统开启编译浪费太多时间
Meson 没有使用图灵完备语言(Turing Complete language)编写构架定义。相反,Meson 采用了一种特定语言(DSL),便于使用、非图灵完备,并将成为其独特卖点。Meson 支持多种语言,包括 C、C++ 和 RIST,能跨平台进行开源构建。Meson 的默认构建生成器为 Ninja。点击链接了解 Meson 开源项目。
6. MSBuild
Microsoft Build Engine(MSBuild)是用于生成应用程序的平台。不过,这篇博客不是关于七大开源 C++ 构建系统的吗?MSBuild 开源吗?话不多说,先看图:
是的,在 2015 年底,微软决定对 MSBuild 开源软件开发流程。其第一个版本于 2017 年 3 月 7 日发布,并与 Visual Studio 2017 一起打包发行。MSBuild 现在是一个真正的跨平台应用程序,可在支持 .NET Core 的类 Unix 系统上运行。点击链接了解 MSBuild 开源项目。
相关阅读: 什么是 MSBuild
7. Waf
尽管可能很多人都没有听说过 Waf 构建工具,但 Incredibuild 早已抢先集成。Waf 是 Python 开源构建工具,支持多种编程语言,如 C、C++、C 语言、Java 甚至 Fortran。Waf 是一个用于配置、编译和安装应用程序的框架。我们将展示如何使用 Waf。我利用源代码构建了 Waf,因此我们先来看看其版本:
这里展示的是,我如何构建 Waf 中的 C++ 演示项目:
这是我的 wscript 文件, 用于协调构建:
如果你已熟悉 Python,那 Waf 上手也会很快。 点击链接了解 Waf。
最后,以《契诃夫法则》结尾:
“第一幕中出现的枪,在第三幕必然会发射。?”
这里介绍的每一个工具都有其用途。合理设置并使用,让你的 C++ 项目更有生机,扬长避短,理智谋划。静候佳音。