# 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/compiled_action.gni")
import("//build/config/build_api_module.gni")
import("//build/config/compiler.gni")
import("//build/drivers/check_included_drivers.gni")
import("//build/drivers/create_all_drivers_doc.gni")
import("//build/images/args.gni")
import("//build/info/info.gni")
import("//build/product.gni")
import("//build/rust/config.gni")
import("//build/security.gni")
import("//build/testing/platforms.gni")
import("//build/testing/validated_test_types_group.gni")
import("//build/toolchain/goma.gni")
import("//build/toolchain/rbe.gni")
import("//build/toolchain/zircon/clang.gni")
import("//build/zbi/zbi.gni")

declare_args() {
  ## NOTE:  The "legacy_*" versions of these args are part of multi-month
  #         transition to using product assembly and separate the definition of
  #         the platform from the definition of the product.
  #
  #         These args replace the use of the non-"legacy_" prefixed arg
  #         throughout the product definition files (//products/**/*.gni).
  #
  #  NOTE:  These "legacy_*" args will go away when the long-term transition to
  #         product assembly is complete, and they should not be relied upon
  #         within developer's own args.gn files or BUILD.gn files.

  # If you add fuchsia_driver_package labels to this variable, any drivers in these packages will
  # be visible to Driver Manager. These package labels are also considered to be in the
  # 'base' package set (for more info see 'base_package_labels').
  base_driver_package_labels = []

  # 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 packages 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 = []
  legacy_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 updated with an OTA, and can also be updated
  # ephemerally. This cache of software can be evicted by the system if storage
  # pressure arises or other policies indicate.
  cache_package_labels = []
  legacy_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 = []

  # If you add package labels to this variable, the packages will be included in
  # the 'discoverable' package set, as defined by RFC-0212 "Package Sets":
  # https://fuchsia.dev/fuchsia-src/contribute/governance/rfcs/0212_package_sets
  #
  # They will be compiled, and published, but not added as dependencies of the
  # assembled images, and so will not be able to cause the inclusion of
  # 'config_data' or 'shell_command' entries.
  #
  # As these cannot be part of the legacy AIB for a product, there is no
  # "legacy" version of this argument.
  discoverable_package_labels = []

  # These are arguments used by Infra (and 'fx set') to add tests to a build
  # configuration without necessarily adding them to the assembled product, and
  # validating that they only contain tests of the type in their name.

  # Fully hermetic tests (both by packaging and at runtime)
  hermetic_test_package_labels = []

  # Non-hermetic tests (at runtime).  Non-test packages found in this group will
  # be flagged as an error by the build.
  test_package_labels = []

  # Host-driven, "end-to-end" tests that run on a Fuchsia image (either real
  # hardware or emulated).
  e2e_test_labels = []

  # Host-only tests.  These cannot have any dependency on an assembled platform
  # image, or the compiled OS itself, not even for their host_test_data().
  #
  # These will be added to the build using the host toolchain.
  host_test_labels = []

  # A developer-only argument that is used to add tests to the build without
  # going through the test-type validate that the above sets of tests are.
  # These are always a dependency of the main product assembly.
  developer_test_labels = []

  # If you add labels to this variable, these will be included in the 'host'
  # artifact set, which represents an additional set of host-only software that
  # is produced by the build.
  #
  # These will be added to the build using the host toolchain.
  host_labels = []

  # A file containing historical test duration data for this build
  # configuration, used used by testsharder to evenly split tests across
  # shards. It should be set for any builds where testsharder will be run
  # afterwards.
  test_durations_file = ""

  # Extra idk_archive() labels to be uploaded to the artifacts store. This is an
  # extension mechanism for IDK bits outside of the main repository.
  sdk_archive_labels = []
}

if (host_os == "mac") {
  import("//build/config/mac/mac_sdk.gni")
}

assert(
    current_toolchain == default_toolchain,
    "The root build file (//BUILD.gn) can only be processed in the `default_toolchain`.")

###
### 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_PRODUCT_NAME=${build_info_product}",
  "FUCHSIA_BOARD_NAME=${board_name}",
  "FUCHSIA_ZBI_COMPRESSION=zstd",
  "HOST_OUT_DIR='${_host_out_dir}'",
  "USE_GOMA=$use_goma",
]
if (use_goma && goma_dir != prebuilt_goma_dir) {
  _fx_config_lines += [ "GOMA_DIR=" + rebase_path(goma_dir) ]
}
write_file("$root_build_dir/fx.config", _fx_config_lines)
generated_file("default_toolchain_name.txt") {
  outputs = [ "$root_build_dir/default_toolchain_name.txt" ]
  contents = default_toolchain
}

###
### 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 = [
    ":all_package_manifest_paths",
    ":archives",
    ":args",
    ":assembly_input_archives",
    ":assembly_manifests",
    ":bazel_build_events_logs",
    ":bazel_sdk_info",
    ":binaries",
    ":boards",
    ":build_info",
    ":checkout_artifacts",
    ":cipd_assembly_artifacts",
    ":clippy_target_mapping",
    ":delivery_blob_config",
    ":detailed_size_checker_data",
    ":fuzzers",
    ":generated_sources",
    ":gerrit_size_report",
    ":golden_files",
    ":images",
    ":licenses",
    ":package-repositories",
    ":platforms",
    ":prebuilt_binaries",
    ":prebuilt_package_flavors",
    ":product_bundles",
    ":product_size_checker_output",
    ":rbe_config",
    ":sdk_archives",
    ":test_components",
    ":test_durations",
    ":test_list_location",
    ":tests",
    ":tool_paths",
    ":triage_sources",
    ":vnames_config",
    "//build/images/archive",
    "//sdk:sdk_source_set_list",
    "//sdk/ctf:ctf_artifacts",
  ]
}

if (current_toolchain == default_toolchain) {
  # This target is used to generate, at `gn gen` time a file
  # that is exclusively used by //build/api/client.py.
  # NOTE: nothing should depend on this target.
  generated_file("build_api_client_info") {
    deps = [ "//:api" ]
    outputs = [ "$root_build_dir/build_api_client_info" ]
    data_keys = [ "build_api_client_info" ]
    walk_keys = [ "build_api_client_info_barrier" ]
    testonly = true
    visibility = []  # Empty on purpose
  }

  # This target generates a file that contains the path to the build API client
  # script, relative to the build directory (e.g. '../../build/api/client').
  #
  # Many tools that process the build API files only have a path to the build
  # directory, and do not know where the Fuchsia source directory itself is
  # located. By reading this file, they can retrieve this information easily,
  # without relying on fragile heuristics. This file should always be
  # generated at `gn gen` time, and nothing should depend on it.
  generated_file("build_api_client_path") {
    # IMPORTANT: Do not include a newline at the end of "contents"
    contents = rebase_path("//build/api/client", root_build_dir)
    outputs = [ "$root_build_dir/build_api_client_path" ]
    visibility = []  # Empty on purpose.
  }
}

