# 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), ] } if (defined(invoker.args_file)) { _script_args += [ "--args-file", rebase_path(invoker.args_file), ] 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 } } }