引言

官方文档:

  1. What is GN?
  2. GN快速入门指南
  3. ninja 教程

1 构建系统简介

在探讨chromium的最新GN构建系统之前,回顾一下软件开发中的构建系统。构建系统的需求是随着软件规模的增大而提出的。如果只是做软件编程训练,通常代码量比较小,编写的源代码只有几个文件。比如你编写了一段代码放入helloworld.c文件中,要编译这段代码,只需要执行以下命令:gcc helloworld.c
当软件规模逐渐增加,这时可能有几十个源代码文件,而且有了模块划分,有的要编译成静态库,有的要编译成动态库,最后链接成可执行代码,这时命令行方式就捉襟见肘,需要一个构建系统。常见的构建系统有GNU Make。需要注意的是,构建系统并不是取代gcc这样的工具链,而是定义编译规则,最终还是会调用工具链编译代码。

当软件规模进一步扩大,特别是有多平台支持需求的时候,编写GNU Makefile将是一件繁琐和乏味的事情,而且极容易出错。这时就出现了生成Makefile的工具,比如cmake、AutoMake等等,这种构建系统称作元构建系统(meta build system)。在Linux上软件仓库的概念还没有普及的时候,通常我们安装软件的步骤是:

  • ./configure
  • make
  • make install

第一步就是调用AutoTool工具,根据系统环境(Linux的版本众多,软件安装情况也不一样),生成GNU Makefile。

2 Chromium中的构建系统

几年前的chromium开源项目采用的是GYP(Generate Your Projects)构建系统,这也是一种元构建系统。软件工程师根据GYP规则编写构建工程文件(通常以gyp, gypi为后缀),GYP工具根据gyp文件生成GNU Makefile。接着chromium项目又整出了Ninja构建系统,但这个Ninja并不是用来取代GYP的,而是取代GNU make的,据谷歌官方的说法是速度有了好几倍的提升。对于我们开发者而言,不需要去深入了解Ninja或GNU Makefile这样构建系统,因为这只是一种中间输出,所以ninja的出现,与我们关系不大,原来怎么写gyp,现在还是怎么写,只是构建命令稍微做了改变。GN文件相当于gyp文件的下一代,和GYP差别不大,但是总体上比原来的GYP文件更清晰。

3 GN构建系统

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

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

4 快速入门

运行GN
从命令行运行gn,这实际上是depot_tools下的一个脚本,所以需要确保depot_tools路径包含在环境变量$PATH中。

配置一个构建
在GYP中,有两个特定的目录Debug和Release目录,分别用于生成Debug版本和Release版本。在GN中,采用了更灵活的方式,你随便指定一个目录,比如为了测试,定义一个test输出目录,可以采用如下的命令:

gn gen out/test
那要是我要分别构建Debug版本和Release版本怎么办?GN通过传递参数来解决。也就是说,现在光通过输出目录是无法确定到底是Debug版本和Release版本,而要取决于传递的构建参数。

传递构建参数
将上面的命令稍微修改一下,即可设置构建参数:

gn args out/test
可以使用下面的命令列出可用的构建参数和它们的缺省值:

gn args --list out/test