# This describes the location of the package repository, in:
#  "$root_build_dir/package-repositories.json"
#
# Type: list(scope)
#
#   path
#     Required: Path to the package repository, relative to $root_build_dir.
#     Type: path relative to $root_build_dir
#
#   targets
#     Required: Path to the targets.json file with the contents in this
#       package repository, relative to $root_build_dir.
#     Type: path relative to $root_build_dir
#
#   blobs
#     Required: Path to the blobs directory in this package repository,
#       relative to $root_build_dir.
#     Type: path relative to $root_build_dir
#
build_api_module("package-repositories") {
  testonly = true
  data_keys = [ "package_repository" ]
  deps = [ "//build/images/updates" ]
}

# This describes all the archives the build can produce, in:
# "$root_build_dir/archives.json"
#
# TODO(https://fxbug.dev/42119886): Delete me ASAP. Archives are targets that necessarily
# depend on 'everything'; targets like this should be migrated away from.
#
# Type: list(scope)
#
#   name
#     Required: The primary way that this archive is known to consumers.
#     The tuple of ($name, $type) should be unique.
#     Type: string
#
#   path
#     Required: Path to where the archive is found, relative to $root_build_dir.
#     Type: path relative to $root_build_dir
#
#   type
#     Required: "zip" or "tgz".
#     Type: string
#
build_api_module("archives") {
  testonly = true
  data_keys = [ "archives" ]
  deps = [
    "//build/gn:archives",
    "//build/images/archive",
  ]
}

# TODO(crbug.com/gn/132): Remove when GN emits the equivalent information
# itself.
#
# in file: "$root_build_dir/args.json"
#
# This just regurgitates the build arguments specified to `gn gen`.  This is
# the exact JSON representation of the settings in "$root_build_dir/args.gn".
# It does not include build arguments left to their default values.  So to
# reproduce the settings of this build, one could put in `args.gn`:
# ```
#   forward_variables_from(read_file("args.json", "json"), "*")
# ```
# Type: scope
#
build_api_module("args") {
  contents = read_file("$root_build_dir/args.gn", "scope")
}

# Describes the location where the Bazel SDK is generated.
#
# See //build/bazel:generate_fuchsia_sdk_repository for more details.
#
#
# Type: list(scope)
#
#  location
#    Required: Directory where the Bazel SDK is generated
#    Type: string
#
#
build_api_module("bazel_sdk_info") {
  testonly = true
  data_keys = [ "bazel_sdk_info" ]
  deps = [ "//build/bazel:generate_fuchsia_sdk_repository" ]
}

# Describes the location of Bazel build events log files
# for all Bazel invocations from Ninja. For context, see
# https://bazel.build/remote/bep
#
# Type: list(scope)
#
#  gn_label
#    Required: GN label of action invoking a Bazel build command.
#    Type: string
#
#  build_events_log
#    Required: Path to build event log file.
#    Type: Path relative to build directory.
#
#  format
#    Required: Format of log file, can be "binary", "text" or "json"
#    Type: string
#
#
build_api_module("bazel_build_events_logs") {
  testonly = true
  data_keys = [ "bazel_build_events_log" ]
  deps = [
    ":default",
    "//build/bazel/bazel_sdk:bazel_sdk_tests",
  ]
}

# This describes all the binaries linked by the build.
#
# This enumerates each linked binary (executable, shared library, or
# loadable/"plug-in" module) used by the build, or produced by the build.
#
# This includes host tools, kernels, boot loaders, drivers, as well as
# normal executables. This also includes prebuilt toolchain runtime
# libraries that end up in image files. It does not yet include any
# non-native binary formats.
#
# For non-prebuilts, this is meant to reach the entire dependency graph
# of all binaries that the build would ever produce.  Not every binary
# described is necessarily actually produced by any given Ninja run.  Either
# the $debug or the $dist file for any individual binary can be passed to
# Ninja as a specific target argument to ensure it's built and
# up to date before making use of that binary.  Like all build_api_module()
# targets, the top-level "binaries" target serves as a Ninja target to
# request that every binary described be built.
#
# Note that in certain cases, the paths in `debug` and `dist` will
# point out of the build tree, and thus cannot be used as Ninja targets.
# This happens for prebuilts or binaries produced by the Zircon build.
#
# Type: list(scope)
#
#   cpu
#     Required: CPU architecture the binary is for, e.g. "arm64" or "x64".
#     Type: string
#
#   os
#     Required: OS the binary is for, e.g. "fuchsia", "linux", or "mac".
#     Type: string
#
#   environment
#     Required: The ${toolchain_environment} name of what specific
#     execution this was built for, e.g. "user", "host", "guest".  The
#     tuple of ($cpu, $os, $environment) should indicate what hardware and
#     software environment this binary is compatible with.
#     Type: string
#
#   label
#     Required: The GN label of the binary target.
#     Type: label_with_toolchain
#
#   type
#     Required: The type of binary.
#     Type: "executable" or "shared_library" or "loadable_module"
#
#   debug
#     Required: Path to where the unstripped or separate debug file is
#     found, relative to $root_build_dir.  If $dist is omitted, this
#     is also the file that is used at runtime.
#     Type: path relative to $root_build_dir
#
#   dist
#     Optional: Path to where the stripped binary for deployment/execution is
#     found, relative to $root_build_dir.  This binary may be required for
#     some debugging tasks if $debug is a separate debug file rather than
#     an unstripped file.  It should exactly match the binary that will be
#     seen on devices or run directly on hosts.
#     Type: path relative to $root_build_dir
#
#   elf_build_id
#     Optional: Path to a file containing the lowercase ASCII hexadecimal
#     representation of the ELF build ID in this binary.  This is omitted
#     for OS environments that don't use ELF.  For an ELF binary that
#     doesn't have a build ID note, this key will be present but point to
#     an empty file.
#     Type: path relative to $root_build_dir
#
#   breakpad
#     Optional: Path to the breakpad symbol file for the debug binary.  This
#     will only be present if $output_breakpad_syms was set.
#     Type: path relative to $root_build_dir
build_api_module("binaries") {
  testonly = true
  data_keys = [ "binaries" ]
  deps = [ ":default" ]
}

# Lists the board configurations that are defined in this build.
#
# Type: list (scope)
#
#  label
#    Required: The GN label for the board_configuration target
#
#  outdir
#    Required: The path (relative to the root out dir) of the directory that
#    contains the board configuration.
#
build_api_module("boards") {
  testonly = true
  data_keys = [ "board_configs" ]
  deps = [ "//boards" ]
}

