# Copyright 2019 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.

import("python_script.gni")

# Runs a program which isn't in Python.
#
# This is provided to avoid having to write a new Python wrapper script every
# time a program needs to be run from GN.
#
# Args:
#  program: The program to run. Can be a full path or just a name (in which case
#    $PATH is searched).
#
#  args: Optional list of arguments to the program.
#
#  deps: Dependencies for this target.
#
#  inputs: Optional list of build inputs to the program.
#
#  outputs: Optional list of artifacts produced by the program's execution.
#
#  env: Optional list of key-value pairs defining environment variables for
#    the program.
#
#  env_file: Optional path to a file containing a list of newline-separated
#    key-value pairs defining environment variables for the program.
#
#  args_file: Optional path to a file containing additional positional arguments
#    to the program. Each line of the file is appended to the invocation. Useful
#    for specifying arguments from GN metadata.
#
#  skip_empty_args: If args_file is provided, boolean indicating whether to skip
#    running the program if the file is empty. Used to avoid running commands
#    which error when called without arguments.
#
#  capture_output: If true, output from the program is hidden unless the program
#    exits with an error. Defaults to true.
#
# Example:
#
#   pw_exec("hello_world") {
#     program = "/bin/sh"
#     args = [
#       "-c",
#       "echo hello \$WORLD",
#     ]
#     env = [
#       "WORLD=world",
#     ]
#   }
#
template("pw_exec") {
  assert(defined(invoker.program), "pw_exec requires a program to run")

  _script_args = [
    "--target",
    target_name,
  ]

  if (defined(invoker.env_file)) {
    _script_args += [
      "--env-file",
      rebase_path(invoker.env_file),
    ]
  }

  if (defined(invoker.args_file)) {
    _script_args += [
      "--args-file",
      rebase_path(invoker.args_file),
    ]

    if (defined(invoker.skip_empty_args) && invoker.skip_empty_args) {
      _script_args += [ "--skip-empty-args" ]
    }
  }

  if (defined(invoker.env)) {
    foreach(_env, invoker.env) {
      _script_args += [
        "--env",
        _env,
      ]
    }
  }

  if (!defined(invoker.capture_output) || invoker.capture_output) {
    _script_args += [ "--capture-output" ]
  }

  _script_args += [
    "--",
    invoker.program,
  ]
  if (defined(invoker.args)) {
    _script_args += invoker.args
  }

  pw_python_script(target_name) {
    script = "$dir_pw_build/py/pw_build/exec.py"
    args = _script_args

    forward_variables_from(invoker,
                           [
                             "deps",
                             "inputs",
                             "pool",
                           ])

    if (!defined(inputs)) {
      inputs = []
    }
    if (defined(invoker.env_file)) {
      inputs += [ invoker.env_file ]
    }

    if (defined(invoker.outputs)) {
      outputs = invoker.outputs
    } else {
      stamp = true
    }
  }
}
