mirror of
https://fuchsia.googlesource.com/third_party/pigweed.googlesource.com/pigweed/pigweed
synced 2024-09-20 13:51:05 +00:00
c8b939009b
The GN convention is to specify paths in command lines relative to the build directory. Unfortunately and contrary to pigweed's expectations this is not what rebase_path(path) does; that outputs an absolute path. Absolute paths are not desirable in most circumstances as they contain sources of nondeterminism such as the developer's home directory. Using them can for example reduce hit rate in build caches. Replace rebase_path(path) with rebase_path(path, root_build_dir) which is the correct idiom and matches GN's builtin behavior (e.g. for sources, include_dirs, etc). This also removes the --directory argument to python_action(). Changing the directory during the build while using relative paths is likely to result in confusion and should be discouraged. There's a couple more things to do on top of this for identical binaries between build directories / machines / developers: - pass options to avoid embedding the working directory - pass options to use relative paths for the vendored clang & libc++ See [1]-[2] for how to do that. [1] https://source.chromium.org/chromium/chromium/src/+/main:build/config/compiler/BUILD.gn;l=1170-1239;drc=ab531c265c533cba1c2f6d8240cc0bf7679f605a [2] https://cs.opensource.google/fuchsia/fuchsia/+/main:build/config/BUILD.gn;l=145-216;drc=f6d705f0937c778d5d5f807a4580113612b02f5a Change-Id: I17708102c03d6488d68c8571b6e9343191fd47de Reviewed-on: https://pigweed-review.googlesource.com/c/pigweed/pigweed/+/47461 Reviewed-by: Wyatt Hepler <hepler@google.com> Commit-Queue: Michael Spang <spang@google.com>
136 lines
3.5 KiB
Plaintext
136 lines
3.5 KiB
Plaintext
# 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, 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" ]
|
|
}
|
|
|
|
_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
|
|
}
|
|
}
|
|
}
|