# 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_action.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, root_build_dir),
    ]
  }

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

    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_action(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
    }
  }
}
