# Copyright 2021 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.

# Template used internally by python_action() and others below
# Uses the same parameters as their callers, with the addition of:
#
# Parameters:
#   target_type: Inner target type to invoke (e.g. "action")
#
template("_python_action") {
  assert(
      defined(invoker.binary_label),
      "The label of the python_binary() to use to perform the action must be specified.")

  # force the binary_label into the host toolchain
  binary_label_no_toolchain =
      get_label_info(invoker.binary_label, "label_no_toolchain")
  binary_label = "${binary_label_no_toolchain}(${host_toolchain})"

  binary_label_name = get_label_info(binary_label, "name")
  binary_tool_output_dir = get_label_info(binary_label, "target_out_dir")
  binary_tool_output_name = "${binary_tool_output_dir}/${binary_label_name}.pyz"

  target(invoker.target_type, target_name) {
    forward_variables_from(invoker,
                           "*",
                           [
                             "assert_no_deps",
                             "deps",
                             "binary_label",
                             "script",
                             "target_type",
                           ])
    script = binary_tool_output_name
    deps = [ binary_label ]
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }
  }
}

# Declares an action() that uses a python_binary for the script
#
# This sets up the python module search path using the GN paths specified, and
# otherwise is the same as an action(), forwarding all invoker vars to the
# action()
#
# Parameters:
#
#   binary_label
#    [label] Label (without host toolchain), to python binary that is to be
#    executed by the action.
#
#   all others are passed to action() as expected,
#
template("python_action") {
  _python_action(target_name) {
    forward_variables_from(invoker, "*")
    target_type = "action"
  }
}

# Declares an hermetic_inputs_action() that uses a python_binary for the script
#
# This is useful if the action's command is not hermetic, which is allowed
# for those that generate hermetic input files. See documentation for action()
# and hermetic_inputs_action() in //build/config/BUILDCONFIG.gn for more details.
#
# This sets up the python module search path using the GN paths specified, and
# otherwise is the same as an action(), forwarding all invoker vars to the
# action()
#
# Parameters:
#
#   binary_label
#    [label] Label (without host toolchain), to python binary that is to be
#    executed by the action.
#
#   all others are passed to hermetic_inputs_action() as expected,
#
template("python_hermetic_inputs_action") {
  _python_action(target_name) {
    forward_variables_from(invoker, "*")
    target_type = "hermetic_inputs_action"
  }
}
