#打卡不停更# [gn+ninja学习 0x01]gn和ninja是什么.md 原创 精华
[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入门知识、具体如何使用等等。
前排支持大佬新坑
感谢 感谢
打卡学习
如果发现错误,或者不通顺的地方,麻烦指正