blob: 29b773a3ce6c67df18d071c61d2661a099dd686f [file] [log] [blame]
# 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",
])
}
}