# Lists the board input bundles that are defined in this build.
#
# Type: list (scope)
#
#  label
#    Required: The GN label for the board_configuration target
#
#  outdir
#    Required: The path (relative to the root out dir) of the directory that
#    contains the board input bundle.
#
build_api_module("board_input_bundles") {
  testonly = true
  data_keys = [ "board_input_bundles" ]
  deps = [ "//boards" ]
}

# Describes the configuration of the build in the file:
#  "$root_build_dir/build_info.json"
#
# Type: list(scope)
#
#   version
#     Optional: The version of the build. Present during official builds.
#     Type: string
#
#   configurations
#     Required: The list of product/board configurations within the build.
#     Each `configurations` entry is a scope that contains both a product
#     and board specification.
#     Type: list(scope)
#
build_api_module("build_info") {
  testonly = true
  contents = {
    version = build_info_version

    # A list to accommodate the future of a build that support building multiple
    # (board, product) pairs.
    configurations = [
      {
        board = build_info_board
        product = build_info_product
      },
    ]
  }
}

# Artifacts from the checkout. Though a priori unrelated to the build, they are
# useful to track here.
#
# in file: "$root_build_dir/checkout_artifacts.json"
#
# Type: list(scope)
#
#   name
#     Required: The primary way that this file is known to consumers.
#     The name should be unique among other entries.
#     Type: string
#
#   path
#     Required: Path to where the file is found, relative to $root_build_dir.
#     Type: path relative to $root_build_dir
#
#   type
#     Required: The file format (e.g., "txt" or "xml").
#     Type: string
#
build_api_module("checkout_artifacts") {
  testonly = true
  data_keys = [ "checkout_artifacts" ]
  deps = [ ":checkout_artifacts.metadata" ]
}

group("checkout_artifacts.metadata") {
  testonly = true
  visibility = [ ":checkout_artifacts" ]
  metadata = {
    checkout_artifacts = [
      {
        # TODO(https://fxbug.dev/42119886): Remove `archive` field. This is a signal to
        # include the this file in the archive.
        archive = true
        name = "jiri_snapshot"
        path = rebase_path("//.jiri_root/update_history/latest", root_build_dir)
        type = "xml"
      },
      {
        name = "ssh_authorized_key"
        path = rebase_path("//.ssh/authorized_keys", root_build_dir)
        type = "txt"
      },
      {
        name = "ssh_private_key"
        path = rebase_path("//.ssh/pkey", root_build_dir)
        type = "txt"
      },
    ]
  }
}

# This describes all the generated source files in the build.
#
# The intent is that telling Ninja to build all these individual files
# will be the minimal work sufficient for source code analysis of all
# the files described in the compilation database to be viable.
#
# Type: list(path relative to $root_build_dir)
#
build_api_module("generated_sources") {
  testonly = true
  data_keys = [ "generated_sources" ]
  deps = [
    "//build/images/updates:packages",
    "//sdk",
  ]
}

# This describes all golden files in the build, as defined by `golden_files()`.
#
# Type: list(scope)
#
#  * name
#    - Required: The name of the target defining the golden files.
#    - Type: string
#
#  * label
#    - Required: The label toolchain of the associated target.
#    - Type: label_with_toolchain
#
#  * stamp
#    - Required: The stamp file of the associated diff check.
#    - Type: build directory -relative path
#
#  * files
#    - Required: The associated golden file comparisons.
#    - Type: list(scope)
#
#    Each scope contains:
#
#    * golden
#      - Required: A golden file.
#      - Type: source-relative path
#
#    * candidate
#      - Required: The candidate version of the file, to be compared against the
#        golden.
#      - Type: build directory -relative path
#
build_api_module("golden_files") {
  testonly = true
  data_keys = [ "golden_files" ]
  deps = [ ":default" ]
}

# This exposes the value of delivery_blob_type to artifactory after the build.
#
# Type: scope
#
# * type
#   - Required: Value of delivery_blob_type for this build configuration.
#   - Type: integer
#
build_api_module("delivery_blob_config") {
  contents = {
    type = delivery_blob_type
  }
}

# Describes the "fuzzers" in the build, in the file:
#  "$root_build_dir/fuzzers.json"
#
# See //build/fuzzing/fuzzer.gni for more details.
#
#
# Type: list(scope)
#
#  fuzzer_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/updates:packages" ]
}

# This describes all the "image" files the build can produce, in the file:
#  "$root_build_dir/images.json"
#
# An "image file" is a binary file that typically ends up on a device
# partition (e.g. kernel, boot loader, partition image, etc).
#
# Consumers of the build should look here for the images to be built.
# The $cpu, $name, and $type fields identify the purpose of each image.
# Consumers are expected to ignore extra images they have no use for or
# whose fields they don't understand.
#
# The $path field indicates where the file is found in the build
# directory.  The presence of an image in the list means that the build
# *can* produce it, not that the build *will* produce it.  Hence,
# consumers should use $path as an explicit argument to Ninja to ensure
# that each needed image gets built.
#
# Type: list(scope)
#
#   cpu
#     Required: CPU architecture the image is for, e.g. "arm64" or "x64".
#     Type: string
#
#   name
#     Required: The primary way that this image is known to consumers.
#     Note that the name need not be unique within the images list.
#     The tuple of ($name, $type, $cpu) should be unique.
#     Type: string
#
#   fastboot_flash
#     Optional: the partition(s) to fastboot flash this image to. As a special
#     case, this can be an empty list to indicate a file that may be needed for
#     flashing but doesn't necessarily get flashed to a partition, for example
#     bootloader unlock credentials.
#     Type: list(string)
#
#   label
#     Required: The GN label of the image target.
#     Type: label_with_toolchain
#
#   path
#     Required: Path to where the file is found, relative to $root_build_dir.
#     This is also the argument to Ninja that ensures this image will be built.
#     Type: path relative to $root_build_dir
#
#   testonly
#     Optional: This image includes test code/data not meant for production.
#     Type: bool
#     Default: false
#
#   tags
#     Optional: Tags associated with the image.  Certain tags may indicate
#     to the build API consumer what should be done with the image.
#     Type: list(string)
#
#   type
#     Required: Type of file, e.g. "zbi".  This often corresponds to the
#     extension used on the image file name, but not always.  For many
#     miscellaneous formats, this is just "bin" and the consumer is
#     expected to understand what the particular format is for particular
#     $name, $cpu combinations.  Other types include:
#      * "zbi": the ZBI (<lib/zbi-format/zbi.h>) format
#      * "efi": an EFI executable that an EFI boot loader can load
#      * "kernel": some other format loaded by a boot loader or emulator
#      * "blk": contents to be written to a storage device or partition
#     Type: string
#
#   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)
#
#   archive
#     Optional: Set to true to indicate this image should be part of
#     the build archives generated by //build/images/archive.
#     Type: bool
#     Default: false
#
build_api_module("images") {
  testonly = true
  walk_keys = [ "images_barrier" ]
  data_keys = [ "images" ]
  deps = [
    # XXX(46415): as the build is specialized by board (bootfs_only)
    # for bringup, it is not possible for this to be complete. As this
    # is used in the formation of the build API with infrastructure,
    # and infrastructure assumes that the board configuration modulates
    # the definition of `zircon-a` between bringup/non-bringup, we can
    # not in fact have a complete description. See the associated
    # conditional at this group also.
    "build/images",

    # Images who are pulled as part of host interaction tests.
    ":host",

    # There are standalone images outside of the main assembly dependency graph
    # which may be specified as data dependencies of select tests.
    ":tests",
  ]
}

