# 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/config/fuchsia/zircon.gni")
import("//build/gn/packages.gni")
import("//build/testing/platforms.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 = []

  # A list of package labels to include in the 'base' package set. Used by the
  # board definition rather than the product definition.
  board_package_labels = []
}

# Write a file that can be sourced by `fx`.  This file is produced
# by `gn gen` and is not known to Ninja at all, so it has nothing to
# do with the build itself.  Its sole purpose is to leave bread
# crumbs about the settings `gn gen` used for `fx` to use later.
_relative_build_dir = rebase_path(root_build_dir, "//", "//")
_fx_config_lines = [
  "# Generated by `gn gen`.",
  "FUCHSIA_BUILD_DIR='${_relative_build_dir}'",
  "FUCHSIA_ARCH='${target_cpu}'",
]
write_file("$root_build_dir/fx.config", _fx_config_lines)

# This file indicates what Ninja invocation must be done to build Zircon
# prerequisites before *any* Ninja invocation for this build.
write_file("$root_build_dir/zircon.json",
           {
             dir = rebase_path(zircon_root_build_dir, root_build_dir)
             targets = [ "legacy-$target_cpu" ]
           },
           "json")

# Permit dependencies on testonly targets from packages.
testonly = true

group("default") {
  deps = [
    ":copy_host_tests",
    "//build/images:packages",
    "//sdk:core",
  ]
  if (preinstall_package_labels != []
      || monolith_package_labels != []
      || base_package_labels != []
      || cache_package_labels != []) {
    deps += [ "//build/images" ]
  }
  if (available_package_labels != []
      || universe_package_labels != []) {
    deps += [ "//build/images:updates" ]
  }
}

group("recovery_image") {
  deps = [
    "build/images/recovery",
  ]
}

# TODO(joshuaseaton|mcgrathr): Make this a formal build_api_module.
#
# Aggregates metadata about all tests within the build graph to create a
# top-level manifest.
generated_file("tests") {
  outputs = [
    "$root_build_dir/tests.json",
  ]
  data_keys = [ "test_spec" ]
  output_conversion = "json"
  deps = [
    "//build/images:packages",
  ]
}

# TODO(IN-819): Provides supplementary metadata for tests no yet contributing
# test spec metadata (e.g., flutter_test).
generated_file("pseudo_tests") {
  outputs = [
    "$root_build_dir/pseudo_tests.json",
  ]
  data_keys = [ "pseudo_test_spec" ]
  output_conversion = "json"

  # TODO(joshuaseaton|jinwoo): have this depend on a top-level //tests target,
  # when such a target exists.
  deps = [
    "//build/images:packages",
  ]
}

# Aggregates metadata about all fuzz targets within the build graph to create a
# top-level manifest.
generated_file("fuzzers") {
  outputs = [
    "$root_build_dir/fuzzers.json",
  ]
  data_keys = [ "fuzz_spec" ]
  output_conversion = "json"
  deps = [
    "//build/images:packages",
  ]
}

# Copy host test binaries to $root_build_dir/host_tests.
# TODO(IN-819): Delete this copy target once host tests are no longer run out
# of a single directory.
action("copy_host_tests") {
  script = "build/gn/copy_host_tests.py"

  inputs = [
    "$root_build_dir/tests.json",
    "$root_build_dir/pseudo_tests.json",
  ]

  outputs = [
    "$target_gen_dir/copy_host_tests.stamp",
  ]

  depfile = "$target_gen_dir/copy_host_tests.d"

  args = [
    "--json",
    rebase_path(inputs[0]),
    "--json",
    rebase_path(inputs[1]),
    "--dest-dir",
    rebase_path("$root_build_dir/host_tests"),
    "--stamp",
    rebase_path(outputs[0]),
    "--depfile",
    rebase_path(depfile),
  ]

  deps = [
    ":pseudo_tests",
    ":tests",
    "//build/images:packages",
  ]
}

group("breakpad_symbols") {
  public_deps = [
    "//build/gn:breakpad_symbols",
  ]
}

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

# Generates a JSON manifest of the platforms available for testing, along with
# their properties.
target_platforms = []
foreach(platform, test_platforms) {
  if (!defined(platform.cpu) || platform.cpu == current_cpu) {
    target_platforms += [ platform ]
  }
}
write_file("$root_build_dir/platforms.json", target_platforms, "json")

# 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:monolith_packages" ]
  public_deps = base_package_labels + board_package_labels
}

group("additional_cache_packages") {
  testonly = true
  visibility = [ "//build/images:preinstall_packages" ]
  public_deps = cache_package_labels
}

group("additional_universe_packages") {
  testonly = true
  visibility = [ "//build/images:available_packages" ]
  public_deps = universe_package_labels
}
