blob: 05c18287d8e5f48ff035c408ef75fdf0d3116a48 [file] [log] [blame]
# 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")
import("//zircon/public/gn/build_api_module.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](/docs/gen/zircon_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`](/docs/gen/zircon_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
# netsvc build.
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 = ""
# Compilation database filter. Gets passed to --export-compile-commands=<filter>.
zircon_compdb_filter = "legacy-$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](/docs/gen/zircon_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 = rebase_path(clang_prefix, "", root_build_dir)
}
variants = zircon_variants
default_deps = [
"//:legacy-$target_cpu",
"//:legacy_unification-$target_cpu",
] + zircon_extra_deps
enable_netsvc_debugging_features = zircon_enable_netsvc_debugging_features
forward_variables_from(zircon_extra_args, "*")
}
}
###
### Zircon build integration.
###
# The Zircon GN is completely a puppet of this build. This gen runs that gen.
# See also :zircon below.
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" ])
}
###
### fx integration.
###
# 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, "//", "//")
_host_out_dir = rebase_path(host_out_dir, root_build_dir)
_fx_config_lines = [
"# Generated by `gn gen`.",
"FUCHSIA_BUILD_DIR='${_relative_build_dir}'",
"FUCHSIA_ARCH='${target_cpu}'",
"FUCHSIA_BOARD_NAME=${board_name}",
"FUCHSIA_ZBI_COMPRESSION=$zbi_compression",
"HOST_OUT_DIR='${_host_out_dir}'",
]
write_file("$root_build_dir/fx.config", _fx_config_lines)
###
### Build API modules.
###
# This is the top-level build API module that just lists all the others.
# Each element of the list is the simple name of the API module; the
# module's contents are found at "$root_build_dir/$target_name.json".
#
# Type: list(string)
#
build_api_module("api") {
testonly = true
data_keys = [ "build_api_modules" ]
deps = [
":binaries",
":fuzzers",
":images",
":platforms",
":prebuilt_packages",
":tests",
":tool_paths",
":zircon",
]
}
# This describes where to find all prebuilt packages and optionally where to
# find the debug information for those packages.
#
# If debug information is present then `binaries` will point to another json
# file which is almost a subset of the format seen at //zircon:binaries except
# that `elf_build_id` is not a file pointer but instead the actual build ID.
# This binary only has the `cpu`, `debug`, `os` and modified `elf_build_id`
# fields. All fields but `elf_build_id` have the same meaning as in
# //zircon:binaries except for `elf_build_id` which has the discussed meaning.
#
# The actual prebuilt_packages api module has the following schema:
#
# Type: list(scope)
#
# archive
# Required: The path to the prebuilt fuchsia package. This is always a
# far file.
#
# binaries
# Optional: The path to the json file which has the format described
# above.
#
# debug_archive
# Optional: The path the the archive of debug binaries from which
# `binaries` was generated.
build_api_module("prebuilt_packages") {
testonly = true
data_keys = [ "prebuilt_packages" ]
deps = [
"//build/images:packages",
"//sdk",
]
}
# See //zircon:binaries for a description and schema definition.
#
build_api_module("binaries") {
testonly = true
data_keys = [ "binaries" ]
deps = [
":binaries.zircon",
"//build/images:packages",
"//sdk",
]
}
group("binaries.zircon") {
visibility = [ ":binaries" ]
zircon_entries = read_file("$zircon_root_build_dir/binaries.json", "json")
metadata = {
binaries = []
foreach(binary, zircon_entries) {
binaries += [
{
forward_variables_from(binary, "*")
label = string_replace(label, "//", "//zircon/")
if (defined(dist)) {
dist = rebase_path(dist, root_build_dir, zircon_root_build_dir)
}
if (defined(debug)) {
debug = rebase_path(debug, root_build_dir, zircon_root_build_dir)
}
if (defined(elf_build_id)) {
elf_build_id =
rebase_path(elf_build_id, root_build_dir, zircon_root_build_dir)
}
if (defined(breakpad)) {
breakpad =
rebase_path(breakpad, root_build_dir, zircon_root_build_dir)
}
},
]
}
}
}
# Describes the "fuzzers" in the build.
#
# See //build/fuzzing/fuzzer.gni for more details.
#
#
# Type: list(scope)
#
# fuzzers_package
# Required: Name of a package containing fuzzers.
# Type: string
#
# fuzzers
# Required: The fuzzer binaries included in the associated package.
# Type: list of labels
#
# fuzz_host
# Required: Indicates whether the associated fuzzer binaries were built for
# the host.
# Type: boolean
#
build_api_module("fuzzers") {
testonly = true
data_keys = [ "fuzz_spec" ]
deps = [
"//build/images:packages",
]
}
# This describes all the "image" files the build can produce.
#
# See //zircon:images for a description and partial schema definition. Fields
# additionally found in this build API module include
#
# bootserver_pave, bootserver_pave_zedboot, bootserver_netboot
# Optional: flag names under which the associated image should be passed to
# the bootserver when paving, paving zedboot, or netbooting, respectively.
# Type: list(string)
#
build_api_module("images") {
testonly = true
data_keys = [ "images" ]
deps = [
"build/images",
# TODO(fxbug.dev/9708): have this target roll up to a build API module of
# archives.
"build/images:archives",
]
}
# Describes the platforms available for testing.
#
# TODO(fxbug.dev/10429): the fuchsia platform should not know about such things.
#
# Type: list(scope)
#
build_api_module("platforms") {
testonly = true
contents = []
foreach(platform, test_platforms) {
if (!defined(platform.cpu) || platform.cpu == current_cpu) {
contents += [ platform ]
}
}
}
# See //zircon:tests for a description and schema definition.
#
build_api_module("tests") {
testonly = true
data_keys = [ "tests" ]
deps = [
"//build:tests",
"//build/images:packages",
"//sdk",
]
}
# See //zircon:tool_paths for a description and schema definition.
#
build_api_module("tool_paths") {
testonly = true
data_keys = [ "tool_paths" ]
deps = [
":tool_paths.metadata",
":tool_paths.zircon",
"//build/images:packages",
]
}
group("tool_paths.metadata") {
visibility = [ ":tool_paths" ]
prebuilt_tools = [
"//prebuilt/sdk/bazel/bazel",
"//prebuilt/third_party/rust/$host_platform/bin/cargo",
"//prebuilt/third_party/rust/$host_platform/bin/rustc",
"//prebuilt/third_party/rust/$host_platform/bin/rustdoc",
"//prebuilt/third_party/rust/$host_platform/bin/rustfmt",
"//prebuilt/third_party/clang/$host_platform/share/clang/clang-format-diff.py",
"//prebuilt/third_party/clang/$host_platform/share/clang/clang-tidy-diff.py",
"//prebuilt/third_party/go/$host_platform/bin/go",
"//prebuilt/third_party/go/$host_platform/bin/gofmt",
"//prebuilt/third_party/dart/$host_platform/bin/dartfmt",
"//prebuilt/third_party/yapf/yapf",
"//prebuilt/third_party/dart/$host_platform/bin/dart",
]
metadata = {
tool_paths = []
foreach(tool, prebuilt_tools) {
tool_paths += [
{
cpu = host_cpu
label = get_label_info(":$target_name", "label_with_toolchain")
name = get_path_info(tool, "name")
os = host_os
path = rebase_path(tool, root_build_dir)
},
]
}
}
}
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)
label = string_replace(label, "//", "//zircon/")
},
]
}
}
}
# Describes how to invoke Njnja for the Zircon build.
#
# These instructions are a prerequisite for this build.
#
# Type: scope
#
# dir
# Required: the zircon build directory root.
# Type: path relative to $root_build_dir
#
# targets
# Required: the ninja targets to execute.
# Type: list of ninja targets
#
build_api_module("zircon") {
testonly = true
contents = {
dir = rebase_path(zircon_root_build_dir, root_build_dir)
targets = [ "default" ]
}
}
###
### Top-level targets.
###
group("default") {
testonly = true
deps = [
":build_time_checks",
"//build:tests",
"//build/images:packages",
"//sdk",
]
if (base_package_labels != [] || cache_package_labels != []) {
deps += [ "//build/images" ]
}
if (universe_package_labels != []) {
deps += [ "//build/images:updates" ]
}
}
# 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
testonly = true
visibility = [ "//build/images:universe_packages" ]
public_deps = universe_package_labels
}
group("build_time_checks") {
testonly = true
deps = [
"//tools/fidlgen_llcpp_zircon:validate",
]
}
group("recovery_image") {
# TODO(fxbug.dev/37792): Investigate use of testonly here.
testonly = true
deps = [
"build/images/recovery",
]
}
group("breakpad_symbols") {
testonly = true
public_deps = [
"//build/gn:breakpad_symbols",
]
}
group("package_archive") {
testonly = true
public_deps = [
"//build/gn:package_archive",
]
}