个人理解:就c/c++而言,最终的编译不都是通过gcc等编译器编程出来的嘛,不可能每次都手敲命令,所以就出现了构建系统,像是make这种,依赖于makefile进行编译。但是makefile和平台强关联。不同的平台的makefile可能有点差别。所以这个时候就使用抽象来解决问题,抽象出更高的一层构建层次,在这个层次中屏蔽不同平台中makefile的差别(相当于帮忙我们写了平台相关的编译命令)。

我自己也完全也可以搞一套构建系统,例如build.hl这样子的脚本,工具名字就叫做holo。holo通过xxx.hl来进行编译(根据xxx.hl中指定的编译器来编译)。然后再基于holo再抽象一个跨平台的构建系统…

虽然可以这么做,但是要考虑到易用性、效率等各方面的因素。

构建系统

构建系统是用来从源代码生成用户可以使用的目标的自动化工具,目标可以包括库、可执行文件、生成的脚本等。

需要注意一点就是,构建系统会执行构建的操作!

1.构建系统(build system)

1.1Make

make通过makefile,调用gcc等编译器来进行编译的,大部分的东西

1.2ninja

ninja通过.ninja脚本,也是调用gcc等编译器来进行编译的。

Ninja 是Google的一名程序员推出的注重速度的构建工具Ninja 是一个专注于速度的小型构建系统。最初是为了对chromium、Swift等进行快速编译构建。设计哲学是通过包含描述依赖关系图的方式提供快速的构建。其脚本文件后缀为 .ninja

2.元构建系统(meta build system)

Meta-Build system: a build system that generates other build systems。就是说通过元构建系统通过自己的脚本规则来生成更底层的makefile或是.ninja等。

与Make构建系统不同的是meta build system(元构建系统)本身不会执行构建工作,而是从更高层次抽象(如CMakeLists.txt)描述构建依赖关系,并转换为make等更底层的构建系统。元构建系统会屏蔽掉平台相关依赖,这样元构建系统具有极好的跨平台特性。

2.1cmake

2.2xmake

2.3gyp

2.4GNU Autotool

3.构建工具的工作流程

  1. 确认项目的编程语言,运行平台等.
  2. 选择需要的编译器(clang、gcc、javac、msvc[cl.exe])
  3. 按照构建工具的要求,编写对应的构建文件文件
    1. make=makefile
    2. cmake=CMakeList.txt
    3. xmake=xmake.lua