| # 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", |
| ] |
| } |