build.gn:你必须了解的构建文件
更新:2023-05-19 15:59
在编写软件程序时,最终的目标是将代码编译成可执行的二进制文件。虽然编译器是执行此任务的核心,但构建(build)文件也是非常重要并且必需的一部分。build.gn 是 Google 的构建文件格式之一,它可以让程序员使用它来描述软件系统的构建过程并自动生成构建代码。本文将介绍 build.gn 文件的主要特点,以及如何使用它完成软件的自动化构建过程。
一、build.gn 文件
build.gn 是一个文本文件,它用来描述一个特定项目的构建流程。在 Google 中,它是 Google's Ninja build system 的一部分。具体来说,它是一种基于 Python 的类似于 Makefile 的构建系统,可以更快地执行并行化构建任务。build.gn 的特点是使用简单且易于扩展,并且可以生成快速,透明和可重现的构建。
build.gn 文件的特点如下:
- 使用简单,易于维护。
- 易于扩展和修改。
- 构建结果可重现性高。
- 支持并行化构建。
- 具有跨平台的特性。
二、build.gn 头文件共享
build.gn 文件可以包含一个或多个头文件。头文件是指包含常用定义和函数的文件,以避免意义相同的代码重复编写。使用共享头文件可以更好地组织代码并提高代码的可读性。在 build.gn 文件中使用头文件共享可以通过 include 定义来实现。下面是一个示例:
# 声明共享头文件:common.gni
define include_common
import("//common.gni")
endef
# build.gn 文件中包含共享头文件
import("//common.gni")
三、build.gn 编写
编写 build.gn 文件时,需要注意以下几点:
- 文件顶部应该包含当前项目的元数据信息。可以选择定义变量,使其易于维护。
- 使用 import 指令来导入其他文件或模块。
- 在 build.gn 文件中,使用 variables 定义变量,方便以后的管理。
- 定义 target,target 之间可以有依赖的关系。
- 定义 action 函数,可以执行一系列的 shell 命令。
除了这些常规指南外,还有如下的一些编写 tips 值得注意:
- 使用 explain 函数提供更好的用户体验。
- 提供错误信息和调试信息以便调试。
- 为特定平台和产品构建不同的目标。
- 使用 generator_functions 功能来实现高级的构建自动化。
四、build.gn 教程
Google 提供了完整的 build.gn 教程,旨在帮助开发人员快速学习该文件的主要特点,如何编写和使用它来构建项目。教程提供了许多示例和练习,用户可以跟随教程一步一步地完成。
下面是一个例子,展示如何使用 build.gn 构建一个名为 Jokes 的闪存卡游戏:
# build.gn 文件
{
name = "Jokes"
products = [ "Jokes-Mobile", "Jokes-Desktop" ]
# 手机 Jokes 的构建
executable("Jokes-Mobile") {
sources = [ "source/*" ]
defines = [ "JOKES_MOBILE" ]
output_name = "jokes-mobile"
# 将图块抖动优化通用性
cflags = [ "-O3", "-fno-strict-aliasing" ]
}
# desktop jokes 的构建
executable("Jokes-Desktop") {
sources = [ "source/*" ]
defines = [ "JOKES_DESKTOP" ]
output_name = "jokes-desktop"
# 没有抖动优化
cflags = [ "-O2" ]
}
}
五、build.gn 是什么
build.gn 是 Google 的一种开源项目构建工具,用于自动化构建软件系统并生成可执行文件。也可以说,它是一种 Makefile 的替代品。build.gn 是 Ninja 构建系统的一部分,它广泛用于 Google 内部的项目构建和管理。
六、build.gn 语法解析
build.gn 文件的基本语法如下:
- 每个语句必须以分号结尾。
- 使用空格或缩进来表示代码块。
- 使用 # 来注释。
- 支持 String,List 和 Dictionary 数据类型。
下面是一个简单的示例:
example_variable = 'Hello, world!'
example_target('foo') {
sources = [ 'main.c', 'common.c' ]
defines = [ 'USE_COMMON' ]
includes = [ '//path/to/common/includes' ]
cflags = [ '-Wall', '-Werror' ]
}
七、build.gn 指定头文件
可以使用 include_dirs 变量指定搜索头文件的目录。下面是一个示例:
example_dir = "//path/to/includes"
my_targets = [ 'foo', 'bar', 'baz' ]
foreach(target, my_targets) {
sources = [ 'main.c' ]
include_dirs = [ example_dir ]
cflags = [ '-Wall', '-Werror' ]
}
八、build.gn 不写能否 include
如果在 build.gn 文件中没有包含任何头文件,那也是合法的。当仅使用预定义操作和变量时,不需要包含任何其他文件或包。
下面是一个简单的示例:
ninja_required_version = 1.3
cflags_cc = [ "-Wall", "-std=c++11" ]
ldflags = [ "-lm", "-lpthread" ]
executable("example") {
sources = [ "main.cc" ]
}
九、build.gn 的作用
build.gn 可以用于自动化构建项目,即通过描述项目的编译和构建过程,自动生成完整的构建代码。使用 build.gn 可以轻松管理庞大的代码库以及依赖系统,并且可以自动化构建和测试操作。
十、build.gn config选取
在 build.gn 文件中可以使用 config 模块来定义平台和产品特定的构建变量。例如,下面的 build.gn 文件使用 config 模块定义了特定于 Windows/ChromeOS 平台的变量:
use_staging_server = !is_chromeos && value_of("is_debug") == "true"
is_chromeos = defined("chromeos")
is_windows = defined("win")
if (is_chromeos) {
my_sources += [ "chromeos/*.c" ]
my_defines += [ "USE_CHROMEOS" ]
my_cflags += [ "-Os" ]
}
if (is_windows) {
my_sources += [ "win32/*.c" ]
my_defines += [ "USE_WINDOWS" ]
my_cflags += [ "-O2" ]
}
使用 config 模块可以更好地定义和管理平台和产品的特定构建选项。
结语
通过本文的介绍,相信读者们已经了解了 build.gn 文件的主要特点以及使用它进行自动化软件构建的方法。在软件工程中,自动化构建是非常重要的一部分,使用 build.gn 可以提高软件开发的效率和质量。希望本文能够帮助读者更好地掌握 build.gn 文件的使用,更加高效地完成软件开发任务。