# Describes the SDK archives that can be built, in the file:
# "$root_build_dir/sdk_archives.json"
#
#   * name
#     - Required: Name of the SDK.
#     - Type: string
#
#   * label
#     - Required: GN label of the associated `sdk` target.
#     - Type: label_with_toolchain
#
#   * path
#     - Required: Path to the built archive.
#     - Type: path relative to $root_build_dir
#
#   * os
#     - Required: OS is the operating system which the SDK is built for. A value
#       of "fuchsia" indicates the SDK is host OS agnostic.
#     - Type: string
#
#   * cpu
#     - Required: CPU architecture which the SDK is built for.
#     - Type: string
#
build_api_module("sdk_archives") {
  testonly = true
  data_keys = [ "sdk_archives" ]
  deps = [
           # WARNING (https://fxbug.dev/42067830): the driver SDK will soon be removed.
           "//sdk:driver_archive",
           "//sdk:final_fuchsia_idk",
         ] + sdk_archive_labels
}

# Describes the platforms available for testing, in the file:
#  "$root_build_dir/platforms.json"
#
# TODO(https://fxbug.dev/42055429): 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 ]
    }
  }
}

# This describes where to find all prebuilt binaries, in the file:
#  "$root_build_dir/prebuilt_binaries.json"
#
# The `manifest` field will point to another JSON file that is almost a subset
# of the :binaries build API module: the only fields present are `cpu`,
# `debug`, `os`, and `elf_build_id`, which in this case is not a file pointer
# but instead the actual build ID.
#
#
# Type: list(scope)
#
#   name
#     Required: The name of the collection of prebuilt binaries.
#     Type: string
#
#   manifest
#     Required: The path to the manifest of prebuilt binaires. See note above
#     for its schema.
#     Type: string
#
build_api_module("prebuilt_binaries") {
  testonly = true
  data_keys = [ "prebuilt_binaries" ]
  deps = [
    "//build/images/updates:packages",
    "//build/prebuilt",
    "//sdk",
  ]
}

# This describes which flavor was used for each of the prebuilt packages
# which provide multiple flavors to choose from.
#
# in file:
#  "$root_build_dir/images.json"
#
# For more information, see:  //build/packages/prebuilt_package_with_flavors.gni
#
# Type: list(scope)
#
#   package
#     Required: The name of the package.
#
#   name
#     Required: The name of the flavor that is being used.
#
#   archive
#     Required: The path to the archive that was used.
#
#   production_safe
#     Required:  if 'true' then this flavor is valid for use in production
#     contexts.
#
build_api_module("prebuilt_package_flavors") {
  testonly = true
  data_keys = [ "prebuilt_package_with_flavors" ]
  deps = [ "//build/images/updates:packages" ]
}

# Tests in the build.
#
#  Below, the "testing root" refers to $root_build_dir on host, and the full
#  filesystem path from the root on device.
#
#  This rule outputs the tests.json file in the build directory,
#  which is aggregated at test time.
#
#  The format is documented at
#  https://fuchsia.dev/fuchsia-src/reference/testing/tests-json-format
#
# Type: list(scope)
#
#   * name
#     - Required: Name of test.
#     - Type: string
#
#   * label
#     - Required: GN label associated with the test
#     - Type: label_with_toolchain
#
#   * path
#     - Required: Path to the test's executable.
#     - Type: path relative to the testing root.
#
#   * cpu, os
#     - Required: cpu and os values, respectively, for which this test is
#       intended. Defaults to $current_cpu and $current_os if not manually
#       specified.
#     - Type: string
#
#   * disabled
#     - Optional: a free-form string indicating a reason for the test being
#       disabled.
#     - Type: string
#
#   * runtime_deps
#     - Optional: a JSON file containing a list of root_build_dir-relative
#       paths defining ascribed runtime dependencies of the test. These
#       dependencies are aggregated via the metadata graph of the associated
#       test target under a data key of "test_runtime_deps.
#     - Type: path relative to root_build_dir
#
#   * isolated
#     - Optional: whether the test needs to be run in isolation to other tests.
#     - Type: bool
#
#   * timeout_secs
#     - Optional: the timeout in seconds for the test.
#     - Type: int
#
build_api_module("tests") {
  testonly = true
  data_keys = [ "tests" ]
  walk_keys = [ "tests_barrier" ]
  deps = [
    # Pull in tests from host_labels.  This is deprecated, and tests should be
    # in //:host_tests instead.
    "//:host",

    # Pull in tests present in the assembled product image.  This is deprecated,
    # and tests should be in the various type-specific test groups below.
    "//build/images:main_assembly",

    # Pull in tests from the various type-specific on-device test groups
    "//:e2e_tests",
    "//:hermetic_test_packages",

    # Pull in tests from the non-device type-specific test groups.
    "//:host_tests",
    "//:test_packages",

    # Pull in tests from the developer
    "//:developer_specified_tests",

    # While these should be redundant with the above, they way in which they are
    # redundant (included via the main assembly) is quite opaque, and so they
    # are listed here for developers to be able to see (and to ensure that all
    # developer-chosen tests are in the build api, catching any failures to
    # include those tests in the assembly.
    #
    # This is deprecated, and the above type-specific groups should be used
    # instead.
    ":developer_base_packages",
    ":developer_cache_packages",
    ":developer_universe_packages",
  ]
}

# Test components in the build.
#
#  Creates list of test components and the realm to run them in if not running
#  in the default hermetic realm.
#
# Type: list(scope)
#
#   * label
#     - Required: GN label associated with the test component
#     - Type: label_with_toolchain
#
#   * realm
#     - Optional: Moniker of the realm to run the test in.
#     - Type: Moniker inside the system topology.
#
build_api_module("test_components") {
  testonly = true
  data_keys = [ "test_components" ]
  walk_keys = [ "test_components_barrier" ]
  deps = [
    # Pull in tests present in the assembled product image.  This is deprecated,
    # and tests should be in the various type-specific test groups below.
    "//build/images:main_assembly",

    # Pull in tests from the various type-specific on-device test groups
    "//:hermetic_test_packages",
    "//:test_packages",

    # Pull in tests from the developer
    "//:developer_specified_tests",

    # While these should be redundant with the above, they way in which they are
    # redundant (included via the main assembly) is quite opaque, and so they
    # are listed here for developers to be able to see (and to ensure that all
    # developer-chosen tests are in the build api, catching any failures to
    # include those tests in the assembly.
    #
    # This is deprecated, and the above type-specific groups should be used
    # instead.
    ":developer_base_packages",
    ":developer_cache_packages",
    ":developer_universe_packages",
  ]
}

