# Copyright 2018 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.

# Defines a set of Go code that can be used by other Go targets
#
# Parameters
#
#   name (optional)
#     Name of the Go package.
#     Defaults to "go.fuchsia.dev/fuchsia/${source_dir}".
#
#   name_file (optional)
#     Path to a file containing the name of the Go package.
#     This should be used when the package's name requires some computation in
#     its own build target.
#
#     NOTE: Exactly one of `name` or `name_file` may be set, but not both.
#           If neither is set, then the target name is used.
#
#   source_dir (optional)
#     Path to the root of the sources for the package.
#     Defaults to the current directory.
#
#   sources (required)
#     List of source files, relative to source_dir.
#
#   deps (optional)
#     List of labels for Go libraries this target depends on.
#
#   non_go_deps (optional)
#     List of labels for non-Go targets this library depends on.
#
#   public_non_go_deps (optional)
#     List of labels for non-Go targets this library publicly depends on.
#
#   metadata (optional)
#     Scope giving the metadata of this library.
#
template("go_library") {
  assert(!(defined(invoker.name) && defined(invoker.name_file)),
         "Defining both name and name_file is not allowed")

  source_dir = "."
  if (defined(invoker.source_dir)) {
    source_dir = invoker.source_dir
  }

  if (defined(invoker.name)) {
    # All libraries should use the default `name` value, with just a couple
    # exceptions:
    assert(filter_exclude([ rebase_path(source_dir, "//") ],
                          [
                            # Third-party repositories must set `name` to the
                            # canonical go package name.
                            "third_party/*",

                            # There's no standard naming scheme for libraries
                            # that are generated at build time, so `name` must
                            # be set.
                            rebase_path(root_build_dir, "//") + "/*",

                            # Required to support setting the `syzkaller_dir` GN
                            # arg to point to a syzkaller checkout outside the
                            # platform source tree.
                            "../*",
                          ]) == [],
           "go_library name cannot be overridden")
    name_args = [
      "--name",
      invoker.name,
    ]
  } else if (defined(invoker.name_file)) {
    # Make name_file a system-absolute path and add it to args.
    name_args = [
      "--name-file",
      rebase_path(invoker.name_file, root_build_dir),
    ]
  } else {
    target_name_dir = get_label_info(":$target_name", "dir")
    source_dir = rebase_path(source_dir, target_name_dir)
    name_args = [
      "--name",
      "go.fuchsia.dev/fuchsia/" + rebase_path(source_dir, "//"),
    ]
  }

  action(target_name) {
    script = "//build/go/gen_library_metadata.py"

    library_file = "$target_gen_dir/$target_name.go_deps"

    outputs = [ library_file ]

    deps = []
    dependent_libraries = []

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

    forward_variables_from(invoker, [ "data_deps" ])

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

    public_deps = []
    if (defined(invoker.public_deps)) {
      public_deps += invoker.public_deps
    }
    if (defined(invoker.public_non_go_deps)) {
      public_deps += invoker.public_non_go_deps
    }

    inputs = dependent_libraries
    if (defined(invoker.name_file)) {
      inputs += [ invoker.name_file ]
    }

    args = name_args + [
             "--root-build-dir",
             rebase_path(root_build_dir, root_build_dir),
             "--source-dir",
             rebase_path(source_dir, root_build_dir),
             "--output",
             rebase_path(library_file, root_build_dir),
             "--deps",
           ] + rebase_path(dependent_libraries, root_build_dir)

    # TODO(https://fxbug.dev/42160667): deprecate allow_globbing
    if (defined(invoker.allow_globbing) && invoker.allow_globbing) {
      assert(target_name == "syzkaller-go",
             "allow_globbing is deprecated, see https://fxbug.dev/42160667")
      assert(!defined(invoker.sources),
             "sources cannot be listed when globbing is enabled")
      args += [ "--allow-globbing" ]
    } else {
      assert(defined(invoker.sources) && invoker.sources != [],
             "sources must be listed")
      args += [ "--sources" ] + invoker.sources
      inputs += rebase_path(invoker.sources, ".", source_dir)
    }

    if (defined(invoker.metadata)) {
      metadata = invoker.metadata
    }

    forward_variables_from(invoker,
                           [
                             "testonly",
                             "visibility",
                           ])
  }
}
