# Copyright 2017 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/clang/clang.gni")
import("//build/config/sysroot.gni")
import("//build/host.gni")
import("//build/sdk/sdk_atom.gni")

# A template for an action that builds a Go binary. Users should instead use the
# go_binary or go_test rules.
#
# Parameters
#
#   sdk_category (optional)
#     Publication level of the library in SDKs.
#     See //build/sdk/sdk_atom.gni.
#
#   deps (optional)
#     List of labels representing go_library targets this target depends on.
#
#   non_go_deps (optional)
#     List of labels this target depends on that are not Go libraries.

template("go_build") {
  assert(defined(invoker.gopackage),
         "gopackage must be defined for $target_name")

  main_target_name = target_name

  output_name = target_name
  if (defined(invoker.output_name)) {
    output_name = invoker.output_name
  }
  output_path = "${root_out_dir}/${output_name}"

  action(main_target_name) {
    deps = []
    if (defined(invoker.non_go_deps)) {
      deps += invoker.non_go_deps
    }

    use_strip = is_fuchsia

    outputs = [
      output_path,
    ]

    if (use_strip) {
      unstripped_output_path = "${root_out_dir}/exe.unstripped/${output_name}"
      outputs += [ unstripped_output_path ]
    }

    script = "//build/go/build.py"
    depfile = "${output_path}.d"

    sources = [
      "//build/go/gen_library_metadata.py",
    ]

    godepfile = "//buildtools/${host_platform}/godepfile"
    inputs = [ godepfile ]

    args = [
      "--godepfile",
      rebase_path(godepfile, "", root_build_dir),
      "--fuchsia-root",
      rebase_path("//."),
      "--root-out-dir",
      rebase_path(root_out_dir, root_build_dir),
      "--depfile",
      rebase_path(depfile),
      "--current-cpu",
      current_cpu,
      "--current-os",
      current_os,
      "--binname",
      output_name,
      "--toolchain-prefix",
      rebase_path(clang_prefix, "", root_build_dir),
      "--shared-libs-root",
      rebase_path(
          get_label_info("//default($shlib_toolchain)", "root_out_dir")),
    ]

    if (is_fuchsia) {
      deps += [ "//third_party/go:go_runtime" ]

      deps += [
        "//garnet/public/sdk:zircon_sysroot_export",
        "//zircon/public/lib/fdio",
      ]

      # GN provides no way to propagate include paths like this, so, this is brittle:
      fdio_include = rebase_path("//zircon/system/ulib/fdio/include")

      zircon_sysroot = rebase_path("$root_out_dir/sdks/zircon_sysroot/arch/$target_cpu/sysroot")

      args += [
        "--zircon-sysroot",
        zircon_sysroot,
        "--fdio-include",
        fdio_include,
        "--go-root",
        rebase_path("$host_tools_dir/goroot"),
      ]

    } else {
      args += [
        "--go-root",
        rebase_path("//buildtools/${host_platform}/go"),
      ]

    }

    if (use_strip) {
      args += [
        "--unstripped-binname",
        "exe.unstripped/${output_name}",
      ]
    }

    if (defined(invoker.test) && invoker.test) {
      args += [ "--is-test=true" ]
    }

    if (defined(invoker.deps)) {
      deps += invoker.deps
      args += [ "--go-dep-files" ]
      foreach(dep, invoker.deps) {
        gen_dir = get_label_info(dep, "target_gen_dir")
        name = get_label_info(dep, "name")
        args += [ rebase_path("$gen_dir/$name.go_deps") ]
      }
    }

    args += [
      "--package",
      invoker.gopackage,
    ]
  }

  # Allow host binaries to be published in SDKs.
  if (defined(invoker.sdk_category) && invoker.sdk_category != "excluded" &&
      !is_fuchsia && (!defined(invoker.test) || !invoker.test)) {
    file_base = "tools/$output_name"

    sdk_atom("${target_name}_sdk") {
      domain = "exe"
      name = output_name
      id = "sdk://tools/$output_name"

      category = invoker.sdk_category

      meta = {
        dest = "$file_base-meta.json"
        schema = "host_tool"
        value = {
          type = "host_tool"
          name = output_name
          root = "tools"
          files = [
            file_base,
          ]
        }
      }

      tags = [ "arch:host" ]

      files = [
        {
          source = output_path
          dest = output_name
        },
      ]

      new_files = [
        {
          source = output_path
          dest = file_base
        }
      ]

      non_sdk_deps = [ ":$main_target_name" ]
    }
  }
}