# The output location of test-list.json.
#
#   Creates a stable build API that users can use to programmatically retrieve
#   test-list.json without having to hardcode the location of the file.
#
# Type: list(string): Each entry will be the location of a test-list.json file.
build_api_module("test_list_location") {
  testonly = true
  data_keys = [ "test_list" ]
  deps = [
    # Pull in the actual test-list target.
    "//:test-list",
  ]
}

# test-list.json contains the set of tests in the build along with arbitrary
# test metadata attached to each test.
compiled_action("test-list") {
  testonly = true
  tool = "//tools/test_list_tool"
  tool_output_name = "test_list_tool"
  test_list_file = "$root_build_dir/test-list.json"
  test_config_file = "$root_build_dir/test-config.json"
  inputs = [
    "$root_build_dir/tests.json",
    "$root_build_dir/test_components.json",
  ]
  outputs = [
    test_list_file,
    test_config_file,
  ]
  depfile = "$root_build_dir/test-list.json.d"

  metadata = {
    test_list = [ rebase_path(outputs[0], root_build_dir) ]
  }

  deps = [
    ":test_components",
    ":tests",
  ]

  args = [
    "--build-dir",
    ".",
    "--input",
    "tests.json",
    "--test-components",
    "test_components.json",
    "--output",
    rebase_path(test_list_file, root_build_dir),
    "--experimental-test-config",
    rebase_path(test_config_file, root_build_dir),
    "--depfile",
    "test-list.json.d",
  ]
}

# test_durations.json contains historical test durations data to be used for
# scheduling tests.
#
# It contains a list of JSON objects with the following fields:
#
#   name
#     Required: The name of the test. For Fuchsia tests, this will correspond to
#     the test package URL; for host-side tests, the installation path.
#     Type: string
#
#   median_duration_ms
#     Required: The median historical duration for this test over some period of
#     time, in milliseconds.
#     Type: int
#
build_api_module("test_durations") {
  testonly = true
  contents = []
  if (test_durations_file != "") {
    contents = read_file(test_durations_file, "json")
  }
}

# Tools provided by the build or as prebuilts, to be used outside the build.
#
# Type: list(scope)
#
#   * name
#     - Required: Name of a host tool.
#     - Type: string
#
#   * label
#     - Required: GN label associated with the tool.
#     - Type: label_with_toolchain
#
#   * path
#     - Required: Path to the tool's executable for the build host.
#     - Type: path relative to $root_build_dir
#
#   * cpu, os
#     - Required: $current_cpu and $current_os values, respectively, for
#       which this tool is intended.
#     - Type: string
#
#   * runtime_files
#     - Optional: Path to files that are also required for the tool to function
#       (must also be built by `label`).
#     - Type: path relative to $root_build_dir
build_api_module("tool_paths") {
  testonly = true
  data_keys = [ "tool_paths" ]
  walk_keys = [ "tool_barrier" ]

  # Disable automatic sorting and grouping to ensure comments are associated
  # with only the intended lines.
  #
  # NOSORT
  deps = [
    # Pull in tools from host_labels.
    ":host",

    # ffx is used as part of the top-level build for every product configuration
    # so should always be included in the tools manifest.
    "//src/developer/ffx($host_toolchain)",

    "//build/rust:tool_paths.llvm-profdata-rust($host_toolchain)",
    ":tool_paths.llvm-tools",
    ":tool_paths.metadata",
    "//build/images/updates:packages",
    "//src/sys/pkg/tests/system-tests:system_tests_tools($host_toolchain)",
    "//src/storage/bin/fvm($host_toolchain)",
    "//third_party/cobalt/src/bin/config_change_validator/src:bin($host_toolchain)",
    "//third_party/cobalt/src/bin/config_parser/src:bin($host_toolchain)",
    "//tools/doc_checker($host_toolchain)",
    "//tools/fidl:fidl-lint($host_toolchain)",
    "//tools/fidl:fidlfmt($host_toolchain)",
    "//tools/fidl/fidlc:host($host_toolchain)",
    "//zircon/third_party/uapp/mkfs-msdosfs($host_toolchain)",
    "//src/storage/blobfs/tools:blobfs($host_toolchain)",
    "//zircon/tools/ktrace-dump($host_toolchain)",
    "//zircon/tools/lz4($host_toolchain)",
    "//zircon/tools/merkleroot($host_toolchain)",
    "//src/storage/minfs/tools:minfs($host_toolchain)",
    "//zircon/tools/xdc-server($host_toolchain)",
    "//zircon/tools/zbi($host_toolchain)",
    "//zircon/tools/zither($host_toolchain)",
  ]
}

group("tool_paths.metadata") {
  visibility = [ ":tool_paths" ]
  prebuilt_tools = [
    "$rustc_prefix/bin/cargo",
    "$rustc_prefix/bin/rustc",
    "$rustc_prefix/bin/rustdoc",
    "$rustc_prefix/bin/rustfmt",
    "//src/testing/perfcompare",

    # reclient is using fairly generic names (bootstrap, dumpstats). We may
    # need to move these into their own group() at some point to namespace
    # them.
    "//prebuilt/proprietary/third_party/reclient/$host_platform/bootstrap",
    "//prebuilt/proprietary/third_party/reclient/$host_platform/dumpstats",
    "//prebuilt/proprietary/third_party/reclient/$host_platform/reproxy",
    "//prebuilt/proprietary/third_party/reclient/$host_platform/rewrapper",
    "//prebuilt/sdk/bazel/bazel",
    "//prebuilt/third_party/buildifier/$host_platform/buildifier",
    "//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/dart/$host_platform/bin/dart",
    "//prebuilt/third_party/gn/$host_platform/gn",
    "//prebuilt/third_party/go/$host_platform/bin/go",
    "//prebuilt/third_party/go/$host_platform/bin/gofmt",
    "//prebuilt/third_party/goma/$host_platform/goma_ctl.py",
    "//prebuilt/third_party/ninja/$host_platform/ninja",
    "//prebuilt/third_party/python3/$host_platform/bin/python3",
    "//prebuilt/tools/shac/shac",
    "//third_party/catapult/tracing/bin/trace2html",
  ]
  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)
        },
      ]
    }

    # Add SSH prebuilts to the tool paths. We need both architectures regardless
    # of the host architectures since it's used on test bots that may be running
    # ARM64 (even if we built on x64).
    foreach(arch,
            [
              "arm64",
              "x64",
            ]) {
      tool_paths += [
        {
          cpu = arch
          label = get_label_info(
                  "//prebuilt/third_party/openssh-portable/linux-${arch}/bin/ssh",
                  "label_with_toolchain")
          name = get_path_info(
                  "//prebuilt/third_party/openssh-portable/linux-${arch}/bin/ssh",
                  "name")
          os = "linux"
          path = rebase_path(
                  "//prebuilt/third_party/openssh-portable/linux-${arch}/bin/ssh",
                  root_build_dir)
        },
      ]
    }
  }
}