gn+ninja编译示例

  • 在已有的chrome代码目录中,添加自己的目录,ex: tools/gn/tutorial;
  • 在上述目录中新建代码文件http://hello_world.cc如下:
  • 新建gn文件BUILD.gn,内容如下:
  • 在根目录(.gn文件所在路径)中找到BUILD.gn,新增如下group:
  • 根目录执行:gn gen out/gn_hello ;(生成http://hello_world.cc编译所需的ninja文件,该文件位于out/gn_hello下,名为build.ninja)
  • 根目录执行编译: ninja -C out/gn_hello hello_world;
  • 编译结果产出在 out/gn_hello下,示例构建的是可执行文件,可以直接执行,如图:

5 GN命令

gn args <out_dir>: Display or configure arguments declared by the build.gn check <out_dir>: Check header dependencies.gn clean <out_dir>: Cleans the output directory.gn desc <out_dir> <target_name> [<what to display>]: Show lots of insightful information about a target or config.gn format [--dump-tree] [--in-place] [--stdin] BUILD.gn: Format .gn file.gn gen <out_dir>: Generate ninja files.gn help: Does what you think.gn ls <build dir> [<label_pattern>]*: List matching targets.gn path <out_dir> <target_one> <target_two>: Find paths between two targets.gn refs <out_dir> (<label_pattern>|<file>)*: Find stuff referencing a target or file.

6 GN语法

参考文档 GN language and operation.

注:想要看懂.gn文件,务必看上面的文档!

7 整体构建流程

  1. 在当前目录中查找.gn 文件,然后沿着目录树向上走,直到找到.gn文件所在目录为止。将此目录设置为“source root”并解析此文件以查找构建配置文件的名称。
  2. 执行构建配置文件(这是默认的工具链)。
  3. 将BUILD.gn文件加载到根目录中。
  4. 递归加载BUILD.gn其他目录以解析所有当前依赖项。如果在指定位置找不到BUILD文件,GN将查看tools/gn/secondary中的相应位置。
  5. 解决目标的依赖关系后,将.ninja文件写入磁盘。
  6. 解决所有目标后,写出根build.ninja文件。

8 Ninja 构建系统

先去看博文《Ninja 构建系统》。

一些好用的ninja命令:

  1. 在浏览器中查看编译Target的编译依赖图(此命令会启动一个web server服务): ninja -t browse --port=8000 --no-browser mytarget
  • 命令行查看Target的编译过程: ninja -t query mytarget
  • 通过工具导出一个.png图片显示编译流程(未实际测试,缺少工具): ninja -t graph mytarget | dot -Tpng -ograph.png

9 使用积累

  1. gn中的is_component_build和编译target类型component的联系:https://chromium.googlesource.com/chromium/src/+/lkgr/docs/component_build.md

chrome ninja 文件_ninja和gn相关推荐

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

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

  2. 更改Google Chrome 用户文件存储目录User Data 最简单方法

    [size=medium][color=red]更改Google Chrome 用户文件存储目录User Data 最简单方法[/color] [color=green]1.在你想要存放数据的盘符下创 ...

  3. chrome 本地文件 翻译工具

    chrome 本地文件 翻译工具 翻译工具:https://qingcms.gitee.io/translator/ chrome 本地文件无法翻译的解决方案 点击选择本地文件 使用浏览器翻译当前页面 ...

  4. ninja文件语法学习

    ninja文件语法学习 ninja本质上是配置文件,没有分支,循环的流程控制. 语法 基本概念 edge(边):build语句,可以指定目标(target)输出(output).规则(rule)与输入 ...

  5. java ninja教程_ninja:一个简单的构建方式

    大家好!每隔一段时间,我就会发现一款我非常喜欢的新软件,今天我想说说我最近喜欢的一款软件:ninja! 增量构建很有用 我做了很多小项目,在这些项目中,我想设置增量构建.例如,现在我正在写一本关于 b ...

  6. chrome 书签 文件夹_将Chrome书签工具栏文件夹转换为图标

    chrome 书签 文件夹 So you have your regular bookmarks reduced to icons but what about the folders? With o ...

  7. 手机chrome书签文件导出教程

    重大发现!!!本人亲自测试 可以导出chrome书签文件 登录下面的链接 https://takeout.google.com/settings/takeout/custom/chrome?pli=1

  8. python下载文件暂停恢复_selenium+Python如何取消Chrome下载文件的‘保留’‘放弃’提示?...

    本人在做自动化测试的时候遇到问题,自动导出文件的步骤可以执行,但是文件并没有成功导出到目标目录,经debug发现,Chrome卡在了下载询问的窗口页面,就是底部弹出窗口询问是否'保留'或者'放弃'的那 ...

  9. 安卓 chrome html文件,打开Chrome浏览器在本地文件的Android

    大家好,我想从我的应用程序启动Chrome浏览器与本地file.html 这里是我的代码:打开Chrome浏览器在本地文件的Android String url2 = "file:///&q ...

最新文章

  1. 在家办公的第一天,钉钉、企业微信集体“崩溃”...
  2. OpenCV简单的过滤器平滑的实例(附完整代码)
  3. opencv-api drawKeyPoints
  4. 阿里云物联网平台python开发手册_阿里云物联网平台之云端API调用(即云端开发教程)...
  5. linux i2c驱动协议
  6. U8来料报检保存出错
  7. 傲梅分区助手克隆Linux硬盘,傲梅分区助手怎么复制磁盘?分区助手克隆磁盘的具体方法...
  8. MySQL复制之gtid_purged与gtid_executed
  9. 三菱iQ-R系列PLC控制系统项目全套资料 系统才用三菱iQ-R系列PLC,采用R04CPU
  10. 直播视频分辨率码率参考设置
  11. Redis 学习 - hiredis(官网 2021-01-06)
  12. oracle rfs进程过多,oracle 11.2 DataGuard少了日志应用进程RFS
  13. Spring之配置非自定义Bean
  14. 系统中的obj文件、dll文件、so文件、lib文件、exe文件、vcproj文件、sln文件
  15. HDOJ 5128 The E-pang Palace
  16. 阿尔法小蛋机器人怎样_深入解密科大讯飞阿尔法小蛋智能云陪护机器人TYS1怎么样呢?评价如何?求助专业爆料评测...
  17. VBScriptVBS(五)VBScript中的类class详解
  18. MySQL:如何获得 MySQL 毫秒、微秒
  19. python标点符号分中英文嘛_Python处理中文标点符号大集合
  20. nRF52832 — 提高蓝牙BLE的数据传输速率

热门文章

  1. 计算机各种硬盘的规格,硬盘规格参数表大全
  2. mysql 长连接 has gone away_MySQL server has gone away报错原因分析/
  3. tl r402路由器设置_记一次TP-LINK路由器问题排查
  4. C语言实现简单计算器(可以处理小括号)
  5. 资源放送丨《MySQL的查询与优化》PPT视频
  6. Oracle 12c因bug导致ORA-04031问题处理过程 | 云和恩墨技术通讯精选
  7. MySQL 分页优化中的 “ INNER JOIN方式优化分页算法 ” 到底在什么情况下会生效?...
  8. Hbase实用技巧:全量+增量数据的迁移方法
  9. 9个超级实用的 ES6 特性,超级实用哦!
  10. 40行代码教你利用Python网络爬虫批量抓取小视频