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

declare_args() {
  #   gocache_dir
  #     Directory GOCACHE environment variable will be set to. This directory
  #     will have build and test results cached, and is safe to be written to
  #     concurrently. If overridden, this directory must be a full path.
  gocache_dir = rebase_path("$root_out_dir/.gocache")

  #   go_vet_enabled
  #     [bool] if false, go vet invocations are disabled for all builds.
  go_vet_enabled = false
}

# 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.
#
#   skip_vet (optional)
#     Whether to skip running go vet for this target. This flag should _only_
#     be used for packages in the Go source tree itself that otherwise match
#     whitelist entries in go vet all. Go vet is only run if go_vet_enabled is
#     true.
#
#   test (optional, default: false)
#     Whether this target defines a test.
#
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
    }

    pool = "//build/go:pool($default_toolchain)"

    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),
      "--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,
      "--lib-dir",
      rebase_path(get_label_info(":any($shlib_toolchain)", "root_out_dir")),
      "--go-cache",
      gocache_dir,
      "--cc",
      rebase_path("$clang_prefix/clang", "", root_build_dir),
      "--cxx",
      rebase_path("$clang_prefix/clang++", "", root_build_dir),
      "--objcopy",
      rebase_path("$clang_prefix/llvm-objcopy", "", root_build_dir),
      "--sysroot",
      sysroot,
      "--target",
      clang_target,
    ]

    if (defined(invoker.skip_vet) && !invoker.skip_vet && go_vet_enabled) {
      args += [ "--vet" ]
    }

    if (is_fuchsia) {
      deps += [
        "//third_party/go:go_runtime",
        "//zircon/public/lib/fdio",
      ]

      args += [
        # GN provides no way to propagate include paths like this, so, this
        # is brittle.
        "--include-dir",
        rebase_path("//zircon/system/ulib/fdio/include"),
        "--include-dir",
        rebase_path("//zircon/third_party/ulib/musl/include"),
        "--include-dir",
        rebase_path("//zircon/system/public"),
        "--go-root",
        rebase_path("$host_tools_dir/goroot"),
      ]

      foreach(target, zircon_legacy_targets) {
        if (target.target_name == "zircon") {
          _libs = target.libs
          lib = _libs[0]
          assert(_libs == [ lib ])
          _libs = []
          args += [
            "--lib-dir",
            rebase_path(get_path_info("$zircon_root_build_dir/$lib", "dir")),
          ]
        }
      }

      # See //build/config/fuchsia:fdio_config.
      args += [
        "--lib-dir",
        rebase_path(get_label_info("//build/config/fuchsia:fdio_config",
                                   "target_gen_dir")),
      ]
    } 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) {
      testonly = true
      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") {
      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 ]
        }
      }

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

      if (defined(invoker.sdk_deps)) {
        deps = invoker.sdk_deps
      }

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