# 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_legacy_vars.gni")
import("//build/config/sysroot.gni")
import("//build/fidl/wireformat.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
#
#   gopackages (required)
#     List of packages to build.
#
#   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.
#
#   carchive (optional, default: false)
#     Whether to build this target as a C archive.
#
#   gcflags (optional)
#     List of go compiler flags to pass.
#
#   ldflags (optional)
#     List of go linker flags to pass.
#
#   tags (optional)
#     List of go build tags to include in the build.
#
template("go_build") {
  assert(defined(invoker.gopackages),
         "gopackages must be defined for $target_name")
  gopackages = invoker.gopackages
  assert(
      gopackages == [ gopackages[0] ],
      "gopackages currently only supports one package because of http://crbug.com/fuchsia/8088")

  main_target_name = target_name
  is_test = defined(invoker.test) && invoker.test
  carchive = defined(invoker.carchive) && invoker.carchive
  assert(!(is_test && carchive),
         "cannot specify both test=true and carchive=true")

  output_name = target_name
  if (defined(invoker.output_name)) {
    output_name = invoker.output_name
  }
  if (carchive) {
    output_name = "${output_name}.a"
  }

  # Variants don't have any effect for Go builds. But dependencies from other
  # targets in variant toolchains could lead to building the same Go target
  # identically in multiple toolchains. The expectation with executable-like
  # targets is that they do their own variant selection and thus always only
  # build one way. Since Go isn't doing variant selection, instead redirect from
  # variants to the base toolchain so the target is only built one way.
  if (toolchain_variant.name != "") {
    if (is_host && !is_test) {
      # This target might be referenced by compiled_action(), which expects to
      # find the binary in $host_toolchain's root_out_dir and host_toolchain
      # always matches the current variant when in a variant host_toolchain.
      # So copy the binary to this toolchain's root_out_dir.
      copy(main_target_name) {
        forward_variables_from(invoker,
                               [
                                 "testonly",
                                 "visibility",
                               ])
        if (is_test) {
          testonly = true
        }
        public_deps = [ ":$main_target_name(${toolchain_variant.base})" ]
        base_root_out_dir = get_label_info(public_deps[0], "root_out_dir")
        sources = [ "$base_root_out_dir/$output_name" ]
        outputs = [ "$root_out_dir/$output_name" ]
      }
    } else {
      group(main_target_name) {
        forward_variables_from(invoker,
                               [
                                 "testonly",
                                 "visibility",
                               ])
        if (is_test) {
          testonly = true
        }
        public_deps = [ ":$main_target_name(${toolchain_variant.base})" ]
      }
    }
    not_needed(invoker, "*")
  } else {
    define_sdk_target = defined(invoker.sdk_category) &&
                        invoker.sdk_category != "excluded" && !is_test

    # Strip target binaries and binaries that are included in the SDK.
    use_strip = (is_fuchsia || define_sdk_target) && !carchive

    output_path = "${root_out_dir}/${output_name}"
    if (use_strip) {
      output_path = "${root_out_dir}/exe.unstripped/${output_name}"
      stripped_output_path = "${root_out_dir}/${output_name}"
    }

    action(main_target_name) {
      forward_variables_from(invoker,
                             [
                               "testonly",
                               "visibility",
                             ])

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

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

      if (use_strip) {
        # Ensure that the 'canonical' output path of $root_out_dir/$output_name
        # always first among outputs, as this path has to be reconstructed within
        # go_test.gni and it can canonically compare that with outputs[0].
        outputs = [
          stripped_output_path,
          output_path,
        ]
      } else {
        outputs = [ output_path ]
      }

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

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

      godepfile = "//prebuilt/tools/godepfile/${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,
        "--output-path",
        rebase_path(output_path, root_build_dir),
        "--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 (use_strip) {
        args += [
          "--stripped-output-path",
          rebase_path(stripped_output_path, root_build_dir),
        ]
      }

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

      # Go build tags
      tags = []

      # Temporarily add a go tag if this GN arg is true.
      # This is for the FIDL union/xunion migration.
      if (fidl_write_v1_wireformat) {
        tags += [ "write_xunion_bytes_for_union" ]
      }

      if (defined(invoker.tags)) {
        tags += invoker.tags
      }

      foreach(tag, tags) {
        args += [
          "--tag",
          tag,
        ]
      }

      # Go compiler flags
      if (defined(invoker.gcflags)) {
        foreach(gcflag, invoker.gcflags) {
          args += [ "--gcflag=${gcflag}" ]
        }
      }

      if (defined(invoker.ldflags)) {
        foreach(ldflag, invoker.ldflags) {
          args += [ "--ldflag=${ldflag}" ]
        }
      }

      if (carchive) {
        args += [ "--buildmode=c-archive" ]
      }

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

        if (!carchive && output_breakpad_syms && host_os != "mac") {
          args += [
            "--dump-syms",
            rebase_path(
                "//prebuilt/third_party/breakpad/${host_platform}/dump_syms/dump_syms",
                root_build_dir),
          ]
        }

        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"),
        ]
        args += [
          # For src/sys/pkg/bin/pkgfs/ramdisk
          "--include-dir",
          rebase_path("//zircon/system/ulib/ramdevice-client/include"),
          "--lib-dir",
          rebase_path("gen/zircon/public/lib/ramdevice-client",
                      "",
                      root_build_dir),
        ]

        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("//prebuilt/third_party/go/${host_platform}"),
        ]
      }

      if (!carchive) {
        # Add needed arguments for the buildidtool. We should add the stamp file
        # output by buildidtool to the list of outputs for this action but because
        # Ninja (and by consequence GN) limits us to one depfile where that depfile
        # has only one output and we need the depfile for other things we don't
        # list it as an output.
        args += [
          "--buildidtool",
          rebase_path(
              "//prebuilt/tools/buildidtool/${host_platform}/buildidtool",
              root_build_dir),
          "--build-id-dir",
          ".build-id",
        ]
      }

      if (is_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") ]
        }
      }

      foreach(gopackage, invoker.gopackages) {
        args += [
          "--package",
          gopackage,
        ]
      }

      metadata = {
        tool_paths = []

        # Record metadata for the //:tool_paths build API for all non-test,
        # host binaries.
        if (!is_fuchsia && !is_test) {
          tool_paths = [
            {
              cpu = current_cpu
              label =
                  get_label_info(":$main_target_name", "label_with_toolchain")
              name = output_name
              os = current_os
              path = rebase_path(output_path, root_build_dir)
            },
          ]
        }

        binaries = [
          {
            type = "executable"
            label = get_label_info(":$target_name", "label_with_toolchain")
            cpu = current_cpu
            os = current_os
            debug = rebase_path(output_path, root_build_dir)
            if (use_strip) {
              dist = rebase_path(stripped_output_path, root_build_dir)
            } else {
              dist = debug
            }

            # TODO(fxbug.dev/27215): Update when we add linux go binaries
            # to .build-id.
            if (is_fuchsia) {
              elf_build_id = "$dist.build-id.stamp"
            }
            if (output_breakpad_syms && is_fuchsia) {
              breakpad = "$dist.sym"
            }
          },
        ]
      }
    }

    # Allow host binaries to be published in SDKs.
    if (define_sdk_target) {
      file_base = "tools/$output_name"

      # TODO(fxb/42999): remove extra atom
      if (current_cpu == host_cpu) {
        sdk_atom("${target_name}_sdk_legacy") {
          id = "sdk://$file_base"

          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 = "$root_out_dir/$output_name"
              dest = file_base
            },
          ]

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

          non_sdk_deps = [ ":$main_target_name" ]
        }
      }

      if (host_os == "linux" || host_os == "mac") {
        file_base = "tools/$current_cpu/$output_name"
      }

      sdk_atom("${target_name}_sdk") {
        id = "sdk://$file_base"

        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 = "$root_out_dir/$output_name"
            dest = file_base
          },
        ]

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

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