blob: 678bcaa5a0ee157c261642e775058c11dd47459b [file] [log] [blame]
# Copyright 2016 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/compiled_action.gni")
import("//build/config/fuchsia/zircon.gni")
import("//build/gn/packages.gni")
import("//build/package.gni")
import("//build/testing/platforms.gni")
import("//build/toolchain/goma.gni")
# Permit dependencies on testonly targets from packages.
testonly = true
group("packages") {
deps = available_packages
data_deps = package_data_deps
}
group("default") {
deps = [
":host_tests",
":packages",
]
if (preinstall_packages != [] || monolith_packages != []) {
deps += [ "//build/images" ]
}
if (available_packages != []) {
deps += [ "//build/images:updates" ]
}
}
# Instantiate the packages synthesized from the build argument.
foreach(pkg, synthesize_packages) {
package(pkg.name) {
forward_variables_from(pkg, "*", [ "name" ])
}
}
# Copy host test binaries to $root_build_dir/host_tests.
# TODO(IN-819): Delete this copy target once host tests are no longer run out
# of a single directory.
if (package_host_tests != []) {
copy("host_tests") {
deps = []
sources = []
bindir = get_label_info("//anything($host_toolchain)", "root_out_dir")
# package_host_tests may contain duplicate entries. Those entries must be
# de-duplicated here to avoid output collisions.
foreach(label, package_host_tests) {
_full_label = "$label($host_toolchain)"
deps += [ _full_label ]
binary = get_label_info(label, "name")
sources += [ "$bindir/$binary" ]
}
outputs = [
"$root_build_dir/host_tests/{{source_file_part}}",
]
}
} else {
group("host_tests") {
}
}
# Write a JSON metadata file about the host tests in the build.
host_tests = []
foreach(label, package_host_tests) {
host_label = "$label($host_toolchain)"
host_tests += [
{
dir = get_label_info(host_label, "dir")
name = get_label_info(host_label, "name")
build_dir = rebase_path(get_label_info(host_label, "target_out_dir"),
root_build_dir)
},
]
}
write_file("$root_build_dir/host_tests.json", host_tests, "json")
# Collect the source files that are dependencies of the create_gn_rules.py
# script, below. Unfortunately, exec_script cannot use a depfile produced
# by the script and only supports a separately computed list of dependencies.
zircon_files =
exec_script("//build/zircon/list_source_files.py", [], "list lines")
supporting_templates = [
"//build/zircon/boards.mako",
"//build/zircon/header.mako",
"//build/zircon/host_tool.mako",
"//build/zircon/main.mako",
"//build/zircon/shared_library.mako",
"//build/zircon/source_library.mako",
"//build/zircon/static_library.mako",
"//build/zircon/sysroot.mako",
]
# The following script generates GN build files for Zircon objects. It is
# placed before everything else so that //zircon targets are available in
# due time. See //build/zircon/README.md for more details.
exec_script("//build/zircon/create_gn_rules.py",
[
"--out",
rebase_path("//zircon/public"),
"--staging",
rebase_path("$root_out_dir/zircon-gn"),
"--zircon-user-build",
rebase_path(zircon_build_abi_dir),
"--zircon-tool-build",
rebase_path("$zircon_tools_dir/.."),
"--make",
zircon_make_path,
],
"",
zircon_files + supporting_templates)
# 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}'",
]
if (use_goma) {
_fx_config_lines += [
"# This will affect Zircon's make via //scripts/build-zircon.sh.",
"export GOMACC='${goma_dir}/gomacc'",
]
}
_fx_build_zircon_args = ""
if (zircon_use_asan) {
_fx_build_zircon_args += " -A"
}
foreach(selector, select_variant) {
if (selector == "host_asan") {
_fx_build_zircon_args += " -H"
}
}
if (_fx_build_zircon_args != "") {
_fx_config_lines += [ "FUCHSIA_BUILD_ZIRCON_ARGS=($_fx_build_zircon_args)" ]
}
write_file("$root_build_dir/fx.config", _fx_config_lines)
# Generates breakpad symbol data for unstripped binaries.
#
# This symbol data is consumed by infrastructure tools and uploaded to Crash
# servers to enable crash reporting. These files are uniquely important for
# release builds and this step may take a few minutes to complete, so it is
# not recommended that this be included in the default build.
action("breakpad_symbols") {
testonly = true
script = "//buildtools/${host_platform}/dump_breakpad_symbols"
deps = [
"//build/images:ids.txt",
]
inputs = [
"//buildtools/${host_platform}/dump_syms/dump_syms",
]
sources = [
"$root_out_dir/ids.txt",
]
# This action generates a single xxx.sym file for each binary in the ids file
# and produces an archived output of them all.
outputs = [
"$root_out_dir/breakpad_symbols/breakpad_symbols.tar.gz",
]
depfile = "${outputs[0]}.d"
args = [
"-out-dir",
rebase_path("$root_out_dir/breakpad_symbols"),
"-dump-syms-path",
rebase_path("//buildtools/${host_platform}/dump_syms/dump_syms"),
"-depfile",
rebase_path(depfile, root_build_dir),
"-tar-file",
rebase_path(outputs[0], root_build_dir),
] + rebase_path(sources, root_build_dir)
}
# Generates an archive of package metadata.
amber_files = rebase_path("$root_build_dir/amber-files")
host_out_dir = get_label_info("//anything($host_toolchain)", "root_out_dir")
pm_tool = rebase_path("$host_out_dir/pm")
pkg_archive_contents = [
"amber-files/repository=$amber_files/repository",
# TODO(IN-915): this should never contain the root key. In the future, this
# should contain no keys, once infra is managing key material itself.
# These keys are consumed by the infra train promote scripts.
"amber-files/keys=$amber_files/keys",
"pm=$pm_tool",
]
pkg_archive_manifest = "$target_gen_dir/package_archive_manifest"
write_file(pkg_archive_manifest, pkg_archive_contents)
pkg_archive = "$root_build_dir/packages.tar.gz"
compiled_action("package_archive") {
testonly = true
tool = "//build/tools/tar_maker"
inputs = [
pkg_archive_manifest,
]
outputs = [
pkg_archive,
]
args = [
"-manifest",
rebase_path(pkg_archive_manifest),
"-output",
rebase_path(pkg_archive),
]
deps = [
"//build/images:updates",
]
}
# 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")