Skip to content

Commit

Permalink
Full response file (*.rsp) support
Browse files Browse the repository at this point in the history
I hit the "quotes in an RSP file" issue when trying to compile gRPC using
"zig cc". As a fun exercise, I decided to see if I could fix it myself.
I'm fully open to this code being flat-out rejected. Or I can take feedback
to fix it up.

This modifies (and renames) _ArgIteratorWindows_ in process.zig such that
it works with arbitrary strings (or the contents of an RSP file).

In main.zig, this new _ArgIteratorGeneral_ is used to address the "TODO"
listed in _ClangArgIterator_.

This change closes #4833.

**Pros:**

- It has the nice attribute of handling "RSP file" arguments in the same way it
  handles "cmd_line" arguments.
- High Performance, minimal allocations
- Fixed bug in previous _ArgIteratorWindows_, where final trailing backslashes
  in a command line were entirely dropped
- Added a test case for the above bug
- Harmonized the _ArgIteratorXxxx._initWithAllocator()_ and _next()_ interface
  across Windows/Posix/Wasi (Moved Windows errors to _initWithAllocator()_
  rather than _next()_)
- Likely perf benefit on Windows by doing _utf16leToUtf8AllocZ()_ only once
  for the entire cmd_line

**Cons:**

- Breaking Change in std library on Windows: Call
  _ArgIterator.initWithAllocator()_ instead of _ArgIterator.init()_
- PhaseMage is new with contributions to Zig, might need a lot of hand-holding
- PhaseMage is a Windows person, non-Windows stuff will need to be double-checked

**Testing Done:**

- Wrote a few new test cases in process.zig
- zig.exe build test -Dskip-release (no new failures seen)
- zig cc now builds gRPC without error
  • Loading branch information
PhaseMage authored Jan 30, 2022
1 parent 336aa3c commit 8a97807
Show file tree
Hide file tree
Showing 6 changed files with 337 additions and 208 deletions.
10 changes: 5 additions & 5 deletions doc/docgen.zig
Original file line number Diff line number Diff line change
Expand Up @@ -23,21 +23,21 @@ pub fn main() !void {

const allocator = arena.allocator();

var args_it = process.args();
var args_it = try process.argsWithAllocator(allocator);

if (!args_it.skip()) @panic("expected self arg");

const zig_exe = (try args_it.next(allocator)) orelse @panic("expected zig exe arg");
const zig_exe = args_it.next() orelse @panic("expected zig exe arg");
defer allocator.free(zig_exe);

const in_file_name = (try args_it.next(allocator)) orelse @panic("expected input arg");
const in_file_name = args_it.next() orelse @panic("expected input arg");
defer allocator.free(in_file_name);

const out_file_name = (try args_it.next(allocator)) orelse @panic("expected output arg");
const out_file_name = args_it.next() orelse @panic("expected output arg");
defer allocator.free(out_file_name);

var do_code_tests = true;
if (try args_it.next(allocator)) |arg| {
if (args_it.next()) |arg| {
if (mem.eql(u8, arg, "--skip-code-tests")) {
do_code_tests = false;
} else {
Expand Down
Loading

0 comments on commit 8a97807

Please sign in to comment.