blob: 45a9337f11f5d3b96418813917069081dd3ac7c3 [file] [log] [blame]
# 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.
declare_args() {
# This is the directory where host tools intended for manual use by
# developers get installed. It's something a developer might put
# into their shell's $PATH. Host tools that are just needed as part
# of the build do not get copied here. This directory is only for
# things that are generally useful for testing or debugging or
# whatnot outside of the GN build itself. These are only installed
# by an explicit install_host_tools() rule (see //build/host.gni).
host_tools_dir = "$root_build_dir/host-tools"
}
# This declares that a host tool (a target built in host_toolchain)
# should be installed in host_tools_dir. This target can be used in
# any toolchain, and it will forward to host_toolchain.
#
# Parameters
#
# outputs (required)
# [files list] Simple file name of each tool, should be the
# same as the output_name in the executable() or similar rule
# (which is usually just that target's name).
#
# deps (recommended)
# [label list] Should list each target that actually builds each output.
# It does not need to use explicit toolchain suffixes; the only target
# using the deps will be instantiated only in host_toolchain.
#
# testonly (optional)
# visibility (optional)
# Standard GN meaning.
#
# Example of usage:
#
# executable("frob") { ... }
# install_host_tools("fiddlers") {
# deps = [ ":frob", "//some/other/dir:twiddle" ]
# outputs = [ "frob", "twiddle" ]
# }
template("install_host_tools") {
assert(defined(invoker.outputs), "install_host_tools() must define outputs")
# There is more than one host_toolchain when variants are involved,
# but all those copy their executables to the base host_toolchain
# (which toolchain_variant.base points to in every host_toolchain).
if (current_toolchain == host_toolchain &&
current_toolchain == toolchain_variant.base) {
copy(target_name) {
forward_variables_from(invoker,
[
"deps",
"testonly",
"visibility",
])
if (defined(visibility)) {
visibility += [ ":$target_name" ]
}
outputs = [
"$host_tools_dir/{{source_file_part}}",
]
sources = []
foreach(output_name, invoker.outputs) {
sources += [ "$root_out_dir/$output_name" ]
}
}
} else {
# Redirect to the base host_toolchain, where the copy rule above is.
# In a variant host_toolchain context, toolchain_variant.base points
# there, while host_toolchain always matches current_toolchain.
group(target_name) {
if (current_toolchain == host_toolchain) {
toolchain = toolchain_variant.base
} else {
toolchain = host_toolchain
}
deps = [
":$target_name($toolchain)",
]
forward_variables_from(invoker,
[
"testonly",
"visibility",
])
not_needed(invoker,
[
"deps",
"outputs",
])
}
}
}