aboutsummaryrefslogtreecommitdiff
path: root/lib/build_runner.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2023-02-19 16:21:36 -0700
committerAndrew Kelley <andrew@ziglang.org>2023-03-15 10:48:12 -0700
commitcb094700631ea1ae238ea678c192ce4f85fbecc0 (patch)
treeb79eb3a4bd26ce880829be3665470c3049d0fe53 /lib/build_runner.zig
parent96d798db8b704a2fd367e58a19d6fe853a8a76a8 (diff)
downloadzig-cb094700631ea1ae238ea678c192ce4f85fbecc0.tar.gz
zig-cb094700631ea1ae238ea678c192ce4f85fbecc0.zip
zig build: add a -j<N> option for limiting concurrency
Diffstat (limited to 'lib/build_runner.zig')
-rw-r--r--lib/build_runner.zig20
1 files changed, 18 insertions, 2 deletions
diff --git a/lib/build_runner.zig b/lib/build_runner.zig
index 24fd3440a3..e12d46f03d 100644
--- a/lib/build_runner.zig
+++ b/lib/build_runner.zig
@@ -87,6 +87,7 @@ pub fn main() !void {
var targets = ArrayList([]const u8).init(allocator);
var debug_log_scopes = ArrayList([]const u8).init(allocator);
+ var thread_pool_options: std.Thread.Pool.Options = .{ .allocator = allocator };
const stderr_stream = io.getStdErr().writer();
const stdout_stream = io.getStdOut().writer();
@@ -231,6 +232,19 @@ pub fn main() !void {
};
} else if (mem.eql(u8, arg, "-fno-reference-trace")) {
builder.reference_trace = null;
+ } else if (mem.startsWith(u8, arg, "-j")) {
+ const num = arg["-j".len..];
+ const n_jobs = std.fmt.parseUnsigned(u32, num, 10) catch |err| {
+ std.debug.print("unable to parse jobs count '{s}': {s}", .{
+ num, @errorName(err),
+ });
+ process.exit(1);
+ };
+ if (n_jobs < 1) {
+ std.debug.print("number of jobs must be at least 1\n", .{});
+ process.exit(1);
+ }
+ thread_pool_options.n_jobs = n_jobs;
} else if (mem.eql(u8, arg, "--")) {
builder.args = argsRest(args, arg_idx);
break;
@@ -258,7 +272,7 @@ pub fn main() !void {
if (builder.validateUserInputDidItFail())
usageAndErr(builder, true, stderr_stream);
- runStepNames(builder, targets.items, main_progress_node) catch |err| {
+ runStepNames(builder, targets.items, main_progress_node, thread_pool_options) catch |err| {
switch (err) {
error.UncleanExit => process.exit(1),
else => return err,
@@ -270,6 +284,7 @@ fn runStepNames(
b: *std.Build,
step_names: []const []const u8,
parent_prog_node: *std.Progress.Node,
+ thread_pool_options: std.Thread.Pool.Options,
) !void {
var step_stack = ArrayList(*Step).init(b.allocator);
defer step_stack.deinit();
@@ -297,7 +312,7 @@ fn runStepNames(
}
var thread_pool: std.Thread.Pool = undefined;
- try thread_pool.init(b.allocator);
+ try thread_pool.init(thread_pool_options);
defer thread_pool.deinit();
{
@@ -523,6 +538,7 @@ fn usage(builder: *std.Build, already_ran_build: bool, out_stream: anytype) !voi
\\ --verbose Print commands before executing them
\\ --color [auto|off|on] Enable or disable colored error messages
\\ --prominent-compile-errors Output compile errors formatted for a human to read
+ \\ -j<N> Limit concurrent jobs (default is to use all CPU cores)
\\
\\Project-Specific Options:
\\