# 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 the target name.
#
#   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.
#
#   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.

template("go_library") {
  assert(!(defined(invoker.name) && defined(invoker.name_file)),
         "Defining both name and name_file is not allowed")
  if (defined(invoker.name)) {
    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, "")]
  } else {
    name_args = ["--name", target_name]
  }

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

  action(target_name) {
    script = "//build/go/gen_libraries.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" ]
      }
    }

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

    inputs = dependent_libraries

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