# 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/zircon.gni")
import("//build/testing/platforms.gni")
import("//build/toolchain/goma.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](../../../zircon/docs/gen/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`](../../../zircon/docs/gen/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 targets to pass to the Zircon Ninja build.
  zircon_extra_ninja_targets = []

  # Whether to include various features (non-shipping, insecure, etc.) in the
  # kernel or netsvc builds.
  zircon_enable_kernel_debugging_features = false
  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 = ""
}

zircon_ninja_targets = [ "legacy-$target_cpu" ] + zircon_extra_ninja_targets

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](../../../zircon/docs/gen/build_arguments.md).
  # The default passes through GOMA 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_goma = use_goma
    goma_dir = goma_dir
    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 = clang_prefix
    }
    variants = zircon_variants
    default_deps = []
    foreach(target, zircon_ninja_targets) {
      default_deps += [ ":$target" ]
    }
    enable_kernel_debugging_features = zircon_enable_kernel_debugging_features
    enable_netsvc_debugging_features = zircon_enable_netsvc_debugging_features
    forward_variables_from(zircon_extra_args, "*")
  }
}

# The Zircon GN is completely a puppet of this build.  This gen runs that gen.
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=default",
    rebase_path(zircon_root_build_dir, root_build_dir),
  ]

  if (zircon_tracelog != "") {
    gn_cmd += [ "--tracelog=" + rebase_path(zircon_tracelog, root_build_dir) ]
  }

  exec_script("//buildtools/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" ])

  # 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 = zircon_ninja_targets
             },
             "json")
}

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

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

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

group("build_time_checks") {
  deps = [
    "//tools/fidlgen_llcpp_zircon:validate",
  ]
}

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

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

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: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
  visibility = [ "//build/images:universe_packages" ]
  public_deps = universe_package_labels
}
