aboutsummaryrefslogtreecommitdiff
path: root/src/main.zig
diff options
context:
space:
mode:
authorStephen Gutekanst <stephen@hexops.com>2022-02-21 14:18:15 -0700
committerStephen Gutekanst <stephen@hexops.com>2022-02-21 14:20:38 -0700
commitb341967da0fc0fe5dfc8fa914006fd6a7624297f (patch)
tree622c3b71c2950b05d8d1799c1a51cfa856c4732f /src/main.zig
parentefd473bbfc1417c5cc376f1b8ec44036752570bf (diff)
downloadzig-b341967da0fc0fe5dfc8fa914006fd6a7624297f.tar.gz
zig-b341967da0fc0fe5dfc8fa914006fd6a7624297f.zip
zig build: use a custom iterator for merging args and response file
Signed-off-by: Stephen Gutekanst <stephen@hexops.com>
Diffstat (limited to 'src/main.zig')
-rw-r--r--src/main.zig108
1 files changed, 54 insertions, 54 deletions
diff --git a/src/main.zig b/src/main.zig
index fa9ce18c78..7f7ba201d8 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -765,30 +765,30 @@ fn buildOutputType(
}
soname = .yes_default_value;
- var process_args_iter = try process.argsWithAllocator(arena);
- _ = process_args_iter.skip(); // "zig"
- _ = process_args_iter.skip(); // e.g. "build-lib"
- var resp_file_args_iter: ?ArgIteratorResponseFile = null;
-
- const getNextArg = (struct {
- pub fn getNextArg(_process_args_iter: *process.ArgIterator, maybe_resp_file_args_iter: *?ArgIteratorResponseFile) ?[:0]const u8 {
- if (_process_args_iter.next()) |proc_arg| return proc_arg;
- if (maybe_resp_file_args_iter.*) |*iter| return iter.next();
- return null;
- }
- }).getNextArg;
- args_loop: while (getNextArg(&process_args_iter, &resp_file_args_iter)) |arg| {
- var args_index = process_args_iter.inner.index;
- if (resp_file_args_iter) |iter| {
- args_index = iter.index;
+ const Iterator = struct {
+ resp_file: ?ArgIteratorResponseFile = null,
+ args: []const []const u8,
+ i: usize = 0,
+ fn next(it: *@This()) ?[]const u8 {
+ if (it.i >= it.args.len) {
+ if (it.resp_file) |*resp| return if (resp.next()) |sentinel| std.mem.span(sentinel) else null;
+ return null;
+ }
+ defer it.i += 1;
+ return it.args[it.i];
}
+ };
+ var args_iter = Iterator{
+ .args = all_args[2..],
+ };
+ args_loop: while (args_iter.next()) |arg| {
if (mem.startsWith(u8, arg, "@")) {
// This is a "compiler response file". We must parse the file and treat its
// contents as command line parameters.
const resp_file_path = arg[1..];
- resp_file_args_iter = initArgIteratorResponseFile(arena, resp_file_path) catch |err| {
+ args_iter.resp_file = initArgIteratorResponseFile(arena, resp_file_path) catch |err| {
fatal("unable to read response file '{s}': {s}", .{ resp_file_path, @errorName(err) });
};
} else if (mem.startsWith(u8, arg, "-")) {
@@ -799,14 +799,14 @@ fn buildOutputType(
if (arg_mode == .run) {
// The index refers to all_args so skip `zig` `run`
// and `--`
- runtime_args_start = args_index + 3;
+ runtime_args_start = args_iter.i + 3;
break :args_loop;
} else {
fatal("unexpected end-of-parameter mark: --", .{});
}
} else if (mem.eql(u8, arg, "--pkg-begin")) {
- const pkg_name = getNextArg(&process_args_iter, &resp_file_args_iter);
- const pkg_path = getNextArg(&process_args_iter, &resp_file_args_iter);
+ const pkg_name = args_iter.next();
+ const pkg_path = args_iter.next();
if (pkg_name == null or pkg_path == null) fatal("Expected 2 arguments after {s}", .{arg});
const new_cur_pkg = Package.create(
@@ -822,28 +822,28 @@ fn buildOutputType(
cur_pkg = cur_pkg.parent orelse
fatal("encountered --pkg-end with no matching --pkg-begin", .{});
} else if (mem.eql(u8, arg, "--main-pkg-path")) {
- const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {
+ const next_arg = args_iter.next() orelse {
fatal("expected parameter after {s}", .{arg});
};
main_pkg_path = next_arg;
} else if (mem.eql(u8, arg, "-cflags")) {
extra_cflags.shrinkRetainingCapacity(0);
while (true) {
- const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {
+ const next_arg = args_iter.next() orelse {
fatal("expected -- after -cflags", .{});
};
if (mem.eql(u8, next_arg, "--")) break;
try extra_cflags.append(next_arg);
}
} else if (mem.eql(u8, arg, "--color")) {
- const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {
+ const next_arg = args_iter.next() orelse {
fatal("expected [auto|on|off] after --color", .{});
};
color = std.meta.stringToEnum(Color, next_arg) orelse {
fatal("expected [auto|on|off] after --color, found '{s}'", .{next_arg});
};
} else if (mem.eql(u8, arg, "--subsystem")) {
- const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {
+ const next_arg = args_iter.next() orelse {
fatal("expected parameter after {s}", .{arg});
};
if (mem.eql(u8, next_arg, "console")) {
@@ -877,78 +877,78 @@ fn buildOutputType(
});
}
} else if (mem.eql(u8, arg, "-O")) {
- const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {
+ const next_arg = args_iter.next() orelse {
fatal("expected parameter after {s}", .{arg});
};
optimize_mode_string = next_arg;
} else if (mem.eql(u8, arg, "--entry")) {
- const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {
+ const next_arg = args_iter.next() orelse {
fatal("expected parameter after {s}", .{arg});
};
entry = next_arg;
} else if (mem.eql(u8, arg, "--stack")) {
- const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {
+ const next_arg = args_iter.next() orelse {
fatal("expected parameter after {s}", .{arg});
};
stack_size_override = std.fmt.parseUnsigned(u64, next_arg, 0) catch |err| {
fatal("unable to parse '{s}': {s}", .{ arg, @errorName(err) });
};
} else if (mem.eql(u8, arg, "--image-base")) {
- const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {
+ const next_arg = args_iter.next() orelse {
fatal("expected parameter after {s}", .{arg});
};
image_base_override = std.fmt.parseUnsigned(u64, next_arg, 0) catch |err| {
fatal("unable to parse '{s}': {s}", .{ arg, @errorName(err) });
};
} else if (mem.eql(u8, arg, "--name")) {
- const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {
+ const next_arg = args_iter.next() orelse {
fatal("expected parameter after {s}", .{arg});
};
provided_name = next_arg;
} else if (mem.eql(u8, arg, "-rpath")) {
- const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {
+ const next_arg = args_iter.next() orelse {
fatal("expected parameter after {s}", .{arg});
};
try rpath_list.append(next_arg);
} else if (mem.eql(u8, arg, "--library-directory") or mem.eql(u8, arg, "-L")) {
- const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {
+ const next_arg = args_iter.next() orelse {
fatal("expected parameter after {s}", .{arg});
};
try lib_dirs.append(next_arg);
} else if (mem.eql(u8, arg, "-F")) {
- const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {
+ const next_arg = args_iter.next() orelse {
fatal("expected parameter after {s}", .{arg});
};
try framework_dirs.append(next_arg);
} else if (mem.eql(u8, arg, "-framework")) {
- const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {
+ const next_arg = args_iter.next() orelse {
fatal("expected parameter after {s}", .{arg});
};
try frameworks.append(next_arg);
} else if (mem.eql(u8, arg, "-install_name")) {
- const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {
+ const next_arg = args_iter.next() orelse {
fatal("expected parameter after {s}", .{arg});
};
install_name = next_arg;
} else if (mem.eql(u8, arg, "-T") or mem.eql(u8, arg, "--script")) {
- const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {
+ const next_arg = args_iter.next() orelse {
fatal("expected parameter after {s}", .{arg});
};
linker_script = next_arg;
} else if (mem.eql(u8, arg, "--version-script")) {
- const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {
+ const next_arg = args_iter.next() orelse {
fatal("expected parameter after {s}", .{arg});
};
version_script = next_arg;
} else if (mem.eql(u8, arg, "--library") or mem.eql(u8, arg, "-l")) {
- const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {
+ const next_arg = args_iter.next() orelse {
fatal("expected parameter after {s}", .{arg});
};
// We don't know whether this library is part of libc or libc++ until
// we resolve the target, so we simply append to the list for now.
try system_libs.put(next_arg, .{ .needed = false });
} else if (mem.eql(u8, arg, "--needed-library") or mem.eql(u8, arg, "-needed-l")) {
- const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {
+ const next_arg = args_iter.next() orelse {
fatal("expected parameter after {s}", .{arg});
};
try system_libs.put(next_arg, .{ .needed = true });
@@ -960,13 +960,13 @@ fn buildOutputType(
mem.eql(u8, arg, "-iframework") or
mem.eql(u8, arg, "-iframeworkwithsysroot"))
{
- const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {
+ const next_arg = args_iter.next() orelse {
fatal("expected parameter after {s}", .{arg});
};
try clang_argv.append(arg);
try clang_argv.append(next_arg);
} else if (mem.eql(u8, arg, "--version")) {
- const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {
+ const next_arg = args_iter.next() orelse {
fatal("expected parameter after {s}", .{arg});
};
version = std.builtin.Version.parse(next_arg) catch |err| {
@@ -974,17 +974,17 @@ fn buildOutputType(
};
have_version = true;
} else if (mem.eql(u8, arg, "-target")) {
- const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {
+ const next_arg = args_iter.next() orelse {
fatal("expected parameter after {s}", .{arg});
};
target_arch_os_abi = next_arg;
} else if (mem.eql(u8, arg, "-mcpu")) {
- const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {
+ const next_arg = args_iter.next() orelse {
fatal("expected parameter after {s}", .{arg});
};
target_mcpu = next_arg;
} else if (mem.eql(u8, arg, "-mcmodel")) {
- const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {
+ const next_arg = args_iter.next() orelse {
fatal("expected parameter after {s}", .{arg});
};
machine_code_model = parseCodeModel(next_arg);
@@ -997,54 +997,54 @@ fn buildOutputType(
} else if (mem.startsWith(u8, arg, "-O")) {
optimize_mode_string = arg["-O".len..];
} else if (mem.eql(u8, arg, "--dynamic-linker")) {
- const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {
+ const next_arg = args_iter.next() orelse {
fatal("expected parameter after {s}", .{arg});
};
target_dynamic_linker = next_arg;
} else if (mem.eql(u8, arg, "--sysroot")) {
- const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {
+ const next_arg = args_iter.next() orelse {
fatal("expected parameter after {s}", .{arg});
};
sysroot = next_arg;
try clang_argv.append("-isysroot");
try clang_argv.append(next_arg);
} else if (mem.eql(u8, arg, "--libc")) {
- const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {
+ const next_arg = args_iter.next() orelse {
fatal("expected parameter after {s}", .{arg});
};
libc_paths_file = next_arg;
} else if (mem.eql(u8, arg, "--test-filter")) {
- const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {
+ const next_arg = args_iter.next() orelse {
fatal("expected parameter after {s}", .{arg});
};
test_filter = next_arg;
} else if (mem.eql(u8, arg, "--test-name-prefix")) {
- const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {
+ const next_arg = args_iter.next() orelse {
fatal("expected parameter after {s}", .{arg});
};
test_name_prefix = next_arg;
} else if (mem.eql(u8, arg, "--test-cmd")) {
- const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {
+ const next_arg = args_iter.next() orelse {
fatal("expected parameter after {s}", .{arg});
};
try test_exec_args.append(next_arg);
} else if (mem.eql(u8, arg, "--cache-dir")) {
- const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {
+ const next_arg = args_iter.next() orelse {
fatal("expected parameter after {s}", .{arg});
};
override_local_cache_dir = next_arg;
} else if (mem.eql(u8, arg, "--global-cache-dir")) {
- const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {
+ const next_arg = args_iter.next() orelse {
fatal("expected parameter after {s}", .{arg});
};
override_global_cache_dir = next_arg;
} else if (mem.eql(u8, arg, "--zig-lib-dir")) {
- const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {
+ const next_arg = args_iter.next() orelse {
fatal("expected parameter after {s}", .{arg});
};
override_lib_dir = next_arg;
} else if (mem.eql(u8, arg, "--debug-log")) {
- const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {
+ const next_arg = args_iter.next() orelse {
fatal("expected parameter after {s}", .{arg});
};
if (!build_options.enable_logging) {
@@ -1223,7 +1223,7 @@ fn buildOutputType(
} else if (mem.eql(u8, arg, "-fno-allow-shlib-undefined")) {
linker_allow_shlib_undefined = false;
} else if (mem.eql(u8, arg, "-z")) {
- const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {
+ const next_arg = args_iter.next() orelse {
fatal("expected parameter after {s}", .{arg});
};
const z_arg = next_arg;