C 语言算是古老、经典、长寿的编程语言。从 C 语言的构建工具发展历程中,可以看出软件工程中 IDE 和 CI 的发展轨迹。
零
C 语言诞生大约在 1972 年,当时只有编译器。
想要将源码编译成可执行文件或库文件,需要程序员自己调用编译器传参。
稍微好一点的情况是,程序员可以写一个批处理脚本来简化这个过程。
Make
1977 年,Make 诞生了,算是构建工具的元老。它方便了程序员管理项目的构建过程。
Make 设计了一种 DSL(领域特定语言)来描述项目的构建规则。程序员只需要编写 Makefile,就可以通过 make 命令完成构建。
AutoTools
时间来到 1991 年,Linux 面世,GNU 计划也在进行中。
开源软件兴起,想要分发开源软件就必须解决多平台构建的问题,不能期望获得源码的人有和软件作者一样的 C 语言构建背景。大家最多知道 make install。
为了简化这一过程,GNU 推出了 AutoTools。它通过一系列脚本和宏来自动生成 Makefile,从而降低了构建的复杂性。
这一时期的源码编译通常是三步:
./configure
make
make install
CMake
时间来到 2000 年,信息化越来越广,越来越多的业务需要编写软件去处理,AutoTools 也变得不太好用。
于是,又出现了抽象一层的 CMake。它通过 CMakeLists.txt 来描述项目的构建规则,然后生成细节的 Makefile,再通过 make 去构建。
Ninja
2010 年,软件源码变得更庞大,Make 的性能出现瓶颈。于是,Google 员工设计了 Ninja,专注于提高构建性能。
Ninja 纯粹为了提高构建效率而设计,没有打算做好人机交互,因此需要搭配 CMake 使用。
DevOps
2015 年,云服务、敏捷开发、DevOps 流行,大规模构建需求日益增长。
新一代构建工具出现,配合大规模的构建系统和构建资源池,高效完成构建工作。
典型的工具有 Bazel、Meson、Buck 等,还有新一代的 C 语言依赖管理方案 Conan。
总结
C 和 C++ 语言的构建工具经历了从简单到复杂的演变,反映了软件工程的进步。随着 IDE 和 CI/CD 的普及,构建过程变得更加高效和可靠。