# 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("$zx/public/gn/build_api_module.gni")
import("$zx/public/gn/config/standard.gni")
import("$zx/public/gn/copied_files_dir.gni")
import("$zx/public/gn/prebuilt.gni")
import("$zx/public/gn/test/zbi_test.gni")
import("$zx/public/gn/toolchain/c_utils.gni")
import("$zx/public/gn/toolchain/environment_redirect.gni")
import("$zx/public/gn/zbi.gni")

declare_args() {
  # Defines the `//:default` target: what `ninja` with no arguments does.
  # TODO(fxbug.dev/3156): This must be set by the controlling Fuchsia GN build.
  default_deps = false
}

assert(default_deps != false,
       "TODO(fxbug.dev/3156): Zircon build must be driven by Fuchsia build")

###
### 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".
#
# TODO(fxbug.dev/3156): Note this does not include build_api_module() uses meant
# just for legacy build integration.  We don't consider those to be actual
# build API modules; using build_api_module() is just a convenience for
# creating them.  Importantly, they are not part of the API contract with
# consumers of the overall build.  They're purely implementation details of
# the temporary Frankenbuild arrangement.
#
# Type: list(string)
build_api_module("api") {
  testonly = true
  data_keys = [ "build_api_modules" ]
  deps = [
    ":args",
    ":binaries",
    ":generated_sources",
  ]
}

# See //:args in the fuchsia build for a description.
build_api_module("args") {
  contents = read_file("$root_build_dir/args.gn", "scope")
}

# See //:binaries for a description and schema definition.
# in file: "$root_build_dir/binaries.json"
#
build_api_module("binaries") {
  testonly = true
  deps = [ ":everything" ]
  data_keys = [ "binaries" ]
}

# See //:generated_sources for a description and schema definition.
# in file: "$root_build_dir/generated_sources.json"
#
build_api_module("generated_sources") {
  testonly = true
  deps = [ ":everything" ]
  data_keys = [ "generated_sources" ]
}

###
### Top-level targets.
###

# This is used in the top-level build_api_module() deps to reach "everything".
# Note that "all" is a magical target name to Ninja, hence this name instead.
group("everything") {
  testonly = true
  deps = default_deps
}

# This is the default target that Ninja builds when given no target arguments.
group("default") {
  testonly = true
  deps = default_deps
}

###
### TODO(fxbug.dev/3156): Temporary hacks for integrating with the legacy Fuchsia
### GN build.
###

if (current_toolchain == default_toolchain) {
  build_api_module("legacy_dirs") {
    testonly = true
    data_keys = [ "legacy_dirs" ]
    walk_keys = [ "legacy_barrier" ]
    deps = []
    foreach(cpu, standard_fuchsia_cpus) {
      deps += [ ":legacy-$cpu" ]
    }
  }

  foreach(cpu, standard_fuchsia_cpus) {
    group("legacy-$cpu") {
      testonly = true
      deps = [ ":legacy-deps-$cpu" ]
    }
  }
}

foreach(cpu, standard_fuchsia_cpus) {
  environment_redirect("legacy-deps-$cpu") {
    visibility = [ ":*" ]
    testonly = true
    environment_label = "$zx/public/gn/toolchain:user"
    cpu = cpu
    deps = [ "$zx/kernel" ]
    metadata = {
      legacy_barrier = []
    }
  }
}

build_api_module("legacy_images") {
  testonly = true
  data_keys = [ "images" ]
  deps = []
  foreach(cpu, standard_fuchsia_cpus) {
    deps += [ ":legacy-$cpu" ]
  }
}

# This target complements legacy_images in that it lists the various elements
# that end up in images.
foreach(cpu, standard_fuchsia_cpus) {
  build_api_module("legacy_unification-$cpu") {
    testonly = true
    data_keys = [ "zx_manifest" ]
    deps = [ ":legacy-$cpu" ]
  }
}
