# [gn+ninja学习 0x01]gn和ninja是什么

举报
zhushy 发表于 2022/11/09 10:13:54 2022/11/09
【摘要】 [gn+ninja学习 0x01]gn和ninja是什么OpenHarmony使用gn+ninja来维护开源项目的构建。之前没有接触过gn+ninja,是时候系统性的来学习下了。边学边记录下学习过程,希望对同样需要学习gn+ninja的朋友有所帮助。 1、什么是构建系统如果只是学习软件编程,通常代码量比较小,编写的源代码只有少数一到几个文件。比如,你编写了一段代码放入helloworld....

[gn+ninja学习 0x01]gn和ninja是什么

OpenHarmony使用gn+ninja来维护开源项目的构建。之前没有接触过gn+ninja,是时候系统性的来学习下了。边学边记录下学习过程,希望对同样需要学习gn+ninja的朋友有所帮助。

1、什么是构建系统

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

看下百度百科上的定义,构建系统(build system)是用来从源代码生成用户可以使用的目标(targets)的自动化工具。目标可以包括库、可执行文件、或者生成的脚本等等。常用的构建系统包括GNU Make、GNU autotools、CMake、Apache Ant(主要用于JAVA)。此外,所有的集成开发环境(IDE)比如Qt Creator、Microsoft Visual Studio和Eclipse都对他们支持的语言添加了自己的构建系统配置工具。通常IDE中的构建系统只是基于控制台的构建系统(比如Autotool和CMake)的前端。当然,当源代码文件只有1个、几个文件时,也可以可以使用构建系统的。

本系统文章要学习的ninja也是个构建系统,如需了解更多,可以访问站点https://gitee.com/openharmony/third_party_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、常见的元构建系统

CMake是一个开源的、跨平台的工具系列,旨在构建、测试和打包软件。CMake使用简单的平台和独立于编译器的配置文件来控制软件编译过程,并生成可在您选择的编译器环境中使用的本机makefile和工作区。

GN元构建系统用于生成Google Chrome浏览器和相关项目(v8,node.js)以及Google Fuchsia的生成文件。gn可以为Chrome支持的所有平台生成Ninja文件。用一句话来说明什么是GN:一个生成Ninja构建文件的元构建系统,以便你可以用Ninja构建Chromium。GN文件相当于gyp文件的下一代。

GYP(Generate Your Projects)是由 Chromium 团队开发的跨平台自动化项目构建工具,Chromium 便是通过 GYP 进行项目构建管理。软件工程师根据GYP规则编写构建工程文件(通常以gyp, gypi为后缀),GYP工具根据gyp文件生成GNU Makefile。接着chromium项目又整出了Ninja构建系统,但这个Ninja并不是用来取代GYP的,而是取代GNU make的、。对于我们开发者而言,不需要去深入了解Ninja或GNU Makefile这样构建系统,因为这只是一种中间输出。

4、GN元构建系统简单介绍

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

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

5、小结

我们初步了解了下构建系统、元构建系统是做什么的,了解到gn是个元构建系统,类似cmake。接下来的一篇会介绍gn入门知识、具体如何使用等等。

参考资料

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。