# 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/images/args.gni")
import("//build/info/info.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 = []

  # A file in integration containing historical test duration data for this
  # build configuration. This file is used by infra to efficiently schedule
  # tests. "default.json" is a dummy file that contains no real duration data,
  # and causes infra to schedule tests as if each one has the same duration.
  test_durations_file = "//integration/infra/test_durations/default.json"

  # 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 = []

  # 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"

  # Whether to allow testonly=true targets in base/cache pacakges. Default to
  # true to allow testonly=true targets. It is preferrable to set to false for
  # production builds to avoid accidental inclusion of testing targets.
  base_cache_packages_allow_testonly = true
}

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_host_targets-$host_os-$host_cpu",
                     "//:legacy_unification-$target_cpu",
                     "//tools:all-hosts",
                   ] + zircon_extra_deps
    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",
                "//build/unification/zircon_library_forward.gn",
                "//build/unification/zircon_library_mappings.json",
                "//build/zircon/lib_template.gn",
                "//build/zircon/tool_template.gn",
              ])
}

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

###
### 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 = [
    ":archives",
    ":args",
    ":binaries",
    ":build_info",
    ":checkout_artifacts",
    ":fuzzers",
    ":generated_sources",
    ":images",
    ":platforms",
    ":prebuilt_binaries",
    ":tests",
    ":tool_paths",
    ":zbi_tests",
    ":zircon",
  ]
}

# This describes all the archives the build can produce.
#
# TODO(fxbug.dev/43568): 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:archives",
  ]
}

# TODO(crbug.com/gn/132): Remove when GN emits the equivalent information
# itself.
#
# 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")
}

# 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" ]
  metadata = {
    # This uses exec_script instead of read_file because the labels and paths
    # need to be rebased to be valid in the Fuchsia build. Doing this in GN
    # using a foreach loop takes 3 seconds, but the script takes 100ms. This
    # should go away when the build is unified.
    binaries =
        exec_script("//build/zircon/read_zircon_binaries.py",
                    [
                      "--binaries-json",
                      rebase_path("$zircon_root_build_dir/binaries.json"),
                      "--root-build-dir",
                      rebase_path(root_build_dir),
                      "--zircon-root-build-dir",
                      rebase_path(zircon_root_build_dir),
                    ],
                    "json")
  }
}

# Describes the configuration of the build.
#
# 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.
#
# 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(fxbug.dev/43568): 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"
      },
    ]
  }
}

# See //zircon:generated_sources for a description and schema definition.
#
build_api_module("generated_sources") {
  testonly = true
  data_keys = [ "generated_sources" ]
  deps = [
    ":generated_sources.zircon",
    "//build/images:packages",
    "//sdk",
  ]
}

group("generated_sources.zircon") {
  visibility = [ ":generated_sources" ]
  zircon_entries =
      read_file("$zircon_root_build_dir/generated_sources.json", "json")
  metadata = {
    generated_sources = []
    foreach(entry, zircon_entries) {
      generated_sources +=
          [ rebase_path(entry, 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 = [
    # 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",
  ]
}

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

# This describes where to find all prebuilt binaries.
#
# 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
#
#   debug_archive
#     Optional: The path the the archive of debug binaries from which
#     `path` was generated.
#     Type: string
#
build_api_module("prebuilt_binaries") {
  testonly = true
  data_keys = [ "prebuilt_binaries" ]
  deps = [
    "//build/images:packages",
    "//build/prebuilt",
    "//sdk",
  ]
}

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

# 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 = read_file(test_durations_file, "json")
}

# See //zircon:tool_paths for a description and schema definition.
#
build_api_module("tool_paths") {
  testonly = true
  data_keys = [ "tool_paths" ]
  walk_keys = [ "tool_barrier" ]
  deps = [
    ":tool_paths.metadata",
    ":tool_paths.zircon",
    "//build/images:packages",
    "//build/unification/tools",
  ]
}

group("tool_paths.metadata") {
  visibility = [ ":tool_paths" ]
  prebuilt_tools = [
    "//garnet/bin/perfcompare",
    "//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",
    "//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)
        },
      ]
    }
  }
}

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

# This describes all the "ZBI tests" the build can produce.
#
# See //zircon:zbi_tests for a description and a schema definition.
#
build_api_module("zbi_tests") {
  testonly = true
  data_keys = [ "zbi_tests" ]
  deps = [
    ":zbi_tests.zircon",
    "build/images",
    "build/unification/zbi:tests",
  ]
}

group("zbi_tests.zircon") {
  visibility = [ ":zbi_tests" ]
  zircon_entries = read_file("$zircon_root_build_dir/zbi_tests.json", "json")
  metadata = {
    zbi_tests = []
    foreach(zbi_test, zircon_entries) {
      zbi_tests += [
        {
          forward_variables_from(zbi_test, "*")
          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:tests",
    "//build/images:packages",
    "//build/unification",
    "//sdk",
  ]

  # SDK-only builds must not attempt to build images.
  if (bootfs_only || base_package_labels + cache_package_labels +
                     universe_package_labels != []) {
    deps += [ "//build/images:default-images" ]
  }
}

# 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") {
  if (base_cache_packages_allow_testonly) {
    testonly = true
  }
  visibility = [ "//build/images:base_packages" ]
  public_deps = base_package_labels + board_package_labels
}

group("additional_cache_packages") {
  if (base_cache_packages_allow_testonly) {
    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("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" ]
}
