资讯详情

GN使用指南

GN使用指南

运行 GN

您可以直接输入命令行gn操作。因为在depot_tools(路径应该在你的环境变量PATH工具目录中有一个相同名称的脚本。该脚本将在当前目录中找到二进制文件并运行。

构建一个build

使用GYP当系统根据相应的配置参数分别生成Debug和Release但是GN不同的是,您可以随意配置您的编译参数和生成目录。如果在编译过程中检测到它Ninja当文件需要更新时,它也会自动重新生成。

编译目录译目录:

gn gen out/my_build

介绍编译参数

编译参数设置编译目录:

gn args out/my_build

然后弹出文本编辑器,输入编译参数如下:

is_component_build = trueis_debug = false

查看所有参数变量及其默认值:

gn args --list out/my_build

由于不同的目录有不同的参数值,因此必须指定编译目录。

Chrome 开发者也可以参考Chrome-specific build configuration获取更多信息的指示。

交叉编译配置(Cross-compiling to a target OS or architecture)

运行gn args out/Default(用您需要的目录替换)在以下常用的交叉编译选项中添加一个或多个:

target_os = "chromeos"target_os = "android"target_cpu = "arm"target_cpu = "x86"target_cpu = “x64”

goma 配置

运行gn args out/Default(用您需要的目录替换)。并添加:

use_goma = truegoma_dir = “~/foo/bar/goma”

如果你的 goma 默认路径安装(~/goma),可以忽略goma_dir参数。

配置 component 模式

运行gn args out/Default并添加:

is_component_build = true

分步详解

增加一个编译文件(BUILD.gn)

创建文件tools/gn/tutorial/BUILD.gn并输入:

executable(“hello_world”) { sources = [ “hello_world.cc”, ]}

目标目录中应该有一个hello_world.cc包含你期望的内容的文件。现在我们只需要告诉编译器需要处理这个编译文件。打开目录(src)下的BUILD.gn将新创建的编译文件添加到其中一个根中group依赖项(这里的每一个)group是其他目标的集合):

group(“root”) { deps = [ … “//url”, “//tools/gn/tutorial:hello_world”, ]}

你可以看到你的目标文件标签前面有一个//符号(表示源代码的根目录,即src目录),跟随具体路径,然后冒号,最后是你项目的目标名称。

测试您的新项目

使用命令行操作源码根目录:

gn gen out/Defaultninja -C out/Default hello_worldout/Default/hello_world

GN 鼓励静态库使用相同的名称。在编译其中一个时,您可以将没有前缀的标签文本传递给// ninja:

ninja -C out/Default tools/gn/tutorial:hello_world

声明依赖

现在来构建一个静态库,它有一个函数,功能是对任何人说hello。这些都包含在一个中hello.cc文件中tools/gn/tutorial/BUILD.gn,在文件底部添加以下配置静态库的文本:

static_library(“hello”) { sources = [ “hello.cc”, ]}

依靠上述静态库,我添加了另一个可执行文件项目:

executable(“say_hello”) { sources = [ “say_hello.cc”, ] deps = [ “:hello”, ]}

这个exe项目包含源文件并依赖上述文件lib工程。lib是通过exe中的deps根据项目介绍。您还可以使用全路径文本//tools/gn/tutorial:hello,但是如果你介绍的项目是在同一个项目中build缩写可用于文件中:hello。

测试静态库

输入源码根目录:

ninja -C out/Default say_helloout/Default/say_hello

不需要再操作了 GN 命令了。当BUILD.gn当文件发生变化时 GN自动重生 ninja 文件。你知道,这通常发生在 ninja 刚运行时,它会打印[1/1] Regenerating ninja files。

预编译设置(Compiler settings)

我们的 hello lib工程有一个新功能,就是可以同时对两个人说 hello。这个功能是通过宏定义来定义的TWO_PEOPLE控制。我们可以在项目中添加:

static_library(“hello”) { sources = [ “hello.cc”, ] defines = [ “TWO_PEOPLE”, ]}

把一些设置放config中(Putting settings in a config)

然而,使用lib项目还需要知道这个预定义,并将定义放在其中lib本项目仅生效本项目的文件。如果包含其他项目hello.h,他们看不到这个定义。如果你想看到这个定义,每个人都会介绍它lib必须定义所有项目TWO_PEOPLE。

GN 有一个”config一些设置可以放在概念上。现在让我们创建一个。config把我们需要的预定义宏放进去:

config(“hello_config”) { defines = [ “TWO_PEOPLE”, ]}

如何在目标工程中引入这些设置,你只需要在目标中configs列出所需的配置:

static_library(“hello”) { … configs = [ “:hello_config”, ]}

你需要使用这个地方 =,而不是=,因为每个目标项目都有一系列的默认配置来构建和编译。您必须将新的配置添加到默认配置中,而不是全部重写。如果您需要查看默认配置,您可以编译文件(BUILD.gn)中使用print函数或者desc命令行子命令(将介绍以下例子)。

依赖配置项(Dependent configs)

上述方法可以很好地包装我们的配置,但它仍然需要每次使用lib在自己的配置中设置项目。如果每个使用lib这些配置可以自动获得,多好啊。现在改变以下内容lib的配置:

static_library(“hello”) { sources = [ “hello.cc”, ] all_dependent_configs = [ “:hello_config” ]}

这会将hello_config应用配置hello以及所有的依赖(所有的继承,包括间接依赖)hello项目。现在每个人都依赖我们lib所有项目都将获得这些配置。也可以设置public_configs设置只适用于直接依赖的目标项目(不传递)。

现在,如果你编译并运行,你会看到两个人的新版本:

ninja -C out/Default say_helloninja: Entering directory ‘out/Default’[1/1] Regenerating ninja files[4/4] LINK say_hello> out/Default/say_helloHello, Bill and Joy.

添加新的编译参数

你可以通过declare_args直接声明您接受的参数并指定其默认值。

declare_args() { enable_teleporter = true enable_doom_melon = false}

使用gn help buildargs概述他们的工作原理。gn help declare_args获取声明参数的细节。

不知道发生了什么事?(Don‘t know what’s going n?)

你可以运行 GN 的 verbose 模式,会看到很多关于当前发生的信息。使用-v启用。

打印调试信息

有一个print的命令,可以输出到 stdout:

static_library(“hello”) { … print(configs)}

这会打印出应用到目标项目的所有配置信息(包括默认的)。

“desc”命令

你可以运行gn desc <build_dir> 获取指定目标的信息。

gn desc out/Default //tools/gn/tutorial:say_hello

这会打印出很多我们想要的信息。你也可以只打印一项。现在来告诉你,如何知道目标工程say_hello中的TWO_PEOPLE宏定义在什么地方:

gn desc out/Default //tools/gn/tutorial:say_hello defines --blame…lots of other stuff omitted… From //tools/gn/tutorial:hello_config (Added by //tools/gn/tutorial/BUILD.gn:12) TWO_PEOPLE

你可以看见TWO_PEOPLE是通过一个 config 来定义的,你也可以知道是哪行将config应用到目标工程的(在这里,是all_dependent_configs那行)。

两外一个特别有趣的命令:

gn desc out/Default //base:base_i18n deps --tree

标签: gn丝印三极管

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台