# 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.
#
#   sources (optional)
#     List of source files, relative to source_dir.
#     TODO(BLD-228): make this attribute required.
#
#   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
  }

  go_sources = []
  if (defined(invoker.sources)) {
    go_sources = invoker.sources
  }

  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" ]
      }
    }

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

    inputs = dependent_libraries

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