blob: b80dfe3e422c74bf76b404b8f7668335ff1f303c [file] [log] [blame]
# Copyright 2019 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.
import("$zx/public/gn/toolchain/environment_redirect.gni")
# Depend on a build host tool.
#
# This defines its target as an environment_redirect() that finds the
# actual target that host_tool_action() would use to run its tool.
#
# Parameters
#
# tool
# Required: See host_tool_action().
#
template("host_tool_redirect") {
# Dispatch to a host toolchain to get the tool built.
environment_redirect(target_name) {
forward_variables_from(invoker,
[
"assert_no_deps",
"testonly",
"visibility",
])
environment_label = "$zx/public/gn/toolchain:host"
cpu = host_cpu
os = host_os
direct = true
deps = [
invoker.tool,
]
}
}
# Subroutine of host_tool_action() and host_tool_action_foreach().
template("_host_tool_action_target") {
action_target = target_name
assert(defined(invoker.tool), "tool must be defined for $target_name")
assert(defined(invoker.outputs), "outputs must be defined for $target_name")
tool_target = "_host_tool_action.tool.$action_target"
rspfile_target = "_host_tool_action.rsp.$action_target"
host_tool_redirect(tool_target) {
forward_variables_from(invoker, [ "testonly" ])
visibility = [
":$action_target",
":$rspfile_target",
]
tool = invoker.tool
}
# The response file generated by host_tool() gives the files used (like
# the executable itself), then "--", then the arguments that make up the
# command line prefix to invoke the tool. host_tool_action.sh consumes that.
rspfile = "$target_gen_dir/$target_name._host_tool_action.rsp"
generated_file(rspfile_target) {
forward_variables_from(invoker, [ "testonly" ])
visibility = [ ":$action_target" ]
deps = [
":$tool_target",
]
outputs = [
rspfile,
]
data_keys = [ "host_tool_rspfile" ]
walk_keys = [ "host_tool_barrier" ]
}
target(invoker._target_type, action_target) {
forward_variables_from(invoker,
[
"assert_no_deps",
"data_deps",
"deps",
"inputs",
"outputs",
"public_deps",
"sources",
"testonly",
"visibility",
])
if (!defined(deps)) {
deps = []
}
if (!defined(inputs)) {
inputs = []
}
deps += [
":$rspfile_target",
":$tool_target",
]
inputs += [ rspfile ]
depfile =
"$target_out_dir/$target_name.{{source_file_part}}._host_tool_action.d"
if (defined(invoker.depfile)) {
orig_depfile = rebase_path(invoker.depfile, root_build_dir)
} else {
orig_depfile = "-"
}
script = "$zx/public/gn/host_tool_action.sh"
args = rebase_path([
rspfile,
outputs[0],
depfile,
],
root_build_dir) + [ orig_depfile ]
if (defined(invoker.args)) {
args += invoker.args
}
metadata = {
# This can be used to prune metadata walks that want to treat
# any sort of action target as an opaque atom.
action_barrier = []
# Never follow the deps to find link outputs from invoker.tool.
# TODO: Maybe should still follow invoker.deps?
link_barrier = []
if (defined(invoker.metadata)) {
forward_variables_from(invoker.metadata, "*")
}
}
}
}
# Run an action() using a host_tool() compiled for the build host.
#
# This takes all the same parameters as action() except that $script is
# replaced by $tool. See also host_tool_action_foreach().
#
# Parameters
#
# tool
# Required: Label (without toolchain) of a host_tool() target.
# The tool will be built for the build host if necessary, and
# then run with the $args list just like $script runs in action().
# Type: label_no_toolchain
#
# Other parameters are as for action().
template("host_tool_action") {
_host_tool_action_target(target_name) {
_target_type = "action"
forward_variables_from(invoker, "*")
}
}
# Run an action_foreach() using a host_tool() compiled for the build host.
#
# This takes all the same parameters as action_foreach() except that
# $script is replaced by $tool. host_tool_action_foreach() is to as
# action_foreach() as host_tool_action() is to action().
#
# Parameters
#
# tool
# Required: Label (without toolchain) of a host_tool() target.
# The tool will be built for the build host if necessary, and
# then run with the $args list just like $script runs in action().
# Type: label_no_toolchain
#
# Other parameters are as for action_foreach().
template("host_tool_action_foreach") {
_host_tool_action_target(target_name) {
_target_type = "action_foreach"
forward_variables_from(invoker, "*")
}
}