make的流程:程序员写makefile,告诉make怎么去构建项目,然后make去编译项目

gn+ninja的流程:程序员写GN,gn去写ninja文件,然后ninja去编译项目。

1、什么是构建系统

如果只是学习软件编程,通常代码量比较小,编写的源代码只有少数一到几个文件。比如,你编写了一段代码放入helloworld.c文件中,要编译这段代码,只需要执行以下命令:gcc helloworld.c -o helloword。当软件规模逐渐增加,有大量的源代码文件,甚至划分了不同模块。有的要编译成静态库,有的要编译成动态库,最后链接成可执行代码,这时命令行方式就捉襟见肘,需要一个构建系统

常用的构建系统包括GNU Make、GNU autotools、Apache Ant(主要用于JAVA)。此外,所有的集成开发环境(IDE)比如Qt Creator、Microsoft Visual Studio和Eclipse都对他们支持的语言添加了自己的构建系统配置工具。通常IDE中的构建系统只是基于控制台的构建系统(比如Autotool和CMake)的前端。当然,当源代码文件只有1个、几个文件时,也可以可以使用构建系统的。

本系统文章要学习的ninja就是个构建系统.

2、什么是元构建系统

元构建系统是一个生成其他构建系统的构建系统,cmake就是一个非常典型的元构建系统。本系统文章要学习的gn也是个元构建系统。如需了解更多,可以访问站点https://gitee.com/openharmony/third_party_gn进行学习。

为什么需要产生元构建系统?当软件规模进一步扩大,特别是有多平台支持需求的时候,编写GNU Makefile将是一件繁琐和乏味的事情,而且极容易出错。这时就出现了生成Makefile的工具,比如cmake、AutoMake等等,这种构建系统称作元构建系统(meta build system)

类比关系如下:

类别 gn+ninja cmake+make
元构建系统 gn cmake
构建系统 ninja make
元构建文件 BUILD.gn CMake.txt
构建文件 *.ninja Makefile

3、GN

GN是一种元构建系统,生成Ninja构建文件(Ninja build files),相较GYP而言,具有如下优点:

  • 可读性更好,更容易编写和维护。
  • 速度更快,谷歌官方给的数据是20倍的速度提升。
  • 修改GN文件后,执行ninja构建时会自动更新Ninja构建文件。
  • 更简单的模块依赖,提供了public_deps, data_deps等,在GYP中,只有一种目标依赖,导致依赖关系错综复杂,容易引入不必要的模块依赖。
  • 提供了更好的工具查询模块依赖图谱。这在GYP构建系统中是一个噩梦,要查一个目标依赖哪些模块或者一个模块被哪些目标依赖几乎是不可能的。
  • 更好的调试支持。在GN中,只需要一条print语句就可以解决。

    make的流程:程序员写makefile,告诉make怎么去构建项目,然后make去编译项目。 gn+ninja的流程:程序员写gn,gn去写ninja文件,然后ninja去编译项目。 类比关系如下:

| 类别 | gn+ninja | cmake+make | | :—: | :——: | :——–: | | 元构建系统 | gn | cmake | | 构建系统 | ninja | make | | 元构建文件 | BUILD.gn | CMake.txt | | 构建文件 | .ninja | Makefile | gn ninja 和 compile_commands

相关笔记

  • GN
  • gn ninja 和 compile_commands
  • make和cmake