# 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.
#
#  venv: Python virtualenv to pass along to the underlying pw_python_action.
#
#  visibility: GN visibility to apply to the underlying target.
#
# 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",
                             "venv",
                             "visibility",
                           ])

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

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