Gn 与 Ninja学习和使用
最近开始研究OpenHarmony,发现大多数鸿蒙系统的组件的编译构建都是基于 gn 和 ninjia 完成的。之前在编译Google开源的代码时有过接触,但是没有对其进行深入学习使用,只知道它是谷歌弄出来的替代make的东西,据说相对于GUN make速度有了好几倍的提升。既然是比Make更加优秀的东西,自然值得引荐使用。这可能也是鸿蒙选择使用它进行代码构建最直接的原因吧。我将从下面五个方面对其
最近开始研究OpenHarmony,发现大多数鸿蒙系统的组件的编译构建都是用 gn 和 ninjia 完成的。之前在编译Google开源的代码时有过接触,但是没有对其进行深入学习使用,只知道它是谷歌弄出来的替代make的东西,据说相对于GUN make速度有了好几倍的提升。既然是比Make更加优秀的东西,自然值得引荐使用。这可能也是鸿蒙选择使用它进行代码构建最直接的原因吧。我将从下面五个方面对其进行学习运用。
1.什么是ninjia?
ninjia是一个致力于速度的小型编译系统工具 (类似于Make编译工具)
其主要有两个特点:
1.可以通过其他高级的编译系统生产其输入文件。
2.它的设计就是为了更快的编译。
ninjia的核心是由C/C++编写的,同时有一部分辅助功能由和shell实现。
2.什么是gn?
gn 即 Generate ninjia ,顾名思义就是用来生成ninjia编译文件的工具,可以理解为cmake工具。
3.gn与ninjia的关系是怎么样的?
可以理解为make与cmake之间的关系,ninjia于GUN make构建工具类比对应关系如下:
ninjia工具 Make GUN工具 功能作用
gn <----------> cmake -------------> 生成构建文件
xxx.gn <----------> CMakeList --------------> 描述构建所需的编译文件
xxx.ninjia <----------> Makefile ---------------> 描述代码的具体编译步骤
ninjia <----------> Make ----------------> 编译代码
4.gn和ninjia安装
在openharmony SDK源码 prebuilts/build-tools/linux-x86/bin/ 目录下,已经存在这两个工具,在开发时无需另外安装。

其它安装方法:
下载gn:https://repo.huaweicloud.com/harmonyos/compiler/gn/
下载ninjia:https://repo.huaweicloud.com/harmonyos/compiler/ninja/
解压后,将其拷贝到系统环境目录即可。
5.构建脚本语法
参考官方文档:
https://chromium.googlesource.com/chromium/src/+/master/tools/gn/docs/quick_start.md
https://chromium.googlesource.com/chromium/src/+/master/tools/gn/docs/quick_start.mdGN Quick Start guide - Bigben - 博客园GN Quick Start guide Contents Running GN Setting up a build Passing build arguments Cross-compiling
https://www.cnblogs.com/bigben0123/p/12626833.html
也可参考大佬们写的文章:
GN 快速入门指南_坚持不一定成功,但放弃一定失败~-CSDN博客GN Quick Start guide运行 GN你可以在命令行里直接输入gn运行。因为在depot_tools(路径应该在你的环境变量PATH中已经设置过)工具目录中有一个相同名字的脚本。这个脚本会找到当前目录中的二进制文件并运行它。构建一个build使用GYP时,系统会根据相应的配置参数分别生成Debug和Release编译目录。但GN不一样,你可以任意配置你的编译参数和生成目录。编译时如果检测
https://blog.csdn.net/Vincent95/article/details/78499883GN 快速入门指南GN 快速入门指南
http://www.360doc.com/content/20/0619/17/8335678_919404278.shtml
6.gn和ninjia的使用
1.生成 debug 版本的构建文件,默认配置
gn gen out/Debug
2.注意,通过 --args 可以传递参数给 gn ,具体参数的含义,由工程的构建系统来解释,比如 is_debug 选项,决定构建 debug 还是 release 版本。生成 release 版本的构建文件(如果要传递多个参数,可以将多个参数在""之间用空格隔开),生成的参数存放在 out/Release 下的 args.gn 文件中。
gn gen out/Release --args="is_debug=false"
3.查看帮助信息
gn gen --help
4.如果已经使用gn gen 生成过构建文件,想看看这个版本的构建文件都指定了什么参数,可以使用如下命令:
gn args out/Release --list
5.显示 gn 支持的所有命令行选项,比如 --args,-v
gn help switches
6.对第五条列出的每个 switch 使用 help 指令,可以显示详细帮助信息
// 显示 --args 这个 switch 的详细帮助信息
gn help --args
// 显示 gn gen 的帮助信息
gn gen --help
7.后缀为 ninja(*.ninja) 的文件是 ninja 的 构建文件。执行完 gn gen 之后,会在 out/Release 下生成 xxx.ninja 文件,可以把这个文件看做是整个工程 的“ Makefile ”。它里面调用了各个模块的子 ninja 文件,执行如下命令即可编译整个工程。
ninja -C out/Release
-C 选项指定编译路径,其等同于:
cd out/Release
ninja
8.要编译单个模块,在 ninja 命令后跟模块名字即可(build.ninja文件中定义的构建目标,就像 Makefile 中的构建目标一样)。比如:
ninja test #构建test模块
9.查看帮助信息:
ninja --help
10.查看子工具:
ninja -t list
11. 清理构建
ninjia -t clean #清理整个工程
ninjia -t clean pc #清理pc模块
7.学习传送门
浅析鸿蒙中的 Gn 与 Ninja(一)-鸿蒙HarmonyOS技术社区-鸿蒙官方合作伙伴-51CTO.COM
https://harmonyos.51cto.com/posts/2972#bky
更多推荐
所有评论(0)