aboutsummaryrefslogtreecommitdiff
path: root/src/main.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2022-02-24 12:11:11 -0700
committerAndrew Kelley <andrew@ziglang.org>2022-02-24 12:11:11 -0700
commit5ab5e2e6731a9f1198df6c53134545ccc6a6bbd3 (patch)
tree7b1e8bdc0fb357036d6827639d17f1a043d50e6d /src/main.zig
parent6249a24e81b9b3df3d5ca99b57f22470b9ac486c (diff)
downloadzig-5ab5e2e6731a9f1198df6c53134545ccc6a6bbd3.tar.gz
zig-5ab5e2e6731a9f1198df6c53134545ccc6a6bbd3.zip
Revert "Merge pull request #10950 from hexops/sg/responsefiles"
This reverts commit 136a43934bc08dc3aee85f1182904b97456601d3, reversing changes made to 9dd839b7ed15d1191f3303d069cffe0473e03e83. This broke the behavior of `zig run`.
Diffstat (limited to 'src/main.zig')
-rw-r--r--src/main.zig310
1 files changed, 144 insertions, 166 deletions
diff --git a/src/main.zig b/src/main.zig
index aa5d361ff1..ff78d16803 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -767,33 +767,11 @@ fn buildOutputType(
}
soname = .yes_default_value;
-
- 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..];
- 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, "-")) {
+ const args = all_args[2..];
+ var i: usize = 0;
+ args_loop: while (i < args.len) : (i += 1) {
+ const arg = args[i];
+ if (mem.startsWith(u8, arg, "-")) {
if (mem.eql(u8, arg, "-h") or mem.eql(u8, arg, "--help")) {
try io.getStdOut().writeAll(usage_build_generic);
return cleanExit();
@@ -801,71 +779,73 @@ fn buildOutputType(
if (arg_mode == .run) {
// The index refers to all_args so skip `zig` `run`
// and `--`
- runtime_args_start = args_iter.i + 3;
+ runtime_args_start = i + 3;
break :args_loop;
} else {
fatal("unexpected end-of-parameter mark: --", .{});
}
} else if (mem.eql(u8, arg, "--pkg-begin")) {
- 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});
+ if (i + 2 >= args.len) fatal("Expected 2 arguments after {s}", .{arg});
+ i += 1;
+ const pkg_name = args[i];
+ i += 1;
+ const pkg_path = args[i];
const new_cur_pkg = Package.create(
gpa,
- fs.path.dirname(pkg_path.?),
- fs.path.basename(pkg_path.?),
+ fs.path.dirname(pkg_path),
+ fs.path.basename(pkg_path),
) catch |err| {
- fatal("Failed to add package at path {s}: {s}", .{ pkg_path.?, @errorName(err) });
+ fatal("Failed to add package at path {s}: {s}", .{ pkg_path, @errorName(err) });
};
- try cur_pkg.addAndAdopt(gpa, pkg_name.?, new_cur_pkg);
+ try cur_pkg.addAndAdopt(gpa, pkg_name, new_cur_pkg);
cur_pkg = new_cur_pkg;
} else if (mem.eql(u8, arg, "--pkg-end")) {
cur_pkg = cur_pkg.parent orelse
fatal("encountered --pkg-end with no matching --pkg-begin", .{});
} else if (mem.eql(u8, arg, "--main-pkg-path")) {
- main_pkg_path = args_iter.next() orelse {
- fatal("expected parameter after {s}", .{arg});
- };
+ if (i + 1 >= args.len) fatal("expected parameter after {s}", .{arg});
+ i += 1;
+ main_pkg_path = args[i];
} else if (mem.eql(u8, arg, "-cflags")) {
extra_cflags.shrinkRetainingCapacity(0);
while (true) {
- const next_arg = args_iter.next() orelse {
- fatal("expected -- after -cflags", .{});
- };
- if (mem.eql(u8, next_arg, "--")) break;
- try extra_cflags.append(next_arg);
+ i += 1;
+ if (i >= args.len) fatal("expected -- after -cflags", .{});
+ if (mem.eql(u8, args[i], "--")) break;
+ try extra_cflags.append(args[i]);
}
} else if (mem.eql(u8, arg, "--color")) {
- const next_arg = args_iter.next() orelse {
+ if (i + 1 >= args.len) {
fatal("expected [auto|on|off] after --color", .{});
- };
+ }
+ i += 1;
+ const next_arg = args[i];
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 = args_iter.next() orelse {
- fatal("expected parameter after {s}", .{arg});
- };
- if (mem.eql(u8, next_arg, "console")) {
+ if (i + 1 >= args.len) fatal("expected parameter after {s}", .{arg});
+ i += 1;
+ if (mem.eql(u8, args[i], "console")) {
subsystem = .Console;
- } else if (mem.eql(u8, next_arg, "windows")) {
+ } else if (mem.eql(u8, args[i], "windows")) {
subsystem = .Windows;
- } else if (mem.eql(u8, next_arg, "posix")) {
+ } else if (mem.eql(u8, args[i], "posix")) {
subsystem = .Posix;
- } else if (mem.eql(u8, next_arg, "native")) {
+ } else if (mem.eql(u8, args[i], "native")) {
subsystem = .Native;
- } else if (mem.eql(u8, next_arg, "efi_application")) {
+ } else if (mem.eql(u8, args[i], "efi_application")) {
subsystem = .EfiApplication;
- } else if (mem.eql(u8, next_arg, "efi_boot_service_driver")) {
+ } else if (mem.eql(u8, args[i], "efi_boot_service_driver")) {
subsystem = .EfiBootServiceDriver;
- } else if (mem.eql(u8, next_arg, "efi_rom")) {
+ } else if (mem.eql(u8, args[i], "efi_rom")) {
subsystem = .EfiRom;
- } else if (mem.eql(u8, next_arg, "efi_runtime_driver")) {
+ } else if (mem.eql(u8, args[i], "efi_runtime_driver")) {
subsystem = .EfiRuntimeDriver;
} else {
fatal("invalid: --subsystem: '{s}'. Options are:\n{s}", .{
- next_arg,
+ args[i],
\\ console
\\ windows
\\ posix
@@ -878,71 +858,67 @@ fn buildOutputType(
});
}
} else if (mem.eql(u8, arg, "-O")) {
- optimize_mode_string = args_iter.next() orelse {
- fatal("expected parameter after {s}", .{arg});
- };
+ if (i + 1 >= args.len) fatal("expected parameter after {s}", .{arg});
+ i += 1;
+ optimize_mode_string = args[i];
} else if (mem.eql(u8, arg, "--entry")) {
- entry = args_iter.next() orelse {
- fatal("expected parameter after {s}", .{arg});
- };
+ if (i + 1 >= args.len) fatal("expected parameter after {s}", .{arg});
+ i += 1;
+ entry = args[i];
} else if (mem.eql(u8, arg, "--stack")) {
- 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| {
+ if (i + 1 >= args.len) fatal("expected parameter after {s}", .{arg});
+ i += 1;
+ stack_size_override = std.fmt.parseUnsigned(u64, args[i], 0) catch |err| {
fatal("unable to parse '{s}': {s}", .{ arg, @errorName(err) });
};
} else if (mem.eql(u8, arg, "--image-base")) {
- 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| {
+ if (i + 1 >= args.len) fatal("expected parameter after {s}", .{arg});
+ i += 1;
+ image_base_override = std.fmt.parseUnsigned(u64, args[i], 0) catch |err| {
fatal("unable to parse '{s}': {s}", .{ arg, @errorName(err) });
};
} else if (mem.eql(u8, arg, "--name")) {
- provided_name = args_iter.next() orelse {
- fatal("expected parameter after {s}", .{arg});
- };
+ if (i + 1 >= args.len) fatal("expected parameter after {s}", .{arg});
+ i += 1;
+ provided_name = args[i];
} else if (mem.eql(u8, arg, "-rpath")) {
- try rpath_list.append(args_iter.next() orelse {
- fatal("expected parameter after {s}", .{arg});
- });
+ if (i + 1 >= args.len) fatal("expected parameter after {s}", .{arg});
+ i += 1;
+ try rpath_list.append(args[i]);
} else if (mem.eql(u8, arg, "--library-directory") or mem.eql(u8, arg, "-L")) {
- try lib_dirs.append(args_iter.next() orelse {
- fatal("expected parameter after {s}", .{arg});
- });
+ if (i + 1 >= args.len) fatal("expected parameter after {s}", .{arg});
+ i += 1;
+ try lib_dirs.append(args[i]);
} else if (mem.eql(u8, arg, "-F")) {
- try framework_dirs.append(args_iter.next() orelse {
- fatal("expected parameter after {s}", .{arg});
- });
+ if (i + 1 >= args.len) fatal("expected parameter after {s}", .{arg});
+ i += 1;
+ try framework_dirs.append(args[i]);
} else if (mem.eql(u8, arg, "-framework")) {
- try frameworks.append(args_iter.next() orelse {
- fatal("expected parameter after {s}", .{arg});
- });
+ if (i + 1 >= args.len) fatal("expected parameter after {s}", .{arg});
+ i += 1;
+ try frameworks.append(args[i]);
} else if (mem.eql(u8, arg, "-install_name")) {
- install_name = args_iter.next() orelse {
- fatal("expected parameter after {s}", .{arg});
- };
+ if (i + 1 >= args.len) fatal("expected parameter after {s}", .{arg});
+ i += 1;
+ install_name = args[i];
} else if (mem.eql(u8, arg, "-T") or mem.eql(u8, arg, "--script")) {
- linker_script = args_iter.next() orelse {
- fatal("expected parameter after {s}", .{arg});
- };
+ if (i + 1 >= args.len) fatal("expected parameter after {s}", .{arg});
+ i += 1;
+ linker_script = args[i];
} else if (mem.eql(u8, arg, "--version-script")) {
- version_script = args_iter.next() orelse {
- fatal("expected parameter after {s}", .{arg});
- };
+ if (i + 1 >= args.len) fatal("expected parameter after {s}", .{arg});
+ i += 1;
+ version_script = args[i];
} else if (mem.eql(u8, arg, "--library") or mem.eql(u8, arg, "-l")) {
- const next_arg = args_iter.next() orelse {
- fatal("expected parameter after {s}", .{arg});
- };
+ if (i + 1 >= args.len) 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 });
+ i += 1;
+ try system_libs.put(args[i], .{ .needed = false });
} else if (mem.eql(u8, arg, "--needed-library") or mem.eql(u8, arg, "-needed-l")) {
- const next_arg = args_iter.next() orelse {
- fatal("expected parameter after {s}", .{arg});
- };
- try system_libs.put(next_arg, .{ .needed = true });
+ if (i + 1 >= args.len) fatal("expected parameter after {s}", .{arg});
+ i += 1;
+ try system_libs.put(args[i], .{ .needed = true });
} else if (mem.eql(u8, arg, "-D") or
mem.eql(u8, arg, "-isystem") or
mem.eql(u8, arg, "-I") or
@@ -951,30 +927,31 @@ fn buildOutputType(
mem.eql(u8, arg, "-iframework") or
mem.eql(u8, arg, "-iframeworkwithsysroot"))
{
+ if (i + 1 >= args.len) fatal("expected parameter after {s}", .{arg});
+ i += 1;
try clang_argv.append(arg);
- try clang_argv.append(args_iter.next() orelse {
- fatal("expected parameter after {s}", .{arg});
- });
+ try clang_argv.append(args[i]);
} else if (mem.eql(u8, arg, "--version")) {
- const next_arg = args_iter.next() orelse {
- fatal("expected parameter after {s}", .{arg});
- };
- version = std.builtin.Version.parse(next_arg) catch |err| {
- fatal("unable to parse --version '{s}': {s}", .{ next_arg, @errorName(err) });
+ if (i + 1 >= args.len) {
+ fatal("expected parameter after --version", .{});
+ }
+ i += 1;
+ version = std.builtin.Version.parse(args[i]) catch |err| {
+ fatal("unable to parse --version '{s}': {s}", .{ args[i], @errorName(err) });
};
have_version = true;
} else if (mem.eql(u8, arg, "-target")) {
- target_arch_os_abi = args_iter.next() orelse {
- fatal("expected parameter after {s}", .{arg});
- };
+ if (i + 1 >= args.len) fatal("expected parameter after {s}", .{arg});
+ i += 1;
+ target_arch_os_abi = args[i];
} else if (mem.eql(u8, arg, "-mcpu")) {
- target_mcpu = args_iter.next() orelse {
- fatal("expected parameter after {s}", .{arg});
- };
+ if (i + 1 >= args.len) fatal("expected parameter after {s}", .{arg});
+ i += 1;
+ target_mcpu = args[i];
} else if (mem.eql(u8, arg, "-mcmodel")) {
- machine_code_model = parseCodeModel(args_iter.next() orelse {
- fatal("expected parameter after {s}", .{arg});
- });
+ if (i + 1 >= args.len) fatal("expected parameter after {s}", .{arg});
+ i += 1;
+ machine_code_model = parseCodeModel(args[i]);
} else if (mem.startsWith(u8, arg, "-ofmt=")) {
target_ofmt = arg["-ofmt=".len..];
} else if (mem.startsWith(u8, arg, "-mcpu=")) {
@@ -984,51 +961,50 @@ fn buildOutputType(
} else if (mem.startsWith(u8, arg, "-O")) {
optimize_mode_string = arg["-O".len..];
} else if (mem.eql(u8, arg, "--dynamic-linker")) {
- target_dynamic_linker = args_iter.next() orelse {
- fatal("expected parameter after {s}", .{arg});
- };
+ if (i + 1 >= args.len) fatal("expected parameter after {s}", .{arg});
+ i += 1;
+ target_dynamic_linker = args[i];
} else if (mem.eql(u8, arg, "--sysroot")) {
- sysroot = args_iter.next() orelse {
- fatal("expected parameter after {s}", .{arg});
- };
+ if (i + 1 >= args.len) fatal("expected parameter after {s}", .{arg});
+ i += 1;
+ sysroot = args[i];
try clang_argv.append("-isysroot");
- try clang_argv.append(sysroot.?);
+ try clang_argv.append(args[i]);
} else if (mem.eql(u8, arg, "--libc")) {
- libc_paths_file = args_iter.next() orelse {
- fatal("expected parameter after {s}", .{arg});
- };
+ if (i + 1 >= args.len) fatal("expected parameter after {s}", .{arg});
+ i += 1;
+ libc_paths_file = args[i];
} else if (mem.eql(u8, arg, "--test-filter")) {
- test_filter = args_iter.next() orelse {
- fatal("expected parameter after {s}", .{arg});
- };
+ if (i + 1 >= args.len) fatal("expected parameter after {s}", .{arg});
+ i += 1;
+ test_filter = args[i];
} else if (mem.eql(u8, arg, "--test-name-prefix")) {
- test_name_prefix = args_iter.next() orelse {
- fatal("expected parameter after {s}", .{arg});
- };
+ if (i + 1 >= args.len) fatal("expected parameter after {s}", .{arg});
+ i += 1;
+ test_name_prefix = args[i];
} else if (mem.eql(u8, arg, "--test-cmd")) {
- try test_exec_args.append(args_iter.next() orelse {
- fatal("expected parameter after {s}", .{arg});
- });
+ if (i + 1 >= args.len) fatal("expected parameter after {s}", .{arg});
+ i += 1;
+ try test_exec_args.append(args[i]);
} else if (mem.eql(u8, arg, "--cache-dir")) {
- override_local_cache_dir = args_iter.next() orelse {
- fatal("expected parameter after {s}", .{arg});
- };
+ if (i + 1 >= args.len) fatal("expected parameter after {s}", .{arg});
+ i += 1;
+ override_local_cache_dir = args[i];
} else if (mem.eql(u8, arg, "--global-cache-dir")) {
- override_global_cache_dir = args_iter.next() orelse {
- fatal("expected parameter after {s}", .{arg});
- };
+ if (i + 1 >= args.len) fatal("expected parameter after {s}", .{arg});
+ i += 1;
+ override_global_cache_dir = args[i];
} else if (mem.eql(u8, arg, "--zig-lib-dir")) {
- override_lib_dir = args_iter.next() orelse {
- fatal("expected parameter after {s}", .{arg});
- };
+ if (i + 1 >= args.len) fatal("expected parameter after {s}", .{arg});
+ i += 1;
+ override_lib_dir = args[i];
} else if (mem.eql(u8, arg, "--debug-log")) {
- const next_arg = args_iter.next() orelse {
- fatal("expected parameter after {s}", .{arg});
- };
+ if (i + 1 >= args.len) fatal("expected parameter after {s}", .{arg});
+ i += 1;
if (!build_options.enable_logging) {
std.log.warn("Zig was compiled without logging enabled (-Dlog). --debug-log has no effect.", .{});
} else {
- try log_scopes.append(gpa, next_arg);
+ try log_scopes.append(gpa, args[i]);
}
} else if (mem.eql(u8, arg, "--debug-link-snapshot")) {
if (!build_options.enable_link_snapshots) {
@@ -1201,9 +1177,11 @@ 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 z_arg = args_iter.next() orelse {
- fatal("expected parameter after {s}", .{arg});
- };
+ i += 1;
+ if (i >= args.len) {
+ fatal("expected linker extension flag after '{s}'", .{arg});
+ }
+ const z_arg = args[i];
if (mem.eql(u8, z_arg, "nodelete")) {
linker_z_nodelete = true;
} else if (mem.eql(u8, z_arg, "notext")) {
@@ -4311,17 +4289,6 @@ pub fn lldMain(
return @bitCast(u8, @truncate(i8, exit_code));
}
-const ArgIteratorResponseFile = process.ArgIteratorGeneral(.{ .comments = true, .single_quotes = true });
-
-/// Initialize the arguments from a Response File. "*.rsp"
-fn initArgIteratorResponseFile(allocator: Allocator, resp_file_path: []const u8) !ArgIteratorResponseFile {
- const max_bytes = 10 * 1024 * 1024; // 10 MiB of command line arguments is a reasonable limit
- var cmd_line = try fs.cwd().readFileAlloc(allocator, resp_file_path, max_bytes);
- errdefer allocator.free(cmd_line);
-
- return ArgIteratorResponseFile.initTakeOwnership(allocator, cmd_line);
-}
-
const clang_args = @import("clang_options.zig").list;
pub const ClangArgIterator = struct {
@@ -4411,6 +4378,17 @@ pub const ClangArgIterator = struct {
};
}
+ const ArgIteratorResponseFile = process.ArgIteratorGeneral(.{ .comments = true, .single_quotes = true });
+
+ /// Initialize the arguments from a Response File. "*.rsp"
+ fn initArgIteratorResponseFile(allocator: Allocator, resp_file_path: []const u8) !ArgIteratorResponseFile {
+ const max_bytes = 10 * 1024 * 1024; // 10 MiB of command line arguments is a reasonable limit
+ var cmd_line = try fs.cwd().readFileAlloc(allocator, resp_file_path, max_bytes);
+ errdefer allocator.free(cmd_line);
+
+ return ArgIteratorResponseFile.initTakeOwnership(allocator, cmd_line);
+ }
+
fn next(self: *ClangArgIterator) !void {
assert(self.has_next);
assert(self.next_index < self.argv.len);