group("tool_paths.llvm-tools") {
  visibility = [ ":tool_paths" ]
  _llvm_tools = [
    "clang",
    "clang++",
    "clang-doc",
    "clang-format",
    "clang-include-fixer",
    "clang-refactor",
    "clang-tidy",
    "clangd",
    "llvm-cov",
    "llvm-cxxfilt",
    "llvm-dwp",
    "llvm-objcopy",
    "llvm-profdata",
    "llvm-readelf",
    "llvm-size",
    "llvm-strip",
    "llvm-symbolizer",
    "llvm-xray",
    "sancov",
  ]
  metadata = {
    tool_paths = []
    foreach(tool, _llvm_tools) {
      tool_paths += [
        {
          cpu = host_cpu
          label = get_label_info(":$target_name", "label_with_toolchain")
          name = tool
          os = host_os
          path = rebase_path("$clang_tool_dir/$tool", root_build_dir)
        },
      ]
    }
  }
}

# The "triage_sources.json" build API file contains a list of paths to
# `<foo>.triage` configuration files that are used by the
# `fx triage` command. These paths are relative to the $root_build_dir.
# in file: "$root_build_dir/triage_sources.json".
#
# Type: list(string)
#
build_api_module("triage_sources") {
  testonly = true
  data_keys = [ "triage_sources" ]
  deps = [
    "//build/images/updates:packages",
    "//src/diagnostics/config/triage",
  ]
}

# Describes the path to a list of all the package manifests, the same
# list that is used for the pm_publish step.
#
# The path is relative to the root build dir.
#
# Type: List of strings
#
build_api_module("all_package_manifest_paths") {
  testonly = true

  deps = [ "//build/images/updates:all_package_manifests.list" ]

  contents = [ "all_package_manifests.list" ]
}

# Describes the path to the Fuchsia RBE config file.
# in file: "$root_build_dir/rbe_config.json"
#
# Paths are relative to $root_build_dir.
#
# Type: list(scope)
#
#   * path
#     - Required: Path to where the file is found, relative to $root_build_dir.
#     - Type: path relative to $root_build_dir
#
build_api_module("rbe_config") {
  testonly = true
  data_keys = [ "rbe_config" ]
  rebase = root_build_dir
  deps = [ ":rbe_config.metadata" ]
}

group("rbe_config.metadata") {
  testonly = true
  visibility = [ ":rbe_config" ]
  metadata = {
    rbe_config = [
      {
        path = reproxy_config_file
      },
    ]
  }
}

# Provides a mapping from rust source files to their corresponding clippy targets.
# See `//build/rust/clippy.gni` and `//tools/devshell/contrib/lib/rust/clippy.py`
# for more details.
#
# Type: list(scope)
#
#   clippy
#     - Required: The label of a clippy target.
#     - Type: label_with_toolchain
#
#   output
#     - Required: The path to the clippy output relative to $root_build_dir
#     - Type: path
#
#   src
#     - Required: The list of rust source files for that target.
#     - Type: List[path] (all relative to $root_build_dir)
#
build_api_module("clippy_target_mapping") {
  testonly = true
  data_keys = [ "rust_source_map" ]
  walk_keys = [ "clippy_barrier" ]
  deps = [ "//:default" ]
}

# Check that all of the drivers included in the image and packages.
# are components and in the all-drivers-list
check_included_drivers("drivers-check") {
  testonly = true
  deps = [
    "//build/images:default-images",
    "//build/images/updates:packages",
  ]
}

# Provides a flat list of the artifacts needed for assembly, which should be
# uploaded to CIPD.
#
# Type: list(scope)
#
#   * path
#     - Required: Path to the artifacts file
#     - Type: path relative to $root_build_dir
#
# An artifacts file has the JSON format:
#
# [
#   {
#     "source": "/path/on/host/file.txt",
#     "destination": "path/in/cipd/package/file.txt"
#   },
# ]
#
build_api_module("cipd_assembly_artifacts") {
  testonly = true
  data_keys = [ "assembly_inputs" ]
  walk_keys = [ "assembly_inputs_barrier" ]

  deps = cipd_assembly_artifact_targets
}

# This describes the locations of archives for the out-of-tree assembly inputs
#
# Type: list(scope)
#
#   path
#     Required: Path to the archive file
#     Type: path relative to $root_build_dir
#
#   label
#     Required: label that created the archive
#     Type: GN Label
#
build_api_module("assembly_input_archives") {
  testonly = true
  data_keys = [ "assembly_input_archives" ]
  walk_keys = [ "assembly_input_archives_barrier" ]
  deps = [
    # The platform bundles
    "//bundles/assembly",

    # The legacy bundle for the main product assembly.
    "//build/images:main_assembly",
  ]
}

# size_report.json contains a list (size 0 or 1) of gerrit size reports
# produced by the build. The gerrit size reports have the format described in:
#   https://chromium.googlesource.com/infra/gerrit-plugins/binary-size/+/HEAD/README.md
#
# Type: list(scope)
#
#   path
#     Required: Path to the gerrit size report
#     Type: path relative to $root_build_dir
#
build_api_module("gerrit_size_report") {
  testonly = true
  data_keys = [ "gerrit_size_reports" ]
  deps = [ "//build/images:default-images" ]
}

# Contains the paths to all assembly manifests.
# Used by Artifactory to find and upload all assembly manifests.
#
# Type: list(scope)
#   assembly_manifest_path
#     Required: Path to the assembly manifest.
#   image_name
#     Required: Name of the image for which the assembly manifest was generated.
#   label
#     Required: Label (with toolchain) that generated this assembly manifest.
build_api_module("assembly_manifests") {
  testonly = true
  data_keys = [ "assembly_manifests" ]
  deps = [ "//build/images:default-images" ]
}

# Contains information about 0 or 1 product size checker outputs produced by the build.
#
# Type: list(scope)
#   size_breakdown
#     Required: Path to the size breakdown text file.
#   visualization
#     Required: Path to the directory containing the size visualization.
build_api_module("product_size_checker_output") {
  testonly = true
  data_keys = [ "product_size_checker_output" ]
  deps = [ "//build/images:default-images" ]
}

