eliminate stderr usage in std.Build make() functions
* Eliminate all uses of `std.debug.print` in make() functions, instead
properly using the step failure reporting mechanism.
* Introduce the concept of skipped build steps. These do not cause the
build to fail, and they do allow their dependants to run.
* RunStep gains a new flag, `skip_foreign_checks` which causes the
RunStep to be skipped if stdio mode is `check` and the binary cannot
be executed due to it being a foreign executable.
- RunStep is improved to automatically use known interpreters to
execute binaries if possible (integrating with flags such as
-fqemu and -fwasmtime). It only does this after attempting a native
execution and receiving a "exec file format" error.
- Update RunStep to use an ArrayList for the checks rather than this
ad-hoc reallocation/copying mechanism.
- `expectStdOutEqual` now also implicitly adds an exit_code==0 check
if there is not already an expected termination. This matches
previously expected behavior from older API and can be overridden by
directly setting the checks array.
* Add `dest_sub_path` to `InstallArtifactStep` which allows choosing an
arbitrary subdirectory relative to the prefix, as well as overriding
the basename.
- Delete the custom InstallWithRename step that I found deep in the
test/ directory.
* WriteFileStep will now update its step display name after the first
file is added.
* Add missing stdout checks to various standalone test case build
scripts.
This commit is contained in:
@@ -26,6 +26,9 @@ pub const State = enum {
|
||||
dependency_failure,
|
||||
success,
|
||||
failure,
|
||||
/// This state indicates that the step did not complete, however, it also did not fail,
|
||||
/// and it is safe to continue executing its dependencies.
|
||||
skipped,
|
||||
};
|
||||
|
||||
pub const Id = enum {
|
||||
@@ -106,13 +109,15 @@ pub fn init(options: Options) Step {
|
||||
/// If the Step's `make` function reports `error.MakeFailed`, it indicates they
|
||||
/// have already reported the error. Otherwise, we add a simple error report
|
||||
/// here.
|
||||
pub fn make(s: *Step, prog_node: *std.Progress.Node) error{MakeFailed}!void {
|
||||
return s.makeFn(s, prog_node) catch |err| {
|
||||
if (err != error.MakeFailed) {
|
||||
pub fn make(s: *Step, prog_node: *std.Progress.Node) error{ MakeFailed, MakeSkipped }!void {
|
||||
return s.makeFn(s, prog_node) catch |err| switch (err) {
|
||||
error.MakeFailed => return error.MakeFailed,
|
||||
error.MakeSkipped => return error.MakeSkipped,
|
||||
else => {
|
||||
const gpa = s.dependencies.allocator;
|
||||
s.result_error_msgs.append(gpa, @errorName(err)) catch @panic("OOM");
|
||||
}
|
||||
return error.MakeFailed;
|
||||
return error.MakeFailed;
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
@@ -192,10 +197,14 @@ pub fn evalChildProcess(s: *Step, argv: []const []const u8) !void {
|
||||
}
|
||||
|
||||
pub fn fail(step: *Step, comptime fmt: []const u8, args: anytype) error{ OutOfMemory, MakeFailed } {
|
||||
try step.addError(fmt, args);
|
||||
return error.MakeFailed;
|
||||
}
|
||||
|
||||
pub fn addError(step: *Step, comptime fmt: []const u8, args: anytype) error{OutOfMemory}!void {
|
||||
const arena = step.owner.allocator;
|
||||
const msg = try std.fmt.allocPrint(arena, fmt, args);
|
||||
try step.result_error_msgs.append(arena, msg);
|
||||
return error.MakeFailed;
|
||||
}
|
||||
|
||||
/// Assumes that argv contains `--listen=-` and that the process being spawned
|
||||
@@ -398,5 +407,5 @@ fn failWithCacheError(s: *Step, man: *const std.Build.Cache.Manifest, err: anyer
|
||||
const i = man.failed_file_index orelse return err;
|
||||
const pp = man.files.items[i].prefixed_path orelse return err;
|
||||
const prefix = man.cache.prefixes()[pp.prefix].path orelse "";
|
||||
return s.fail("{s}: {s}/{s}\n", .{ @errorName(err), prefix, pp.sub_path });
|
||||
return s.fail("{s}: {s}/{s}", .{ @errorName(err), prefix, pp.sub_path });
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user