gn和ninja

构建系统简介

在探讨chromium的最新GN构建系统之前,回顾一下软件开发中的构建系统。
构建系统的需求是随着软件规模的增大而提出的。如果只是做软件编程训练,通常代码量比较小,编写的源代码只有几个文件。比如你编写了一段代码放入helloworld.c文件中,要编译这段代码,只需要执行以下命令:gcc helloworld.c

当软件规模逐渐增加,这时可能有几十个源代码文件,而且有了模块划分,有的要编译成静态库,有的要编译成动态库,最后链接成可执行代码,这时命令行方式就捉襟见肘,需要一个构建系统。
常见的构建系统有GNU Make(通过MakeFile定义构建)。需要注意的是,构建系统并不是取代gcc这样的工具链,而是定义编译规则,最终还是会调用工具链编译代码。

MakeFile(文本) -> Make(工具) -> gcc

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

在Linux上软件仓库的概念还没有普及的时候,通常我们安装软件的步骤是:

  • ./configure
  • make
  • make install

第一步就是调用AutoTool工具,根据系统环境(Linux的版本众多,软件安装情况也不一样),生成GNU Makefile。

cmake(等生成Makefile的工具) -> MakeFile(文本) -> Make(工具) -> gcc

关于gcc、makefile、make、cmake的内容请参考:
make、makefile、cmake及相关内容

Chromium中的构建系统

chromium开源项目采用的是GYP(Generate Your Projects)构建系统,这也是一种元构建系统。
软件工程师根据GYP规则编写构建工程文件(通常以gyp, gypi为后缀),GYP工具根据gyp文件生成GNU Makefile。
接着chromium项目又整出了Ninja构建系统,但这个Ninja并不是用来取代GYP的,而是取代GNU make。

GYP
GYP是Generate Your Projects的缩写,GYP的目的是为了支持更大的项目编译在不同的平台,比如Mac,Windows,Linux,它可以生成Xcode工程,Visual Studio工程,Ninja编译文件和Mackefiles。

GYP结构
GYP的输入是.gyp和.gypi文件,.gypi文件是用于.gyp文件include使用的。.gyp文件就是符合特定格式的json文件。

GN
GN(Generate Ninja)是chromium project用来取代GYP的新工具,由于GN是用C++编写,比起用 python写的GYP快了很多,GN新的DSL的语法也被认为是比较好写以及维护的。

Ninja
Ninja是一个追求速度的构建系统,相比别的构建系统,Ninja的特点是快和简洁,仅保留最少的特性来提高编译速度。Ninja使用build.ninja文件来定义构建规则,和Makefile里的元编程不同,build.ninja几乎是完全静态的,动态生成依赖其他工具,如gyp或者CMake。

详细参考:

build.niinja
build.niinja相当于ninja的makefile,一个简单的build.ninja文件如下,分为rule和dependency两部分。

.gn(文本) -> GN(工具) -> build.niinja(类似Makefile) -> Ninja(类似Make) -> gcc

参考文献:
https://zhuanlan.zhihu.com/p/136954435
https://blog.csdn.net/p13503959390/article/details/72801282

你可能感兴趣的:(OpenHarmony,其他)