聊一聊鸿蒙的构建系统

2021-07-14 11:19:38 浏览数 (1)

大型软件系统开发,离不开一套强大的构建系统,鸿蒙系统采用了怎样的构建系统呢?这篇文章就来揭秘Open Harmoney的构建系统。

事先声明一下,这里探讨的Open Harmony系统的构建系统,而不是鸿蒙应用开发中使用的构建系统,也就是从源码构建出鸿蒙系统镜像的工具。

构建系统简介

这么些年的开发生涯中,接触过很多个软件构建系统。为什么开发软件需要构建系统呢?

回想一下我们刚开始学习编程,通常代码量比较小,编写的源代码只有几个文件。比如编程入门的经典代码,将它写入 helloworld.c 文件中。要编译这段代码,只需要执行以下命令:

代码语言:javascript复制
gcc helloworld.c

编译后会生成一个 a.out 的可执行程序。程序稍微复杂一些,我们可以在命令行上添加一些参数,也能完成程序的构建。

但是,当软件规模逐渐增加,代码可能增至几十个源代码文件(对于 Open Harmoney、Android 这样的大型系统软件,源代码可能高达百万行),而且有了模块划分,有的要编译成静态库,有的要编译成动态库,最后链接成可执行代码,这时命令行方式就捉襟见肘。如果涉及到跨平台开发、系统定制等等,一个强大的构建系统必不可少。

构建系统的杠把子 GNU Make,这个名号想必没人不服。GNU Make 通过 Makefile 定义目标依赖、编译规则,也可以调用脚本,完成文件复制、打包等工作,相当强大,至今仍然是类 Unix 系统上主流的软件构建工具。

但是,GNU Makefile 的编写极其繁琐和乏味,也容易出错。而且在涉及到多平台开发时,GNU Make 也有些力不从心。比如 Windows 开发,通常使用的是 Visual Studio 这样的 IDE,采用的是 sln 或者 proj 之类的工程文件。

为了解决这些难题,生成Makefile的工具,比如 cmake、AutoMake 等等就应运而生。这种构建系统称作元构建系统(meta-build system)。

对于 Linux 用户来说,以下从源码构建软件的过程应该很熟悉:

代码语言:javascript复制
./configure
make
make install

第一步就是调用 AutoTool 工具,根据系统环境( Linux 的版本众多,软件开发包安装情况也不一样),生成 GNU Makefile。第二步才是启动 GNU Make 的构建过程,第三步则是依照Makefile 定义的规则将程序安装到系统指定的目录下。

AutoTool 工具通常只局限于类 Linux 系统中使用,CMake 更进一步,不仅可以生成 GNU Makefile,还可以生成 VS 工程文件,解决跨平台软件开发的问题。

可见,构建系统是随着软件规模的增大和需求的复杂逐步发展的,而各大软件开发团队也各显神通,开发出各种构建系统,这其中数谷歌的工程师最能折腾。

Android 系统早期采用的是 GNU Make 构建系统,但借助谷歌工程师高超的技巧,极大的简化了 Android.mk 的编写。如果我们单看 Android.mk,可能都不会意识到我们是在编写 GNU Makefile。但从 Android 7.0(Nougat)开始,引入了 Soong 构建系统。

浏览器引擎项目 chromium 则采用了另一套构建系统。

在我早期接触 chromium 开源项目的时候, chromium 采用的是 GYP(Generate Your Projects) 构建系统,这也是一种元构建系统。软件工程师根据 GYP 规则编写构建工程文件(通常以 gyp, gypi 为后缀),GYP 工具根据 gyp 文件生成 GNU Makefile。

接着 chromium 项目又整出了一个 Ninja 构建系统,但这个 Ninja 并不是用来取代 GYP,而是取代 GNU make 的,据谷歌官方的说法是速度有了好几倍的提升。对于开发者而言,不需要去深入了解 Ninja 或 GNU Makefile 这样构建系统,因为它只是一种中间输出。

再后来,谷歌又对 GYP 动刀,取而代之的是 GN 构建系统。GN 构建系统仍然是一个元构建系统(meta-build system),用来快速生成 Ninja 构建文件。

GN 构建系统的源码位于:https://gn.googlesource.com/gn。如果只是它来构建软件,可以下载 depot_tools,里面包含了 GN、Ninja 等整套的构建工具。

鸿蒙的构建系统

前几天折腾了一下 Open Harmony 2.0 源码的系统编译,顺便研究了一下 Open Harmony 的构建系统,发现是熟悉的老朋友。没错,鸿蒙系统采用的是谷歌开发的 GN 构建系统。为什么选择 GN 构建系统?根据谷歌官网给出的说法,GN 构建系统具有如下优点:

  • 可读性更好,更容易编写和维护。
  • 速度更快,谷歌官方给的数据是 20 倍的速度提升。
  • 修改 GN 文件后,执行 ninja 构建时会自动更新 Ninja 构建文件。
  • 更简单的模块依赖,提供了 public_deps, data_deps 等。
  • 提供了更好的工具查询模块依赖图谱。
  • 更好的调试支持。

鸿蒙采用 GN 构建系统,是一个明智的选择,这个构建系统经过了 chromium 这样大型的软件系统(代码规模不亚于 Android 系统)验证,已经证明其可靠、快速、灵活、编写简单。软件开发界有一句名言:不要重复造轮子,我们并不是什么东西都需要从头开发。

当然,仔细分析 Open Harmony 2.0 的构建脚本,可以发现其混合了 Bash 脚本、Python 脚本和 GN 构建系统。对于软件开发而言,什么工具称手,就使用它,实用至上。

目前,关于 GN 构建系统的资料还很少,可以参考如下文档:

  1. chromium 中的GN构建系统
  2. GN Quick Start guide
  3. GN Language and Operation

GN 文件的编写其实并不复杂,参考现有的 GN 文件,可以很快的掌握,这里先不展开。

在后面的文章中,我将会深入探讨 GN 构建文件的编写,敬请关注!

0 人点赞