|  | # 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. | 
|  | # | 
|  | # 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 = [] | 
|  |  | 
|  | if (defined(invoker.env_file)) { | 
|  | _script_args += [ | 
|  | "--env-file", | 
|  | get_path_info(invoker.env_file, "abspath"), | 
|  | ] | 
|  | } | 
|  |  | 
|  | if (defined(invoker.args_file)) { | 
|  | _script_args += [ | 
|  | "--args-file", | 
|  | get_path_info(invoker.args_file, "abspath"), | 
|  | ] | 
|  |  | 
|  | 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, | 
|  | ] | 
|  | } | 
|  | } | 
|  |  | 
|  | _script_args += [ | 
|  | "--", | 
|  | invoker.program, | 
|  | ] | 
|  | if (defined(invoker.args)) { | 
|  | _script_args += invoker.args | 
|  | } | 
|  |  | 
|  | pw_python_script(target_name) { | 
|  | script = "$dir_pw_build/py/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 | 
|  | } | 
|  | } | 
|  | } |