# Contains details about the size checker output
#
# This is informational only, as a debugging aid.
#
# Type: list(scope) (0 or more)
#  size_budgets
#    Optional:  Path to the breakdown of packages to size budgets.
#
build_api_module("detailed_size_checker_data") {
  testonly = true
  data_keys = [ "detailed_size_checker_data" ]
  deps = [ "//build/images:default-images" ]
}

# Contains information about the product bundles produced by the build.
#
# Type: list(scope)
#   name
#     Required: The name of the product bundle. The main product bundle is
#               expected to have the name $product.$board.
#   path
#     Required: Path to the product bundle directory
#   cpu
#     Required: The target CPU architecture of the associated images.
#   product_version
#     Required: A string indicating the version of the product bundle.
#   transfer_manifest_path
#     Required: Path to the transfer manifest listing the product bundle
#               artifacts.
#   transfer_manifest_url
#     Required: 'transfer_manifest_path' with a "file://" prefix if the file is
#               local, otherwise it's the remote location of the transfer.json.
#   label
#     Required: Label (with toolchain) that generated this product bundle.
#   json
#     Required: Path the JSON representation of the product bundle.
#
build_api_module("product_bundles") {
  testonly = true
  data_keys = [ "product_bundles" ]
  walk_keys = [ "product_bundles_barrier" ]

  # Product bundles are not built in SDK-only builds.
  if (has_board) {
    deps = [
      "//build/images:default-images",
      "//bundles/boot_tests",
    ]
  }
}

# Checks that product bundle names are unique.
action("product_bundles.check") {
  testonly = true

  inputs = get_target_outputs(":product_bundles")
  outputs = [ "${root_build_dir}/$target_name.stamp" ]

  script = "//build/check_product_bundles_manifest.py"
  args = [
    "--product-bundle-json",
    rebase_path(inputs[0], root_build_dir),
    "--stamp",
    rebase_path(outputs[0], root_build_dir),
  ]

  deps = [ ":product_bundles" ]
}

# licenses.json enumerates the output artifacts of //tools/check-licenses
# which need to be saved after completion of a check-licenses run.
#
#
# Type: list(scope)
#
#   compliance_file
#     - Required: Path to the generated compliance file.
#     - Type: string
#
#   license_files
#     - Optional: Path to a root folder containing license text files.
#     - Type: string
#
#   run_files_archive
#     - Optional: Path to a root folder containing check-licenses output files.
#     - Type: string
#
build_api_module("licenses") {
  testonly = true
  data_keys = [ "licenses" ]

  # No need to save license artifacts for SDK-only builds.
  if (has_board) {
    deps = [ "//build/images:default-images" ]
  }
}

# Describes the path to the Fuchsia `vnames.json` file.
# in file: "$root_build_dir/vnames_config.json"
#
# Paths are relative to $root_build_dir.
#
# Type: list(scope)
#
#   * path
#     - Required: Path to where the file is found, relative to $root_build_dir.
#     - Type: path relative to $root_build_dir
#
build_api_module("vnames_config") {
  testonly = true
  data_keys = [ "vnames_config" ]
  rebase = root_build_dir
  deps = [ ":vnames_config.metadata" ]
}

group("vnames_config.metadata") {
  testonly = true
  visibility = [ ":vnames_config" ]
  metadata = {
    vnames_config = [
      {
        path = "//infra/vnames.json"
      },
    ]
  }
}

###
### Top-level targets.
###
group("default") {
  testonly = true
  deps = [
    "//:host",
    "//:product_bundles.check",
    "//:test-list",
    "//build/assembly:validate_product_defs",
    "//bundles/assembly",

    # TODO(https://fxbug.dev/42067746) has_board check not working
    "//build/images:default-images",
    "//build/images/updates:packages",
    "//build/input:build_only",
    "//bundles/boot_tests",
    "//sdk",
  ]

  # SDK-only builds must not attempt to build images.
  if (has_board) {
    deps += [
      "//:drivers-check",
      "//build/images:default-images",
    ]
  }
}

###
# GN-Argument configured groups for product definitions.
#

##
# "Developer-Added" package groups
#
# These groups exist at the root of the build so relative labels specified
# through GN args are interpreted as if they were absolute.  e.g.
#
# public_deps = [ "build/images/fuchsia:fuchsia" ]
#
# is the same as
#
# public_deps = [ "//build/images/fuchsia:fuchsia" ]
#
# For any target in this file, but only in this file.
#

# Base driver packages added by the developer, using `fx set` or `fx args`
group("developer_base_driver_packages") {
  testonly = base_cache_packages_testonly
  visibility = [ "//build/images/*" ]
  public_deps = base_driver_package_labels
}

# Base packages added by the developer, using `fx set` or `fx args`
group("developer_base_packages") {
  testonly = base_cache_packages_testonly
  visibility = [
    ":test_components",
    ":tests",
    "//build/images/*",
  ]

  public_deps = base_package_labels

  # the buildbot host tests should only be added via `--with-host`, to the
  # `host_labels` GN arg.
  assert_no_deps = [ "//bundles/buildbot/host/*" ]
}

# Cache packages added by the developer, using `fx set --with <foo>` or
# `fx args`
group("developer_cache_packages") {
  testonly = base_cache_packages_testonly
  visibility = [
    ":test_components",
    ":tests",
    "//build/images/*",
  ]
  public_deps = cache_package_labels

  # the buildbot host tests should only be added via `--with-host`, to the
  # `host_labels` GN arg.
  assert_no_deps = [ "//bundles/buildbot/host/*" ]
}

# Universe packages added by the developer, using `fx set` or `fx args`
group("developer_universe_packages") {
  testonly = fuchsia_zbi_testonly
  visibility = [
    ":test_components",
    ":tests",
    "//build/images/*",
  ]
  public_deps = universe_package_labels

  # the buildbot host tests should only be added via `--with-host`, to the
  # `host_labels` GN arg.
  assert_no_deps = [ "//bundles/buildbot/host/*" ]

  # During validation of the test types, ignore any tests that are found via
  # a path from the test groups back to this group, as it's likely due to e2e
  # tests having a dependency on the main assembly, which has a dependency on
  # this group while tests are being transitioned out of the universe set and
  # to the test groups.
  metadata = {
    test_type_validation_barrier = []
  }
}

##
# "Legacy Product Definition" package groups.  These are only manipulated by
# product definitions, not changed by developer options like
# `fx set --with <foo>` or `fx args`
#
# Product+Board base driver packages
group("legacy_base_driver_packages") {
  testonly = base_cache_packages_testonly
  visibility = [ "//build/images/*" ]
  public_deps = board_driver_package_labels
}

