文章

C++构建工具

C++构建工具

该文记录 C++ 构建工具发展历程及介绍。

C++构建工具

1. 概述1

C++ 构建工具种类繁多,历史也比较悠久,以下简略介绍 C++ 构建工具的发展历程。

第一代构建工具(手动编译)

  • 20世纪70年代至80年代:手动编译是主要的构建方式,开发人员需要使用命令行工具和文本编辑器手动编写 Makefile 等脚本文件进行构建。

第二代构建工具(基于脚本)

  • 20世纪90年代至2000年代:随着软件规模的扩大和复杂度的提高,构建工具也逐渐进入了脚本化的时代。nmakeSConsBuildroot等构建工具开始流行,这些工具提供了一种便捷的方式来编写和管理构建脚本,使得构建过程变得更加自动化和可控。

第三代构建工具(基于DSL)

  • 2010年代:随着软件架构的变化,越来越多的开发人员开始使用面向对象的方式来构建软件系统。Gradle 等基于 DSL 的构建工具应运而生,这些工具提供了一种更加自然、直观的方式来编写和管理构建脚本,可以帮助开发人员更好地管理软件构建过程。

第四代构建工具(基于配置)

  • 2010年代至今:由于软件规模的不断扩大和软件开发方式的不断变化,构建工具的需求也在不断发生变化。Bazel 等基于配置的构建工具的出现,标志着构建工具进入了一个全新的时代。这些工具提供了一种更加灵活、高效、可扩展的构建方式,可以在分布式、复杂的软件系统中发挥更好的作用。

2. 第一代构建工具(手动编译)

第一代构建工具是指最初的 C++ 代码编译过程,也称为手动编译。在这个阶段,程序员需要手动编写编译命令来编译 C++ 代码。

手动编译主要包括以下步骤:

  1. 编写源代码:程序员编写 C++ 代码,通常使用文本编辑器。
  2. 编写编译命令:程序员手动编写编译命令,通常使用 Makefile
  3. 执行编译命令:程序员在命令行中执行编译命令。
  4. 检查编译结果:程序员检查编译结果,如果存在错误,则需要修改代码并重新编译。

手动编译的缺点是繁琐、容易出错、浪费时间等,因此逐渐被自动化构建工具所取代。但手动编译也是构建工具发展的基础,为后续构建工具提供了经验和参考。

3. 第二代构建工具(基于脚本)

第二代构建工具是基于脚本的自动化构建工具。它们采用脚本语言编写构建脚本,自动化执行代码编译、测试和打包等操作,提高了开发效率,降低了出错率。

3.1. Buildroot

Buildroot 是一组 MakefilePatch 文件,用来简化和自动化为嵌入式系统建造一个完整和可引导的 Linux 环境的过程,特别是在使用交叉编译来允许在单一的基于 Linux 的开发系统上为多个目标平台进行建造的时候。

3.2. CMake2

CMake 是一种跨平台的构建工具,支持多种编程语言,包括 C++PythonJava 等。CMake 使用类似于编程语言的 CMakeLists.txt 文件来定义项目配置和依赖关系,可以自动化执行代码编译、测试和安装等任务。CMake 工具在 C++ 开发领域得到了广泛应用。

3.3. Make

Make 是最早的构建工具之一,它是由贝尔实验室的 Stuart Feldman 在 1977 年发明的。Make 通过读取 Makefile 文件中的依赖关系来自动化执行编译任务,使得程序员无需手动编写编译命令。Make 工具在 Unix 和 Linux 系统中得到广泛使用。

3.4. NMake

Microsoft 程序维护实用工具 (NMAKE.EXE) 是 Visual Studio 随附的命令行工具。 它基于一个描述文件中包含的命令生成项目,该文件通常称为“生成文件”。NMAKE 必须在“开发人员命令提示”窗口中运行。 开发人员命令提示窗口具有为工具、库设置的环境变量,并且包括在命令行上生成所需的文件路径。

3.5. SCons

SCons 是一种软件开发工具程序,功能类似于 UNIX 上的 makeautoconfautomake 工具。

4. 第三代构建工具(基于DSL)

第三代构建工具是基于领域特定语言(DSL)的构建工具,它们提供了一种更高级别、更抽象的构建方式,使得构建过程更加灵活、可维护和易于扩展。

4.1. Bazel

Bazel 是一个谷歌开源的构建工具,支持多种语言的项目构建。Bazel 采用 Starlark 语言作为领域特定语言,使用 Starlark 可以方便地扩展 Bazel 的构建功能。Bazel 支持增量式构建,可以提高构建效率。

4.2. CMake

CMake 是一个跨平台的构建工具,使用 CMake 可以方便地管理 C++ 项目的构建过程。CMake 采用自己的领域特定语言来描述项目的构建过程,可以生成多种构建系统的配置文件,例如 MakefileVisual Studio 项目文件等。CMake 支持模块化的项目配置方式,可以方便地将模块组合成一个完整的项目。

4.3. Gradle

Gradle 是一种基于 Groovy 语言的自动化构建工具,它支持多种语言,包括 JavaC++Python 等。Gradle 采用 Groovy DSL 语言作为构建脚本语言,它的核心思想是将构建过程当作一个自动化的工程,支持自动依赖管理、编译、测试、打包、发布等多种任务。Gradle 可以自动下载依赖库,支持增量式构建和并行化构建,支持插件和任务扩展。Gradle 工具是目前被广泛使用的构建工具之一。

4.4. Meson

Meson 是用于自动化构建的自由软件,使用 Python 语言编写,在 Apache 许可证 2.0 版本下发布,主要目标是为了让开发者节约用于配置构建系统的时间。

4.5. Ninja

Ninja 是一个专注于速度的小型构建系统,由 Evan Martin 于2010年在 Chrome 团队工作时开发。

5. 第四代构建工具(基于配置)

第四代构建工具主要是基于配置文件进行构建,可以方便地管理依赖关系和构建过程。同时,它们也支持多语言构建,并且可以跨平台使用。

5.1. Bazel

是一个面向大规模项目的构建工具,它支持多语言构建,使用起来比较复杂,但可以提高构建效率。

5.2. CMake

是一个跨平台的构建工具,它采用一种类似于编程语言的语法来描述构建过程,使用起来比较灵活。

5.3. Gradle

是一个基于 Groovy 语言的构建工具,它支持多语言构建,并可以在构建过程中执行自定义任务。

5.4. Meson

是一个跨平台的构建工具,它采用一种简单的声明式语法来描述构建过程,使用起来比较方便。

5.5. MSBuild

Microsoft Build Engine(通常简称MSBuild)是一个自由且开源的构建工具集,适用于托管代码以及原生 C++ 代码,是 .NET 框架的一部分。它采用 XML 格式的项目文件和属性文件来配置和控制构建。

5.6. XMake3

它基于 Lua 语言,使用 Lua 脚本来配置和控制构建过程。与其他第四代构建工具相比,XMake 具有更简洁、更灵活的语法,同时具有较高的性能和可扩展性。它也支持跨平台构建,并且提供了丰富的插件和扩展来支持各种编程语言和开发环境。

6. 总结

  • 目前开源代码主流构建工具包括 CMake,而且构建工具版本都在更新。
  • 其中 XMake 创始人是中国人。

参考

本文由作者按照 CC BY 4.0 进行授权