SDL中文论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 39106|回复: 0
打印 上一主题 下一主题

[Discuss] GN语法、操作(GN Language and Operation)

[复制链接]

149

主题

331

帖子

2445

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2445
跳转到指定楼层
楼主
发表于 2016-9-8 16:38:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ancientcc 于 2016-9-9 09:35 编辑

工作中要用到WebRTC,WebRTC源码是用GN构造的。GN Language and Operation描述了GN语法,在这里翻译些当中部分。


命名(Naming things)

标识(Labels)
标识是有着预定义格式的字符串,依赖图中所有的元素都由标识唯一识别。通常情况下,标识看去是以下样子。
  1. "//base/test:test_support"
复制代码

它由三部分组成:绝对源根路径(source-root-absolute path),冒号和名称。上面这个标识指示到<src>/base/test/BUILD.gn中查找名称是“test_support”的标识。

如果指定的源根位置找不到要加载的build文件,GN将到以“build/secondary”指示的次树中找。When loading a build file, if it doesn‘t exist in the given location relative to the source root, GN will look in the secondary tree in build/secondary. The structure of this tree mirrors the main repository and is a way to add build files for directories that may be pulled from other repositories where we can’t easily check in BUILD files. The secondary tree is a fallback rather than an override, so a file in the normal location always takes precedence.

完整的标识还包括处理该标识要使用的工具链。工具链通常是以继承的方式被默认指定,当然你也可以显示指定。
  1. "//base/test:test_support(//build/toolchain/win:msvc)"
复制代码

上面这个标识会去“//build/toolchain/win”文件查到名叫"msvc"的工具链定义,那个定义会知道如何处理“test_support”这个标识。

如果你指向的标识就在此个build文件,你可以省略路径,而只是从冒号开始。
  1. ":base"
复制代码


你可以以相对于当前目录的方式指定路径。标准上说,要引用非本文件中标识时,除了它要在不同上下文运行,我们建议使用绝对路径。什么是要在不同上下文运行?举个列子,一个项目它既要能构造独立版本,又可能是其它项目的子模块。

  1. "source/plugin:myplugin"  # Prefer not to do these.
  2. "../net:url_request"
复制代码


书写时,可以省略标识的第二部分、第三部分,即冒号和名称,这时名称默认使用目录的最后一段。标准上说,在这种情况建议省略第二、三部分。(以下的“=”表示等同)
  1. "//net" = "//net:net"
  2. "//tools/gn" = "//tools/gn:gn"
复制代码



构造配置
总体构造流程
  • 在当前目录查找.gn文件,并遍历日录,直到找到一个。设定该目录为“源根(source root)”,解析.gn,找到构造配置文件。
  • 执行构造配置文件(它是默认工具链)。在Chrome,它是“//build/config/BUILDCONFIG.gn”。
  • 在根目录加载BUILD.gn。
  • 一步步解决所有依赖,递归加载BUILD.gn。如果在指定目录没找到BUILD.gn,GN将转到“build/secondary”指定的目录中找。
  • 一旦解析完了一个目标(target),生成.ninja文件。
  • 解析完所有目标后,生成build.ninja文件。


构造配置文件(The build config file)
第一个要执行的是构造配置文件,它在指示源码库根目录的“.gn”文件中指定。Chrome源码树中该文件是“//build/config/BUILDCONFIG.gn”。整个系统有且只有一个构造配置文件。
  1. buildconfig = "//build/config/BUILDCONFIG.gn"
复制代码

以上语句指示构造配置文件是源根下的“build/config/BUILDCONFIG.gn”。

除设置其它build文件执行时的工作域外,该文件还设置参数、变量、默认值,等等。设置在该文件的值对所有build文件可见。

每个工具链会执行一次该文件(见“工具链”)。

目标(Targets)
目标是构造表中的一个节点,通常用于表示某个要产生的可执行或库文件。目标经常会依赖其它目标,以下是内置的目标类型(参考gn help <targettype>)。
  • action:运行脚本产生文件。
  • action_foreach:循环运行脚本依次产生文件。
  • bundle_data:产生要加入Mac/iOS包的数据。
  • create_bundle:产生Mac/iOS包。
  • executable:产生可执行文件。
  • group:包含一个或多个目标的虚拟节点(目标)。
  • shared_library:一个.dll或.so。
  • loadable_module:一个只用于运行时的.dll或.so。
  • source_set:一个轻量的虚拟静态库(通常指向一个真实静态库)。
  • static_library:一个.lib或.a文件(通常用source_set代替)。


你可以用模板(templates)来扩展可使用的目标。Chrome就定义了以下类型。
  • component:基于构造类型,或是源文件集合或是共享库。
  • test:可执行测试。在移动平台,它用于创建测试原生app。
  • app:可执行程序或Mac/iOS应用。
  • android_apk:生成一个APK。有许多Android应用,参考//build/config/android/rules.gni。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|丽谷软件|libsdl.cn

GMT+8, 2025-5-2 02:42 , Processed in 0.056668 second(s), 20 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表