最近开始研究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.mdhttps://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-compilinghttps://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.COMhttps://harmonyos.51cto.com/posts/2972#bky

WebRTC编译系统之gn和ninja_安晓辉生涯——聚焦程序员的职业规划与成长-CSDN博客WebRTC现在使用 gn 来生成构建脚本,使用 ninja 来构建。https://blog.csdn.net/foruok/article/details/70050342

Gn 与 Ninja学习和使用相关推荐

  1. gn、ninja的安装-Ubuntu18.04

    版权声明:原创文章,欢迎转载,但请注明出处,谢谢.https://blog.csdn.net/qiuguolu1108/article/details/103842556 如果你不想编译gn.ninj ...

  2. WebRTC编译系统之GYP,gn和ninja

    GN(Generate Ninja)来生成构建脚本,使用 ninja 来构建. gn 的介绍在这里:https://www.chromium.org/developers/gn-build-confi ...

  3. Fuchsia之GN与Ninja构建hello world

    接上篇:Fuchsia中GN与Ninja构建过程  1.环境搭建 # cp -rf out/ ~/home/GN //将编译出来的out目录的gn都拷贝出来 # emacs /etc/profile ...

  4. Ninja构建系统入门--GN与Ninja构建过程

    Ninja构建系统入门--GN与Ninja构建过程 开始 GN构建系统 搭建 结束 开始 GN构建系统 GN是一种元构建系统,生成Ninja构建文件(Ninja build files),相较GYP而 ...

  5. GYP,GN和Ninja

    chromium的编译过程中用到了GYP,GN和Ninja这三个构建工具,GYP是一个在不同平台构建项目的工具,GN是GYP的升级版,Ninja是一个小型追求速度的构建系统. GYP GYP是Gene ...

  6. WebRTC之gn与ninja(十三)

    Gn设计理念 编写构建文件不应该是一个创造性的努力.理想情况下,两个人应该产生相同的构建文件来实现相同的需求.除非绝对需要,否则不应有任何灵活性.做越多的事情越可能产生致命的错误. 定义应该比代码更像 ...

  7. Fuchsia中GN与Ninja构建demo

    # sudo apt-get install clang ninja-build re2c cmake graphviz gtest # git clone https://github.com/Me ...

  8. GN及Ninja基本语法

    1..gn是源文件:.gni是头文件,类似C++中的头文件.h 通过import进行引用 import("//build/config/c++/c++.gni") 2.gn有许多内 ...

  9. 编译工具 Ninja 介绍

    什么是Ninja Ninja是使用C++写的开源项目. http://martine.github.io/ninja/ 在Unix/Linux下通常使用Makefile来控制代码的编译,但是Makef ...

最新文章

  1. DeepMind 的2017:有 AlphaGo,更有社会责任
  2. 准确率不变 损失率下降_最新斯诺克排名奥沙利文排在第二,丁俊晖排第十,第一保持不变...
  3. 深度学习的seq2seq模型——本质是LSTM,训练过程是使得所有样本的p(y1,...,yT‘|x1,...,xT)概率之和最大...
  4. 第五节、实现接口 [转贴]
  5. spring源码 — 一、IoC容器初始化
  6. matlab仿真软件 高阶调制,高阶差分幅度相移键控调制解调系统及仿真
  7. mysql开启binlog启动慢_mysql配置开启binlog与慢查询日志功能
  8. MySQL 批量插入数据,单次插入多少条数据效率最高
  9. MYSQL向日期添加指定的时间间隔
  10. 关于EL表达式中requestScope和param区别
  11. arcobjects java开发_ArcGIS Engine SDK for Java 最小示例学习
  12. 浅谈RS-485协议
  13. 车载前视摄像头学习笔记 ———— 摄像头输出数据格式(RGB)
  14. html如何提取图片颜色代码,解析CSS 提取图片主题色功能(小技巧)
  15. BUUCTF Misc 神秘龙卷风
  16. linux安装程序企鹅,在Linux上安装小企鹅输入法
  17. SWUST OJ285: 程序设计C 实验三 题目五 求二阶逆矩阵
  18. 中银泰定期存款理财技巧
  19. 别说我没告诉你,真心推荐4款免费动画制作软件
  20. Mysql磁盘空洞的成因以及重建表的几种方式

热门文章

  1. 托福高频真词List13 // 附托福TPO阅读真题
  2. 系统架构的基本设计原则
  3. [河内塔]汉诺塔实现
  4. 计算机网络 有效数据率,在计算机网络中,表征数据传输有效性的指标是( ) A.误码率 B.频带利用率 C.信道容量 D.传输速率...
  5. 好用的SQL工具盘点:从学习到工作总有一款适合你
  6. 如果写不好 SQL,有没有好用的报表软件?
  7. dot Net SerialPort 组件关闭时卡住
  8. 燃气管道运行全局实时监控系统-海城支线总页面
  9. Ant Design之表格动态合并行
  10. 文本语义表征(Sentence-Bert、Simcse)的应用和实践