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

# Collect the source files that are dependencies of the create_gn_rules.py
# script, below.  Unfortunately, exec_script cannot use a depfile produced
# by the script and only supports a separately computed list of dependencies.
zircon_files =
    exec_script("//build/zircon/list_source_files.py", [], "list lines")

supporting_templates = [
  "//build/zircon/boards.mako",
  "//build/zircon/header.mako",
  "//build/zircon/host_tool.mako",
  "//build/zircon/main.mako",
  "//build/zircon/shared_library.mako",
  "//build/zircon/source_library.mako",
  "//build/zircon/static_library.mako",
  "//build/zircon/sysroot.mako",
]

# The following script generates GN build files for Zircon objects.  It is
# placed before everything else so that //zircon targets are available in
# due time.  See //build/zircon/README.md for more details.
exec_script("//build/zircon/create_gn_rules.py",
            [
              "--out",
              rebase_path("//zircon/public"),
              "--zircon-build",
              rebase_path(zircon_root_build_dir),
              "--zircon-manifest",
              rebase_path("$zircon_root_build_dir/export/manifest-$target_cpu"),
            ],
            "",
            zircon_files + supporting_templates)

# 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 = [
    ":copy_host_tests",
    "//build/images:packages",
  ]
  if (preinstall_package_labels != [] || monolith_package_labels != []) {
    deps += [ "//build/images" ]
  }
  if (available_package_labels != []) {
    deps += [ "//build/images:updates" ]
  }
}

group("host_tests") {
  visibility = [ ":*" ]
  public_deps = [
    "//build/gn:host_tests",
  ]
}

# 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 = [
    ":host_tests",
    "//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"
  deps = [
    ":host_tests",
  ]
}

# 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 = [
    ":host_tests",
    ":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")
