# 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/config/standard.gni")
import("$zx/public/gn/toolchain/environment_redirect.gni")

# Build the native host tools intended for developer use.
_tools_targets = [ "tools" ]
foreach(host, standard_build_hosts) {
  _tools_targets += [ "tools-${host.os}-${host.cpu}" ]
  environment_redirect("tools-${host.os}-${host.cpu}.redirect") {
    visibility = [ ":*" ]
    testonly = true
    environment_label = "$zx/public/gn/toolchain:host"
    cpu = host.cpu
    os = host.os
    deps = [
      "$zx/system/host:tools",
    ]
  }
}

group("tools.redirect") {
  visibility = [ ":*" ]
  testonly = true
  public_deps = [
    ":tools-${host_os}-${host_cpu}",
  ]
}

if (current_toolchain == default_toolchain) {
  # Install the host developer tools for the running host platform in the
  # "$root_build_dir/tools/" directory.
  foreach(tools_target, _tools_targets) {
    tools_rspfile = "$target_gen_dir/${tools_target}.rsp"
    generated_file("$tools_target.rsp") {
      visibility = [ ":$tools_target" ]
      testonly = true
      outputs = [
        tools_rspfile,
      ]
      deps = [
        ":$tools_target.redirect",
      ]
      output_conversion = "list lines"
      data_keys = [ "tool_executables" ]
    }

    action(tools_target) {
      testonly = true
      deps = [
        ":$tools_target.rsp",
      ]
      script = "$zx/scripts/copy-files"
      depfile = "$target_out_dir/$target_name.d"
      outputs = [
        depfile,
      ]
      sources = [
        tools_rspfile,
      ]
      args = [
        tools_target,
        rebase_path(depfile, root_build_dir),
        rebase_path(tools_rspfile, root_build_dir),
      ]
    }
  }
}

group("default") {
  testonly = true
  deps = [
    ":all-cpu",
    ":tools",
  ]
}

group("all-cpu") {
  testonly = true
  deps = []
  foreach(cpu, standard_fuchsia_cpus) {
    # TODO: When everything builds, this will be reorganized.
    deps += [ ":what-builds-$cpu" ]
  }
}

foreach(cpu, standard_fuchsia_cpus) {
  environment_redirect("what-builds-$cpu") {
    visibility = [ ":*" ]
    environment_label = "$zx/public/gn/toolchain:user"
    cpu = cpu
    deps = [
      # TODO: This indirectly reaches everything that builds so far.
      "$zx/system/core/userboot",
      "$zx/system/ulib/c",
      "$zx/system/ulib/fdio",
    ]
  }
}
