SDL中文论坛

标题: GN语法、操作(GN Language and Operation) [打印本页]

作者: ancientcc    时间: 2016-9-8 16:38
标题: GN语法、操作(GN Language and Operation)
本帖最后由 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"
复制代码



构造配置
总体构造流程


构造配置文件(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>)。


你可以用模板(templates)来扩展可使用的目标。Chrome就定义了以下类型。





欢迎光临 SDL中文论坛 (http://www.libsdl.cn/bbs/) Powered by Discuz! X3.3