1. 前言
在上一篇文章中,我们介绍了 Chromium 构建系统中的 GN 的基本概念、目录结构和常用工具。从本篇开始,我们将进入实战环节,通过构建一个简单的 Demo 来学习如何编写和使用 GN 目标,让你亲身体验 GN 的魅力。
2. 动手实践:构建一个简单的 Demo
为了更好地理解 GN 目标的使用方法,我们将创建一个简单的 Demo,该 Demo 包含一个静态库和一个可执行文件,演示如何使用 executable
目标来构建一个可执行文件的项目。
🎉
注意:这里我们默认您已经根据编译指南成功编译过了Chromium,如有疑问请查询过往的编译指南。
2.1 组织项目结构
首先,我们需要在 Chromium 源码的 src
目录下创建一个名为 demo
的文件夹来存放我们的项目文件。
- 创建
demo
文件夹: 在资源管理器中,打开 Chromium 源码的src
目录,右键单击空白处,选择“新建”->“文件夹”,并将其命名为demo
。 - 创建
BUILD.gn
文件: 进入demo
文件夹,右键单击空白处,选择“新建”->“文本文档”,将其命名为BUILD.gn
。 请确保文件扩展名为.gn
而不是.txt
。 你可能需要启用“显示文件扩展名”选项才能正确修改。 - 编辑
BUILD.gn
文件: 使用你喜欢的文本编辑器(例如记事本、Notepad++、VS Code 等)打开BUILD.gn
文件,并添加以下内容:
group("demo") {deps = ["hello_gn",]
}
代码解释:
group("demo")
: 定义了一个名为demo
的group
目标。group
目标本身不产生任何输出,它主要用于组织和管理其他的目标。deps = [ "hello_gn" ]
: 指定demo
目标的依赖项为名为hello_gn
的目标。这意味着在构建demo
目标之前,需要先构建hello_gn
目标。这里hello_gn
将会是一个可执行文件目标,我们将在下一步创建。
- 创建
hello_gn
文件夹: 在demo
文件夹下,右键单击空白处,选择“新建”->“文件夹”,并将其命名为hello_gn
。 - 创建
hello_gn.cc
文件: 进入hello_gn
文件夹,右键单击空白处,选择“新建”->“文本文档”,将其命名为hello_gn.cc
。同样请确保文件扩展名为.cc
。 - 编写
hello_gn.cc
代码: 使用文本编辑器打开hello_gn.cc
文件,并添加以下 C++ 代码:
#include <iostream>int main() {std::cout << "Hello GN!" << std::endl;return 0;
}
代码解释:
- 这段代码非常简单,它包含了
<iostream>
头文件以使用标准输入输出流,并在main
函数中打印 "Hello GN!" 到控制台。
- 创建
hello_gn/BUILD.gn
文件: 在hello_gn
文件夹下,右键单击空白处,选择“新建”->“文本文档”,将其命名为BUILD.gn
。确保文件扩展名为.gn
。 - 编写
hello_gn/BUILD.gn
代码: 使用文本编辑器打开hello_gn/BUILD.gn
文件,并添加以下内容:
executable("hello_gn") {sources = ["hello_gn.cc",]
}
代码解释:
executable("hello_gn")
: 定义了一个名为hello_gn
的executable
目标,表示要构建一个可执行文件。sources = [ "hello_gn.cc" ]
: 指定了构建该可执行文件所需的源文件列表。
最终,demo文件夹下应该如下面的结构
2.2 配置构建参数
接下来,我们需要修改之前编译生成的 out/Default
文件夹下的 args.gn
文件,以添加我们的 Demo 到构建系统中。
- 修改
args.gn
文件: 使用文本编辑器打开out/Default/args.gn
文件(如果没有Default
目录,请根据你的实际构建目录进行调整)。在文件末尾添加以下两行:
# Add extra dependencies to the GN root
root_extra_deps = [ "//demo" ]# Disable treating warnings as errors
treat_warnings_as_errors = false
- 代码解释:
root_extra_deps = [ "//demo" ]
: 将//demo
目标添加到根构建目标的依赖中。//demo
表示src/demo/BUILD.gn
中定义的demo
目标。这样,在执行gn gen
时,GN 会将我们的 Demo 包含到构建图中。treat_warnings_as_errors = false
: 将此选项设置为false
可以避免一些潜在的编译警告被当作错误处理,使得编译更容易通过(在开发阶段较为实用,发布版本建议开启)。
2.3 生成构建文件并编译
现在,我们可以生成 Ninja 构建文件并执行编译了。
- 生成 Ninja 构建文件: 打开命令行工具 (例如 cmd 或 PowerShell),并切换到 Chromium 源码的
src
目录 ,执行gn gen
命令。请将xxxx
替换为你想要的构建输出目录,例如out/Default
或out/Debug
。
gn gen out/Default
- 或者(如果您之前已经生成过
out/Default
):
gn gen <xxxx>
这条命令会根据 BUILD.gn
文件生成相应的 Ninja 构建文件。
- 编译: 使用
ninja
命令进行编译:
ninja -C out/Default demo
2.4 运行 Demo
编译成功后,你会在 out/Default
目录下找到生成的可执行文件 hello_gn.exe
。
- 运行可执行文件: 在命令行中输入以下命令:
out\Default\hello_gn.exe
- 或者,你也可以直接在资源管理器中双击
hello_gn.exe
文件来运行。
如果一切顺利,你将在控制台中看到输出:
Hello GN!
恭喜你! 你已经成功构建并运行了你的第一个 GN Demo!
3. 结语
在本篇中,我们通过一个简单的 Demo 演示了如何使用 executable
目标来构建可执行文件。你学习了如何组织项目结构、编写 BUILD.gn
文件、配置构建参数以及执行编译和运行。