# 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.
#
#  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",
                           ])

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

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