forked from OpenTrustGroup/fuchsia
-
Notifications
You must be signed in to change notification settings - Fork 0
/
BUILD.gn
286 lines (255 loc) · 9.77 KB
/
BUILD.gn
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
# Copyright 2019 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import("//build/board.gni")
import("//build/config/fuchsia/zbi.gni")
import("//build/config/fuchsia/zircon.gni")
import("//build/testing/platforms.gni")
import("//build/toolchain/ccache.gni")
import("//build/toolchain/goma.gni")
declare_args() {
# If you add package labels to this variable, the packages will be included in
# the 'base' package set, which represents the set of packages that are part
# of an OTA. These pacakages are updated as an atomic unit during an OTA
# process and are immutable and are a superset of the TCB (Trusted Computing
# Base) for a product. These packages are never evicted by the system.
base_package_labels = []
# If you add package labels to this variable, the packages will be included
# in the 'cache' package set, which represents an additional set of software
# that is made available on disk immediately after paving and in factory
# flows. These packages are not updated with an OTA, but instead are updated
# ephemerally. This cache of software can be evicted by the system if storage
# pressure arises or other policies indicate.
cache_package_labels = []
# If you add package labels to this variable, the packages will be included
# in the 'universe' package set, which represents all software that is
# produced that is to be published to a package repository or to the SDK by
# the build. The build system ensures that the universe package set includes
# the base and cache package sets, which means you do not need to redundantly
# include those labels in this variable.
universe_package_labels = []
# [Zircon GN build arguments](../../zircon/docs/gen/build_arguments.md).
# This is included in the default value of [`zircon_args`](#zircon_args) so
# you can set this to add things there without wiping out the defaults.
# When you set `zircon_args` directly, then this has no effect at all.
# Arguments you set here override any arguments in the default
# `zircon_args`. There is no way to append to a value from the defaults.
# Note that for just setting simple (string-only) values in Zircon GN's
# [`variants`](../../zircon/docs/gen/build_arguments.md#variants), the
# default [`zircon_args`](#zircon_args) uses a `variants` value derived from
# [`select_variant`](#select_variant) so for simple cases there is no need
# to explicitly set Zircon's `variants` here.
zircon_extra_args = {
}
# Additional Zircon GN labels to include in the Zircon build.
zircon_extra_deps = []
# Whether to include various features (non-shipping, insecure, etc.) in the
# kernel or netsvc builds.
zircon_enable_kernel_debugging_features = false
zircon_enable_netsvc_debugging_features = false
# Where to emit a tracelog from Zircon's GN run. No trace will be produced if
# given the empty string. Path can be source-absolute or system-absolute.
zircon_tracelog = ""
# Compliation database filter. Gets passed to --export_compile_commands=<filter>.
# Default is $target_cpu.
zircon_compdb_filter = target_cpu
}
zircon_variants = []
foreach(selector, select_variant) {
if (selector == "$selector") {
zircon_variants += [ selector ]
}
}
# Separate block because zircon_* declared above are used in the default.
declare_args() {
# [Zircon GN build arguments](../../zircon/docs/gen/build_arguments.md).
# The default passes through GOMA/ccache settings and
# [`select_variant`](#select_variant) shorthand selectors.
# **Only set this if you want to wipe out all the defaults that
# propagate from Fuchsia GN to Zircon GN.** The default value
# folds in [`zircon_extra_args`](#zircon_extra_args), so usually
# it's better to just set `zircon_extra_args` and leave `zircon_args` alone.
# Any individual Zircon build argument set in `zircon_extra_args` will
# silently clobber the default value shown here.
zircon_args = {
use_ccache = use_ccache
use_goma = use_goma
goma_dir = rebase_path(goma_dir)
zbi_compression = zbi_compression
if (clang_prefix != default_clang_prefix) {
# Propagate a custom value to override Zircon's default. But don't
# propagate the default because Zircon has proper incremental build
# dependencies on toolchain updates only if it knows it's using the
# prebuilt.
clang_tool_dir = clang_prefix
}
variants = zircon_variants
default_deps = [ "//:legacy-$target_cpu" ] + zircon_extra_deps
enable_kernel_debugging_features = zircon_enable_kernel_debugging_features
enable_netsvc_debugging_features = zircon_enable_netsvc_debugging_features
forward_variables_from(zircon_extra_args, "*")
}
}
# The Zircon GN is completely a puppet of this build. This gen runs that gen.
if (current_toolchain == default_toolchain) {
# First run Zircon's `gn gen`. By GN evaluation order this is roughly
# the first thing that happens at all and it's synchronous so after this
# point we can read in files written by this gen step.
gn_cmd = [
"gen",
"-q",
"--root=" + rebase_path("//zircon", root_build_dir),
"--args=# THIS FILE IS CLOBBERED. DO NOT EDIT!$0x0a" +
"# Instead, edit $root_build_dir/args.gn to add$0x0a" +
"# zircon_extra_args = { ... } to override settings below.$0x0a" +
"forward_variables_from($zircon_args, \"*\")",
"--export-compile-commands=$zircon_compdb_filter",
rebase_path(zircon_root_build_dir, root_build_dir),
]
if (zircon_tracelog != "") {
gn_cmd += [ "--tracelog=" + rebase_path(zircon_tracelog, root_build_dir) ]
}
exec_script("//prebuilt/third_party/gn/${host_platform}/gn", gn_cmd)
exec_script("//build/zircon/populate_zircon_public.py",
[ rebase_path("$zircon_root_build_dir/legacy_dirs.json") ],
"",
[ "$zircon_root_build_dir/legacy_dirs.json" ])
# This file indicates what Ninja invocation must be done to build Zircon
# prerequisites before *any* Ninja invocation for this build.
write_file("$root_build_dir/zircon.json",
{
dir = rebase_path(zircon_root_build_dir, root_build_dir)
targets = [ "default" ]
},
"json")
}
# Write a file that can be sourced by `fx`. This file is produced
# by `gn gen` and is not known to Ninja at all, so it has nothing to
# do with the build itself. Its sole purpose is to leave bread
# crumbs about the settings `gn gen` used for `fx` to use later.
_relative_build_dir = rebase_path(root_build_dir, "//", "//")
_fx_config_lines = [
"# Generated by `gn gen`.",
"FUCHSIA_BUILD_DIR='${_relative_build_dir}'",
"FUCHSIA_ARCH='${target_cpu}'",
"FUCHSIA_ZBI_COMPRESSION=$zbi_compression",
]
write_file("$root_build_dir/fx.config", _fx_config_lines)
# Permit dependencies on testonly targets from packages.
testonly = true
group("default") {
deps = [
":build_time_checks",
"//build/images:packages",
"//sdk",
]
if (base_package_labels != [] || cache_package_labels != []) {
deps += [ "//build/images" ]
}
if (universe_package_labels != []) {
deps += [ "//build/images:updates" ]
}
}
group("build_time_checks") {
deps = [
"//tools/fidlgen_llcpp_zircon:validate",
]
}
group("recovery_image") {
deps = [
"build/images/recovery",
]
}
# TODO(joshuaseaton|mcgrathr): Make this a formal build_api_module().
#
# Aggregates metadata about all tests within the build graph to create a
# top-level manifest.
generated_file("tests") {
outputs = [
"$root_build_dir/tests.json",
]
data_keys = [ "test_spec" ]
output_conversion = "json"
deps = [
"//build/images:packages",
"//sdk",
]
}
group("tool_paths.zircon") {
visibility = [ ":tool_paths" ]
zircon_entries = read_file("$zircon_root_build_dir/tool_paths.json", "json")
metadata = {
tool_paths = []
foreach(tool, zircon_entries) {
tool_paths += [
{
forward_variables_from(tool, "*")
path = rebase_path(path, root_build_dir, zircon_root_build_dir)
},
]
}
}
}
# Aggregates metadata about the paths of tools within the build graph.
# See documentation at //zircon:tool_paths for a similar file with
# identical schema.
generated_file("tool_paths") {
outputs = [
"$root_build_dir/tool_paths.json",
]
data_keys = [ "tool_paths" ]
output_conversion = "json"
deps = [
":tool_paths.zircon",
"//build/images:packages",
"//sdk",
]
}
# Aggregates metadata about all fuzz targets within the build graph to create a
# top-level manifest.
generated_file("fuzzers") {
outputs = [
"$root_build_dir/fuzzers.json",
]
data_keys = [ "fuzz_spec" ]
output_conversion = "json"
deps = [
"//build/images:packages",
]
}
group("breakpad_symbols") {
public_deps = [
"//build/gn:breakpad_symbols",
]
}
group("package_archive") {
public_deps = [
"//build/gn:package_archive",
]
}
# Generates a JSON manifest of the platforms available for testing, along with
# their properties.
target_platforms = []
foreach(platform, test_platforms) {
if (!defined(platform.cpu) || platform.cpu == current_cpu) {
target_platforms += [ platform ]
}
}
write_file("$root_build_dir/platforms.json", target_platforms, "json")
# These groups exist at the root of the build so relative labels specified
# through GN args are interpreted as if they were absolute.
group("additional_base_packages") {
testonly = true
visibility = [ "//build/images:base_packages" ]
public_deps = base_package_labels + board_package_labels
}
group("additional_cache_packages") {
testonly = true
visibility = [ "//build/images:cache_packages" ]
public_deps = cache_package_labels
}
group("additional_universe_packages") {
testonly = true
visibility = [ "//build/images:universe_packages" ]
public_deps = universe_package_labels
}