# 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/dart/toolchain.gni")
import("//build/fidl/toolchain.gni")
import("//build/go/toolchain.gni")

# This template allows aliasing a FIDL library.
# It is currently used to make `//zircon/system/fidl/foo` strictly equivalent
# to `//sdk/fidl/foo` in the Fuchsia GN build.
template("fidl_alias") {
  not_needed(invoker, "*")
  dash_library_name = target_name
  library_name = string_replace(dash_library_name, "-", ".")
  if (current_toolchain == dart_toolchain) {
    foreach(suffix, [ "" ]) {
      group(target_name + suffix) {
        forward_variables_from(invoker, [ "testonly" ])
        public_deps = [
          "//sdk/fidl/$library_name:$library_name$suffix",
        ]
      }
    }
    action("${target_name}_dot_packages") {
      forward_variables_from(invoker, [ "testonly" ])
      script = "//build/unification/copy_dot_packages.py"
      deps = [
        "//sdk/fidl/$library_name:${library_name}_dot_packages",
      ]
      inputs = [
        get_label_info(deps[0], "target_gen_dir") + "/$library_name.packages",
      ]
      outputs = [
        "$target_gen_dir/$dash_library_name.packages",
      ]
      args = [
        "--source",
        rebase_path(inputs[0]),
        "--destination",
        rebase_path(outputs[0]),
      ]
    }
  } else if (current_toolchain == fidl_toolchain) {
    copy("$library_name-libraries") {
      forward_variables_from(invoker, [ "testonly" ])
      deps = [
        "//sdk/fidl/$library_name:${library_name}",
      ]
      sources = [
        get_label_info(deps[0], "target_gen_dir") + "/$library_name.libraries",
      ]
      outputs = [
        "$target_gen_dir/$dash_library_name.libraries",
      ]
    }
    copy("$library_name-json") {
      forward_variables_from(invoker, [ "testonly" ])
      deps = [
        "//sdk/fidl/$library_name:${library_name}",
      ]
      sources = [
        get_label_info(deps[0], "target_gen_dir") + "/$library_name.fidl.json",
      ]
      outputs = [
        "$target_gen_dir/$dash_library_name.fidl.json",
      ]
    }
    group(target_name) {
      forward_variables_from(invoker, [ "testonly" ])
      public_deps = [
        ":$library_name-json",
        ":$library_name-libraries",
      ]
    }
  } else if (current_toolchain == go_toolchain) {
    copy(target_name) {
      forward_variables_from(invoker, [ "testonly" ])
      deps = [
        "//sdk/fidl/$library_name:${library_name}",
      ]
      sources = [
        get_label_info(deps[0], "target_gen_dir") + "/$library_name.go_deps",
      ]
      outputs = [
        "$target_gen_dir/$dash_library_name.go_deps",
      ]
    }
  } else {
    copy("$target_name-rustc_info") {
      forward_variables_from(invoker, [ "testonly" ])
      deps = [
        "//sdk/fidl/$library_name:${library_name}-rustc_info",
      ]
      sources = [
        get_label_info(deps[0], "target_out_dir") +
            "/$library_name-rustc_info.json",
      ]
      outputs = [
        "$target_out_dir/$dash_library_name-rustc_info.json",
      ]
    }
    main_target_name = target_name
    suffixes = [
      "",
      "-rustc",
      "_c",
      "_c_client",
      "_c_server",
      "_libfuzzer",
      "_llcpp",
    ]
    foreach(suffix, suffixes) {
      group(target_name + suffix) {
        forward_variables_from(invoker, [ "testonly" ])
        public_deps = [
          "//sdk/fidl/$library_name:$library_name$suffix",
        ]
        if (suffix == "-rustc") {
          public_deps += [ ":$main_target_name-rustc_info" ]
        }
      }
    }
  }

  if (defined(invoker.sdk_category) && invoker.sdk_category != "excluded") {
    import("//build/sdk/sdk_atom_alias.gni")
    sdk_atom_alias("${target_name}_sdk") {
      atom = "//sdk/fidl/$library_name:${library_name}_sdk($fidl_toolchain)"
    }
  }
}