# Product+Board base packages
group("legacy_base_packages") {
  testonly = base_cache_packages_testonly
  visibility = [
    "//build/assembly/*",
    "//build/images/*",
  ]
  public_deps = legacy_base_package_labels + board_package_labels
  assert_no_deps = [ "//build/validate:shell_command_tag" ]
}

# Product+Board cache packages
group("legacy_cache_packages") {
  testonly = base_cache_packages_testonly
  visibility = [
    "//build/assembly/*",
    "//build/images/*",
  ]
  public_deps = legacy_cache_package_labels
  assert_no_deps = [ "//build/validate:shell_command_tag" ]
}

###
# GN-Argument configured groups for adding tests to a build.
#

# Fully hermetic tests (both by packaging and at runtime)
validated_test_types_group("hermetic_test_packages") {
  visibility = [ ":*" ]
  allowed_test_types = [ "hermetic" ]
  deps = hermetic_test_package_labels
}

# Non-hermetic tests (at runtime).  Non-test packages found in this group will
# be flagged as an error by the build.
group("test_packages") {
  testonly = true
  visibility = [ ":*" ]
  public_deps = test_package_labels
  assert(
      test_package_labels == [],
      "test_package_labels cannot be used before adding validation of test type.")
}

# These are all tests that are to be published in the 'discoverable' package
# set.
group("discoverable_tests") {
  testonly = true
  visibility = [
    ":*",
    "//build/images/*",
  ]
  public_deps = [
    "//:developer_specified_tests",
    "//:hermetic_test_packages",
    "//:test_packages",
  ]
}

# Host-driven, "end-to-end" tests that run on a Fuchsia image (either real
# hardware or emulated).
validated_test_types_group("e2e_tests") {
  testonly = true
  visibility = [ ":*" ]
  allowed_test_types = [ "end_to_end" ]
  deps = e2e_test_labels
}

# Host-only tests.  These cannot have any dependency on an assembled platform
# image, or the compiled OS itself, not even for their host_test_data().
validated_test_types_group("host_tests") {
  testonly = true
  visibility = [ ":*" ]
  allowed_test_types = [ "host_only" ]

  deps = []
  foreach(label, host_test_labels) {
    # Strip any toolchain that is provided, and replace with the host toolchain.
    full_label = get_label_info(label, "label_no_toolchain")
    deps += [ "$full_label($host_toolchain)" ]
  }
}

# Can be any test-type. This is for local-developer use only.  It is not for use
# by infra or products.
group("developer_specified_tests") {
  testonly = true
  visibility = [ ":*" ]
  public_deps = developer_test_labels
}

###
# GN-Argument configured groups other package sets
#

# Packages that are compiled and published, but unable to contribute to the
# product in any way.
group("discoverable_packages") {
  testonly = true
  visibility = [ "//build/images/updates:universe_packages" ]
  public_deps = discoverable_package_labels + [ ":discoverable_tests" ]
  assert_no_deps = [
    "//build/validate:config_data_tag",
    "//build/validate:shell_command_tag",
  ]
}

###
# GN-Argument configured groups for host binaries and tools
#

group("host") {
  # TODO(https://fxbug.dev/42160904) investigate removing testonly here
  testonly = true
  public_deps = [
    "//build/input/board:host($host_toolchain)",
    "//build/input/product:host($host_toolchain)",

    # Static analysis tools used by shac should always be built so that
    # `fx format-code` and other static analysis entrypoints can be run on any
    # build configuration.
    "//bundles/tools/shac:shac_tools",

    # Host tests for //build/api/client
    "//build/api:tests",

    # Tools & tests added by the developer
    ":developer_host_tools",
  ]

  if (has_board) {
    # This indicates that we're building a product, rather than the SDK. In
    # this case it is likely useful to have fx tools pre-compiled for testing as
    # an optimization. That way fx commands can assume the executables exist
    # instead of running ninja, which is costly even if it's a no-op.
    public_deps += [ "//tools/devshell:fx($host_toolchain)" ]
  }
}

# WARNING: Known to infrastructure
#
# This group creates a single ninja build target that can create all targets
# specified by `host_labels` with `fx build :developer_host_tools`
group("developer_host_tools") {
  testonly = true
  public_deps = []

  foreach(label, host_labels) {
    # Strip any toolchain that is provided, and replace with the host toolchain.
    full_label = get_label_info(label, "label_no_toolchain")
    public_deps += [ "$full_label($host_toolchain)" ]
  }
}

group("package_archive") {
  testonly = true
  public_deps = [ "//build/gn:package_archive" ]
}

# IMPORTANT: This target is only provided for the benefit of the `fx bazel`
# command, and nothing should depend on it, its definition may change over
# time.
#
# Targets that need to depend on the Bazel workspace should instead depend
# directly on //build/bazel:generate_main_workspace and other targets
# instead (e.g. see the definition of `bazel_action()`).
#
group("bazel_workspace") {
  deps = [
    "//build/bazel:generate_main_workspace",

    # For the @fuchsia_sdk Bazel repository content.
    "//sdk:core",
  ]
}

# IMPORTANT: Nothing should depend on this target. It is here
# to ensure that its dependencies are always in the GN build graph,
# which is critical for a few generated_file() dependencies that
# need to write their output at `gn gen` time.
group("root_targets") {
  testonly = true
  deps = [
    "//build/bazel:legacy_ninja_build_outputs",

    # These are only required by the core.x64-sdk_source_sets_and_shlibs-apiXX-build_only
    # builders. TODO(https://fxbug.dev/42082833): Remove these lines once these builders are
    # removed since they seem no longer necessary.
    "//build/sdk:sdk_versioned_shared_libraries",
    "//build/sdk:sdk_versioned_source_sets",

    # This target is listed explicitly by multiple CI bot build configurations.
    # See https://fxbug.dev/42162374 for context.
    "//build/images:record_filesystem_sizes",

    # Required by `fx fidldoc` as well as the Fuchsia controller ffx plugin
    # at runtime!
    "//build/fidl:all_fidl_json",
  ]

  # Required by `fx publish` at runtime. Only included when package serving processes are needed.
  if (has_board && !use_bringup_assembly) {
    deps += [ "//build/images/updates:prepare_publish" ]
  }
}

# A GN pool matching the special Ninja 'console' pool. Any action() that
# uses this pool will be able to send its stdout/stderr directly to the
# output terminal, instead of being buffered by Ninja until the command
# completes.
#
# This is very useful for long-running commands, e.g. bazel build invocations
# that can take several dozen seconds to complete, or any other command that
# prints a _lot_ of output, because our infra bots will timeout if Ninja tries
# to print too much data at once after command completion for some undetermined
# reason.
#
pool("console") {
  depth = 1
}
