# 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.
#
#  public_deps: Public dependencies for this target. In addition to outputs from
#    this target, outputs generated by public dependencies can be used as inputs
#    from targets that depend on this one. This is not the case for private
#    deps.
#
#  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.
#
#  working_directory: The working directory to execute the subprocess with. If
#    not specified it will not be set and the subprocess will have whatever the
#    parent current working directory is.
#
# 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" ]
    _capture_output = true
  } else {
    _capture_output = false
  }

  if (defined(invoker.working_directory)) {
    _script_args += [
      "--working-directory",
      invoker.working_directory,
    ]
  }

  _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
    capture_output = _capture_output

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

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

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