# Copyright 2021 The Flutter Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# A ninja action script that calls the given python script with `python3`
# instead of the default `python` (which might be `python2`).
#
# Example
#
# ```
# python3_action("run_this_guy_once") {
#   script = "doprocessing.py"
#   sources = [ "my_configuration.txt" ]
#   outputs = [ "$target_gen_dir/insightful_output.txt" ]
#
#   # Our script imports this Python file so we want to rebuild if it
#   # changes.
#   source_prereqs = [ "helper_library.py" ]
#
#   # Note that we have to manually pass the sources to our script if
#   # the script needs them as inputs.
#   args = [ "--out", to_build_path(target_gen_dir) ] + sources
# }
# ```
#
# Parameters
#  args
#  data
#  datadeps
#  depfile
#  deps
#  inputs
#  metadata
#  outputs (required)
#  script (required)
#  source_prereqs
#  sources
template("python3_action") {
  assert(defined(invoker.outputs), "outputs is required")
  assert(defined(invoker.script), "script is required")

  action(target_name) {
    forward_variables_from(invoker,
                           [
                             "data",
                             "datadeps",
                             "depfile",
                             "deps",
                             "inputs",
                             "metadata",
                             "outputs",
                             "source_prereqs",
                             "sources",
                           ])

    script = "//flutter/tools/python/run_python3_action.py"

    args = [ rebase_path(invoker.script) ] + invoker.args
  }
}
