authorgravatar for thejoshwolfe@gmail.comJosh Wolfe <thejoshwolfe@gmail.com> 2025-08-30 22:15:37-04:00
committergravatar for thejoshwolfe@gmail.comJosh Wolfe <thejoshwolfe@gmail.com> 2025-08-30 23:18:20-04:00
log69c1dbc9ff9f5031f7262d6079b83285f5fc0c86
treeae9f64d3910e9bb79ed4f5bf0334030ac09a4d67
parent473c1d6fa5bea6dcb03151a304af645910826be8

update tools/ to use std.cli.parse


21 files changed, 214 insertions(+), 398 deletions(-)

tools/docgen.zig+15-42
...@@ -16,16 +16,17 @@ const max_doc_file_size = 10 * 1024 * 1024;...@@ -16,16 +16,17 @@ const max_doc_file_size = 10 * 1024 * 1024;
1616
17const obj_ext = builtin.object_format.fileExt(builtin.cpu.arch);17const obj_ext = builtin.object_format.fileExt(builtin.cpu.arch);
1818
19const usage =19const Args = struct {
20 \\Usage: docgen [options] input output20 pub const description = "Generates an HTML document from a docgen template.";
21 \\21 named: struct {
22 \\ Generates an HTML document from a docgen template.22 @"code-dir": [:0]const u8,
23 \\23 pub const @"code-dir_help" = "Path to directory containing code example outputs";
24 \\Options:24 },
25 \\ --code-dir dir Path to directory containing code example outputs25 positional: struct {
26 \\ -h, --help Print this help and exit26 input: [:0]const u8,
27 \\27 output: [:0]const u8,
28;28 },
29};
2930
30pub fn main() !void {31pub fn main() !void {
31 var arena_instance = std.heap.ArenaAllocator.init(std.heap.page_allocator);32 var arena_instance = std.heap.ArenaAllocator.init(std.heap.page_allocator);
...@@ -33,38 +34,10 @@ pub fn main() !void {...@@ -33,38 +34,10 @@ pub fn main() !void {
3334
34 const arena = arena_instance.allocator();35 const arena = arena_instance.allocator();
3536
36 var args_it = try process.argsWithAllocator(arena);37 const args = try std.cli.parse(Args, arena, .{});
37 if (!args_it.skip()) @panic("expected self arg");38 const input_path = args.positional.input;
3839 const output_path = args.positional.output;
39 var opt_code_dir: ?[]const u8 = null;40 const code_dir_path = args.named.@"code-dir";
40 var opt_input: ?[]const u8 = null;
41 var opt_output: ?[]const u8 = null;
42
43 while (args_it.next()) |arg| {
44 if (mem.startsWith(u8, arg, "-")) {
45 if (mem.eql(u8, arg, "-h") or mem.eql(u8, arg, "--help")) {
46 try fs.File.stdout().writeAll(usage);
47 process.exit(0);
48 } else if (mem.eql(u8, arg, "--code-dir")) {
49 if (args_it.next()) |param| {
50 opt_code_dir = param;
51 } else {
52 fatal("expected parameter after --code-dir", .{});
53 }
54 } else {
55 fatal("unrecognized option: '{s}'", .{arg});
56 }
57 } else if (opt_input == null) {
58 opt_input = arg;
59 } else if (opt_output == null) {
60 opt_output = arg;
61 } else {
62 fatal("unexpected positional argument: '{s}'", .{arg});
63 }
64 }
65 const input_path = opt_input orelse fatal("missing input file", .{});
66 const output_path = opt_output orelse fatal("missing output file", .{});
67 const code_dir_path = opt_code_dir orelse fatal("missing --code-dir argument", .{});
6841
69 var in_file = try fs.cwd().openFile(input_path, .{});42 var in_file = try fs.cwd().openFile(input_path, .{});
70 defer in_file.close();43 defer in_file.close();
tools/dump-cov.zig+9-3
...@@ -16,9 +16,15 @@ pub fn main() !void {...@@ -16,9 +16,15 @@ pub fn main() !void {
16 defer arena_instance.deinit();16 defer arena_instance.deinit();
17 const arena = arena_instance.allocator();17 const arena = arena_instance.allocator();
1818
19 const args = try std.process.argsAlloc(arena);19 const args = try std.cli.parse(struct {
20 const exe_file_name = args[1];20 named: struct {},
21 const cov_file_name = args[2];21 positional: struct {
22 exe_file: [:0]const u8,
23 cov_file: [:0]const u8,
24 },
25 }, arena, .{});
26 const exe_file_name = args.positional.exe_file;
27 const cov_file_name = args.positional.cov_file;
2228
23 const exe_path: Path = .{29 const exe_path: Path = .{
24 .root_dir = std.Build.Cache.Directory.cwd(),30 .root_dir = std.Build.Cache.Directory.cwd(),
tools/fetch_them_macos_headers.zig+14-44
...@@ -55,36 +55,24 @@ const Target = struct {...@@ -55,36 +55,24 @@ const Target = struct {
5555
56const headers_source_prefix: []const u8 = "headers";56const headers_source_prefix: []const u8 = "headers";
5757
58const usage =58const Args = struct {
59 \\fetch_them_macos_headers [options] [cc args]59 named: struct {
60 \\60 sysroot: []const u8 = "",
61 \\Options:61 pub const sysroot_help = "Path to macOS SDK";
62 \\ --sysroot Path to macOS SDK62 },
63 \\63 positional: struct {
64 \\General Options:64 cc_args: []const [:0]const u8 = &.{},
65 \\-h, --help Print this help and exit65 },
66;66};
6767
68pub fn main() anyerror!void {68pub fn main() anyerror!void {
69 var arena = std.heap.ArenaAllocator.init(gpa);69 var arena = std.heap.ArenaAllocator.init(gpa);
70 defer arena.deinit();70 defer arena.deinit();
71 const allocator = arena.allocator();71 const allocator = arena.allocator();
7272
73 const args = try std.process.argsAlloc(allocator);73 const args = try std.cli.parse(Args, allocator, .{});
74
75 var argv = std.array_list.Managed([]const u8).init(allocator);
76 var sysroot: ?[]const u8 = null;
77
78 var args_iter = ArgsIterator{ .args = args[1..] };
79 while (args_iter.next()) |arg| {
80 if (mem.eql(u8, arg, "--help") or mem.eql(u8, arg, "-h")) {
81 return info(usage, .{});
82 } else if (mem.eql(u8, arg, "--sysroot")) {
83 sysroot = args_iter.nextOrFatal();
84 } else try argv.append(arg);
85 }
8674
87 const sysroot_path = sysroot orelse blk: {75 const sysroot_path = if (args.named.sysroot.len > 0) args.named.sysroot else blk: {
88 const target = try std.zig.system.resolveTargetQuery(.{});76 const target = try std.zig.system.resolveTargetQuery(.{});
89 break :blk std.zig.system.darwin.getSdk(allocator, &target) orelse77 break :blk std.zig.system.darwin.getSdk(allocator, &target) orelse
90 fatal("no SDK found; you can provide one explicitly with '--sysroot' flag", .{});78 fatal("no SDK found; you can provide one explicitly with '--sysroot' flag", .{});
...@@ -121,13 +109,13 @@ pub fn main() anyerror!void {...@@ -121,13 +109,13 @@ pub fn main() anyerror!void {
121 .arch = arch,109 .arch = arch,
122 .os_ver = os_ver,110 .os_ver = os_ver,
123 };111 };
124 try fetchTarget(allocator, argv.items, sysroot_path, target, version, tmp);112 try fetchTarget(allocator, args.positional.cc_args, sysroot_path, target, version, tmp);
125 }113 }
126}114}
127115
128fn fetchTarget(116fn fetchTarget(
129 arena: Allocator,117 arena: Allocator,
130 args: []const []const u8,118 cc_args: []const []const u8,
131 sysroot: []const u8,119 sysroot: []const u8,
132 target: Target,120 target: Target,
133 ver: Version,121 ver: Version,
...@@ -165,7 +153,7 @@ fn fetchTarget(...@@ -165,7 +153,7 @@ fn fetchTarget(
165 "-MF",153 "-MF",
166 headers_list_path,154 headers_list_path,
167 });155 });
168 try cc_argv.appendSlice(args);156 try cc_argv.appendSlice(cc_args);
169157
170 const res = try std.process.Child.run(.{158 const res = try std.process.Child.run(.{
171 .allocator = arena,159 .allocator = arena,
...@@ -229,24 +217,6 @@ fn fetchTarget(...@@ -229,24 +217,6 @@ fn fetchTarget(
229 }217 }
230}218}
231219
232const ArgsIterator = struct {
233 args: []const []const u8,
234 i: usize = 0,
235
236 fn next(it: *@This()) ?[]const u8 {
237 if (it.i >= it.args.len) {
238 return null;
239 }
240 defer it.i += 1;
241 return it.args[it.i];
242 }
243
244 fn nextOrFatal(it: *@This()) []const u8 {
245 const arg = it.next() orelse fatal("expected parameter after '{s}'", .{it.args[it.i - 1]});
246 return arg;
247 }
248};
249
250const Version = struct {220const Version = struct {
251 major: u16,221 major: u16,
252 minor: u8,222 minor: u8,
tools/gen_macos_headers_c.zig+6-20
...@@ -8,32 +8,18 @@ const Allocator = std.mem.Allocator;...@@ -8,32 +8,18 @@ const Allocator = std.mem.Allocator;
8var general_purpose_allocator = std.heap.GeneralPurposeAllocator(.{}){};8var general_purpose_allocator = std.heap.GeneralPurposeAllocator(.{}){};
9const gpa = general_purpose_allocator.allocator();9const gpa = general_purpose_allocator.allocator();
1010
11const usage =
12 \\gen_macos_headers_c [dir]
13 \\
14 \\General Options:
15 \\-h, --help Print this help and exit
16;
17
18pub fn main() anyerror!void {11pub fn main() anyerror!void {
19 var arena_allocator = std.heap.ArenaAllocator.init(gpa);12 var arena_allocator = std.heap.ArenaAllocator.init(gpa);
20 defer arena_allocator.deinit();13 defer arena_allocator.deinit();
21 const arena = arena_allocator.allocator();14 const arena = arena_allocator.allocator();
2215
23 const args = try std.process.argsAlloc(arena);16 const args = try std.cli.parse(struct {
24 if (args.len == 1) fatal("no command or option specified", .{});17 positional: struct {
2518 dir: []const u8,
26 var positionals = std.array_list.Managed([]const u8).init(arena);19 },
2720 }, arena, .{});
28 for (args[1..]) |arg| {
29 if (std.mem.eql(u8, arg, "--help") or std.mem.eql(u8, arg, "-h")) {
30 return info(usage, .{});
31 } else try positionals.append(arg);
32 }
33
34 if (positionals.items.len != 1) fatal("expected one positional argument: [dir]", .{});
3521
36 var dir = try std.fs.cwd().openDir(positionals.items[0], .{ .no_follow = true });22 var dir = try std.fs.cwd().openDir(args.positional.dir, .{ .no_follow = true });
37 defer dir.close();23 defer dir.close();
38 var paths = std.array_list.Managed([]const u8).init(arena);24 var paths = std.array_list.Managed([]const u8).init(arena);
39 try findHeaders(arena, dir, "", &paths);25 try findHeaders(arena, dir, "", &paths);
tools/gen_outline_atomics.zig+1-1
...@@ -15,7 +15,7 @@ pub fn main() !void {...@@ -15,7 +15,7 @@ pub fn main() !void {
15 defer arena_instance.deinit();15 defer arena_instance.deinit();
16 const arena = arena_instance.allocator();16 const arena = arena_instance.allocator();
1717
18 //const args = try std.process.argsAlloc(arena);18 _ = try std.cli.parse(struct {}, arena, .{});
1919
20 var stdout_buffer: [2000]u8 = undefined;20 var stdout_buffer: [2000]u8 = undefined;
21 var stdout_writer = std.fs.File.stdout().writerStreaming(&stdout_buffer);21 var stdout_writer = std.fs.File.stdout().writerStreaming(&stdout_buffer);
tools/gen_spirv_spec.zig+15-23
...@@ -58,12 +58,20 @@ const allocator = arena.allocator();...@@ -58,12 +58,20 @@ const allocator = arena.allocator();
58pub fn main() !void {58pub fn main() !void {
59 defer arena.deinit();59 defer arena.deinit();
6060
61 const args = try std.process.argsAlloc(allocator);61 const args = try std.cli.parse(struct {
62 if (args.len != 3) {62 pub const description =
63 usageAndExit(args[0], 1);63 \\Generates Zig bindings for SPIR-V specifications found in the SPIRV-Headers
64 }64 \\repository. The result, printed to stdout, should be used to update
6565 \\files in src/codegen/spirv. Don't forget to format the output.
66 const json_path = try std.fs.path.join(allocator, &.{ args[1], "include/spirv/unified1/" });66 ;
67 positional: struct {
68 pub const @"path/to/SPIRV-Headers_help" = "should point to a clone of https://github.com/KhronosGroup/SPIRV-Headers/";
69 @"path/to/SPIRV-Headers": [:0]const u8,
70 @"path/to/zig/src/codegen/spirv/extinst.zig.grammar.json": [:0]const u8,
71 },
72 }, allocator, .{});
73
74 const json_path = try std.fs.path.join(allocator, &.{ args.positional.@"path/to/SPIRV-Headers", "include/spirv/unified1/" });
67 const dir = try std.fs.cwd().openDir(json_path, .{ .iterate = true });75 const dir = try std.fs.cwd().openDir(json_path, .{ .iterate = true });
6876
69 const core_spec = try readRegistry(CoreRegistry, dir, "spirv.core.grammar.json");77 const core_spec = try readRegistry(CoreRegistry, dir, "spirv.core.grammar.json");
...@@ -80,7 +88,7 @@ pub fn main() !void {...@@ -80,7 +88,7 @@ pub fn main() !void {
80 try readExtRegistry(&exts, dir, entry.name);88 try readExtRegistry(&exts, dir, entry.name);
81 }89 }
8290
83 try readExtRegistry(&exts, std.fs.cwd(), args[2]);91 try readExtRegistry(&exts, std.fs.cwd(), args.positional.@"path/to/zig/src/codegen/spirv/extinst.zig.grammar.json");
8492
85 var allocating: std.Io.Writer.Allocating = .init(allocator);93 var allocating: std.Io.Writer.Allocating = .init(allocator);
86 defer allocating.deinit();94 defer allocating.deinit();
...@@ -929,19 +937,3 @@ fn parseHexInt(text: []const u8) !u31 {...@@ -929,19 +937,3 @@ fn parseHexInt(text: []const u8) !u31 {
929 return error.InvalidHexInt;937 return error.InvalidHexInt;
930 return try std.fmt.parseInt(u31, text[prefix.len..], 16);938 return try std.fmt.parseInt(u31, text[prefix.len..], 16);
931}939}
932
933fn usageAndExit(arg0: []const u8, code: u8) noreturn {
934 const stderr = std.debug.lockStderrWriter(&.{});
935 stderr.print(
936 \\Usage: {s} <SPIRV-Headers repository path> <path/to/zig/src/codegen/spirv/extinst.zig.grammar.json>
937 \\
938 \\Generates Zig bindings for SPIR-V specifications found in the SPIRV-Headers
939 \\repository. The result, printed to stdout, should be used to update
940 \\files in src/codegen/spirv. Don't forget to format the output.
941 \\
942 \\<SPIRV-Headers repository path> should point to a clone of
943 \\https://github.com/KhronosGroup/SPIRV-Headers/
944 \\
945 , .{arg0}) catch std.process.exit(1);
946 std.process.exit(code);
947}
tools/gen_stubs.zig+6-2
...@@ -284,8 +284,12 @@ pub fn main() !void {...@@ -284,8 +284,12 @@ pub fn main() !void {
284 defer arena_instance.deinit();284 defer arena_instance.deinit();
285 const arena = arena_instance.allocator();285 const arena = arena_instance.allocator();
286286
287 const args = try std.process.argsAlloc(arena);287 const args = try std.cli.parse(struct {
288 const build_all_path = args[1];288 positional: struct {
289 build_all_path: [:0]const u8,
290 },
291 }, arena, .{});
292 const build_all_path = args.positional.build_all_path;
289293
290 var build_all_dir = try std.fs.cwd().openDir(build_all_path, .{});294 var build_all_dir = try std.fs.cwd().openDir(build_all_path, .{});
291295
tools/generate_JSONTestSuite.zig+5-1
...@@ -1,4 +1,6 @@...@@ -1,4 +1,6 @@
1// zig run this file inside the test_parsing/ directory of this repo: https://github.com/nst/JSONTestSuite1const Args = struct {
2 pub const description = "zig run this file inside the test_parsing/ directory of this repo: https://github.com/nst/JSONTestSuite";
3};
24
3const std = @import("std");5const std = @import("std");
46
...@@ -6,6 +8,8 @@ pub fn main() !void {...@@ -6,6 +8,8 @@ pub fn main() !void {
6 var gpa: std.heap.GeneralPurposeAllocator(.{}) = .init;8 var gpa: std.heap.GeneralPurposeAllocator(.{}) = .init;
7 var allocator = gpa.allocator();9 var allocator = gpa.allocator();
810
11 _ = try std.cli.parse(Args, allocator, .{});
12
9 var stdout_buffer: [2000]u8 = undefined;13 var stdout_buffer: [2000]u8 = undefined;
10 var stdout_writer = std.fs.File.stdout().writerStreaming(&stdout_buffer);14 var stdout_writer = std.fs.File.stdout().writerStreaming(&stdout_buffer);
11 const output = &stdout_writer.interface;15 const output = &stdout_writer.interface;
tools/generate_c_size_and_align_checks.zig+11-10
...@@ -25,21 +25,22 @@ fn cName(ty: std.Target.CType) []const u8 {...@@ -25,21 +25,22 @@ fn cName(ty: std.Target.CType) []const u8 {
25 };25 };
26}26}
2727
28var general_purpose_allocator: std.heap.GeneralPurposeAllocator(.{}) = .init;
29
30pub fn main() !void {28pub fn main() !void {
31 const gpa = general_purpose_allocator.allocator();29 var general_purpose_allocator: std.heap.GeneralPurposeAllocator(.{}) = .init;
32 defer std.debug.assert(general_purpose_allocator.deinit() == .ok);30 defer std.debug.assert(general_purpose_allocator.deinit() == .ok);
31 const gpa = general_purpose_allocator.allocator();
3332
34 const args = try std.process.argsAlloc(gpa);33 var arena_instance = std.heap.ArenaAllocator.init(gpa);
35 defer std.process.argsFree(gpa, args);34 defer arena_instance.deinit();
35 const arena = arena_instance.allocator();
3636
37 if (args.len != 2) {37 const args = try std.cli.parse(struct {
38 std.debug.print("Usage: {s} [target_triple]\n", .{args[0]});38 positional: struct {
39 std.process.exit(1);39 target_triple: [:0]const u8,
40 }40 },
41 }, arena, .{});
4142
42 const query = try std.Target.Query.parse(.{ .arch_os_abi = args[1] });43 const query = try std.Target.Query.parse(.{ .arch_os_abi = args.positional.target_triple });
43 const target = try std.zig.system.resolveTargetQuery(query);44 const target = try std.zig.system.resolveTargetQuery(query);
4445
45 var buffer: [2000]u8 = undefined;46 var buffer: [2000]u8 = undefined;
tools/generate_linux_syscalls.zig+12-17
...@@ -11,6 +11,16 @@...@@ -11,6 +11,16 @@
11//!11//!
12//! Everything after `name` is ignored for the purposes of this tool.12//! Everything after `name` is ignored for the purposes of this tool.
1313
14const Args = struct {
15 pub const description =
16 \\Generates the list of Linux syscalls for each supported cpu arch, using the Linux development tree.
17 \\Prints to stdout Zig code which you can use to replace the file lib/std/os/linux/syscalls.zig.
18 ;
19 positional: struct {
20 @"/path/to/linux": [:0]const u8,
21 },
22};
23
14const std = @import("std");24const std = @import("std");
15const Io = std.Io;25const Io = std.Io;
16const mem = std.mem;26const mem = std.mem;
...@@ -175,12 +185,8 @@ pub fn main() !void {...@@ -175,12 +185,8 @@ pub fn main() !void {
175 defer arena.deinit();185 defer arena.deinit();
176 const gpa = arena.allocator();186 const gpa = arena.allocator();
177187
178 const args = try std.process.argsAlloc(gpa);188 const args = try std.cli.parse(Args, gpa, .{});
179 if (args.len < 2 or mem.eql(u8, args[1], "--help")) {189 const linux_path = args.positional.@"/path/to/linux";
180 usage(std.debug.lockStderrWriter(&.{}), args[0]) catch std.process.exit(2);
181 std.process.exit(1);
182 }
183 const linux_path = args[1];
184190
185 var stdout_buffer: [2048]u8 = undefined;191 var stdout_buffer: [2048]u8 = undefined;
186 var stdout_writer = std.fs.File.stdout().writerStreaming(&stdout_buffer);192 var stdout_writer = std.fs.File.stdout().writerStreaming(&stdout_buffer);
...@@ -247,14 +253,3 @@ pub fn main() !void {...@@ -247,14 +253,3 @@ pub fn main() !void {
247253
248 try Io.Writer.flush(stdout);254 try Io.Writer.flush(stdout);
249}255}
250
251fn usage(w: *std.Io.Writer, arg0: []const u8) std.Io.Writer.Error!void {
252 try w.print(
253 \\Usage: {s} /path/to/zig /path/to/linux
254 \\Alternative Usage: zig run /path/to/git/zig/tools/generate_linux_syscalls.zig -- /path/to/zig /path/to/linux
255 \\
256 \\Generates the list of Linux syscalls for each supported cpu arch, using the Linux development tree.
257 \\Prints to stdout Zig code which you can use to replace the file lib/std/os/linux/syscalls.zig.
258 \\
259 , .{arg0});
260}
tools/incr-check.zig+23-42
...@@ -2,8 +2,6 @@ const std = @import("std");...@@ -2,8 +2,6 @@ const std = @import("std");
2const Allocator = std.mem.Allocator;2const Allocator = std.mem.Allocator;
3const Cache = std.Build.Cache;3const Cache = std.Build.Cache;
44
5const usage = "usage: incr-check <zig binary path> <input file> [--zig-lib-dir lib] [--debug-zcu] [--debug-dwarf] [--debug-link] [--preserve-tmp] [--zig-cc-binary /path/to/zig]";
6
7pub fn main() !void {5pub fn main() !void {
8 const fatal = std.process.fatal;6 const fatal = std.process.fatal;
97
...@@ -11,46 +9,29 @@ pub fn main() !void {...@@ -11,46 +9,29 @@ pub fn main() !void {
11 defer arena_instance.deinit();9 defer arena_instance.deinit();
12 const arena = arena_instance.allocator();10 const arena = arena_instance.allocator();
1311
14 var opt_zig_exe: ?[]const u8 = null;12 const args = try std.cli.parse(struct {
15 var opt_input_file_name: ?[]const u8 = null;13 positional: struct {
16 var opt_lib_dir: ?[]const u8 = null;14 @"zig-binary-path": []const u8,
17 var opt_cc_zig: ?[]const u8 = null;15 @"input-file": []const u8,
18 var debug_zcu = false;16 },
19 var debug_dwarf = false;17 named: struct {
20 var debug_link = false;18 @"zig-lib-dir": []const u8 = "",
21 var preserve_tmp = false;19 @"debug-zcu": bool = false,
2220 @"debug-dwarf": bool = false,
23 var arg_it = try std.process.argsWithAllocator(arena);21 @"debug-link": bool = false,
24 _ = arg_it.skip();22 preserve_tmp: bool = false,
25 while (arg_it.next()) |arg| {23 @"zig-cc-binary": []const u8 = "",
26 if (arg.len > 0 and arg[0] == '-') {24 },
27 if (std.mem.eql(u8, arg, "--zig-lib-dir")) {25 }, arena, .{});
28 opt_lib_dir = arg_it.next() orelse fatal("expected arg after '--zig-lib-dir'\n{s}", .{usage});26
29 } else if (std.mem.eql(u8, arg, "--debug-zcu")) {27 const opt_lib_dir: ?[]const u8 = if (args.named.@"zig-lib-dir".len > 0) args.named.@"zig-lib-dir" else null;
30 debug_zcu = true;28 const opt_cc_zig: ?[]const u8 = if (args.named.@"zig-cc-binary".len > 0) args.named.@"zig-cc-binary" else null;
31 } else if (std.mem.eql(u8, arg, "--debug-dwarf")) {29 const debug_zcu = args.named.@"debug-zcu";
32 debug_dwarf = true;30 const debug_dwarf = args.named.@"debug-dwarf";
33 } else if (std.mem.eql(u8, arg, "--debug-link")) {31 const debug_link = args.named.@"debug-link";
34 debug_link = true;32 const preserve_tmp = args.named.preserve_tmp;
35 } else if (std.mem.eql(u8, arg, "--preserve-tmp")) {33 const zig_exe = args.positional.@"zig-binary-path";
36 preserve_tmp = true;34 const input_file_name = args.positional.@"input-file";
37 } else if (std.mem.eql(u8, arg, "--zig-cc-binary")) {
38 opt_cc_zig = arg_it.next() orelse fatal("expect arg after '--zig-cc-binary'\n{s}", .{usage});
39 } else {
40 fatal("unknown option '{s}'\n{s}", .{ arg, usage });
41 }
42 continue;
43 }
44 if (opt_zig_exe == null) {
45 opt_zig_exe = arg;
46 } else if (opt_input_file_name == null) {
47 opt_input_file_name = arg;
48 } else {
49 fatal("unknown argument '{s}'\n{s}", .{ arg, usage });
50 }
51 }
52 const zig_exe = opt_zig_exe orelse fatal("missing path to zig\n{s}", .{usage});
53 const input_file_name = opt_input_file_name orelse fatal("missing input file\n{s}", .{usage});
5435
55 const input_file_bytes = try std.fs.cwd().readFileAlloc(input_file_name, arena, .limited(std.math.maxInt(u32)));36 const input_file_bytes = try std.fs.cwd().readFileAlloc(input_file_name, arena, .limited(std.math.maxInt(u32)));
56 const case = try Case.parse(arena, input_file_bytes);37 const case = try Case.parse(arena, input_file_bytes);
tools/migrate_langref.zig+8-3
...@@ -13,9 +13,14 @@ pub fn main() !void {...@@ -13,9 +13,14 @@ pub fn main() !void {
13 defer arena_instance.deinit();13 defer arena_instance.deinit();
14 const arena = arena_instance.allocator();14 const arena = arena_instance.allocator();
1515
16 const args = try std.process.argsAlloc(arena);16 const args = try std.cli.parse(struct {
17 const input_file = args[1];17 positional: struct {
18 const output_file = args[2];18 input_file: [:0]const u8,
19 output_file: [:0]const u8,
20 },
21 }, arena, .{});
22 const input_file = args.positional.input_file;
23 const output_file = args.positional.output_file;
1924
20 var in_file = try fs.cwd().openFile(input_file, .{ .mode = .read_only });25 var in_file = try fs.cwd().openFile(input_file, .{ .mode = .read_only });
21 defer in_file.close();26 defer in_file.close();
tools/process_headers.zig+14-51
...@@ -119,52 +119,24 @@ const HashToContents = std.StringHashMap(Contents);...@@ -119,52 +119,24 @@ const HashToContents = std.StringHashMap(Contents);
119const TargetToHash = std.StringArrayHashMap([]const u8);119const TargetToHash = std.StringArrayHashMap([]const u8);
120const PathTable = std.StringHashMap(*TargetToHash);120const PathTable = std.StringHashMap(*TargetToHash);
121121
122const LibCVendor = enum {
123 musl,
124 glibc,
125 freebsd,
126 netbsd,
127};
128
129pub fn main() !void {122pub fn main() !void {
130 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);123 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
131 const allocator = arena.allocator();124 const allocator = arena.allocator();
132 const args = try std.process.argsAlloc(allocator);
133 var search_paths = std.array_list.Managed([]const u8).init(allocator);
134 var opt_out_dir: ?[]const u8 = null;
135 var opt_abi: ?[]const u8 = null;
136125
137 var arg_i: usize = 1;126 const args = try std.cli.parse(struct {
138 while (arg_i < args.len) : (arg_i += 1) {127 named: struct {
139 if (std.mem.eql(u8, args[arg_i], "--help"))128 @"search-path": []const []const u8 = &.{},
140 usageAndExit(args[0]);129 out: []const u8,
141 if (arg_i + 1 >= args.len) {130 abi: enum { musl, glibc, freebsd, netbsd },
142 std.debug.print("expected argument after '{s}'\n", .{args[arg_i]});
143 usageAndExit(args[0]);
144 }
145131
146 if (std.mem.eql(u8, args[arg_i], "--search-path")) {132 pub const @"search-path_help" = "subdirectories of search paths look like, e.g. x86_64-linux-gnu";
147 try search_paths.append(args[arg_i + 1]);133 pub const out_help = "a dir that will be created, and populated with the results";
148 } else if (std.mem.eql(u8, args[arg_i], "--out")) {134 },
149 assert(opt_out_dir == null);135 }, allocator, .{});
150 opt_out_dir = args[arg_i + 1];136 const search_paths = args.named.@"search-path";
151 } else if (std.mem.eql(u8, args[arg_i], "--abi")) {137 const out_dir = args.named.out;
152 assert(opt_abi == null);138 const vendor = args.named.abi;
153 opt_abi = args[arg_i + 1];139 const abi_name = @tagName(vendor);
154 } else {
155 std.debug.print("unrecognized argument: {s}\n", .{args[arg_i]});
156 usageAndExit(args[0]);
157 }
158
159 arg_i += 1;
160 }
161
162 const out_dir = opt_out_dir orelse usageAndExit(args[0]);
163 const abi_name = opt_abi orelse usageAndExit(args[0]);
164 const vendor = std.meta.stringToEnum(LibCVendor, abi_name) orelse {
165 std.debug.print("unrecognized C ABI: {s}\n", .{abi_name});
166 usageAndExit(args[0]);
167 };
168140
169 const generic_name = try std.fmt.allocPrint(allocator, "generic-{s}", .{abi_name});141 const generic_name = try std.fmt.allocPrint(allocator, "generic-{s}", .{abi_name});
170 const libc_targets = switch (vendor) {142 const libc_targets = switch (vendor) {
...@@ -225,7 +197,7 @@ pub fn main() !void {...@@ -225,7 +197,7 @@ pub fn main() !void {
225 @tagName(libc_target.abi),197 @tagName(libc_target.abi),
226 });198 });
227199
228 search: for (search_paths.items) |search_path| {200 search: for (search_paths) |search_path| {
229 const sub_path = switch (vendor) {201 const sub_path = switch (vendor) {
230 .glibc,202 .glibc,
231 .freebsd,203 .freebsd,
...@@ -362,12 +334,3 @@ pub fn main() !void {...@@ -362,12 +334,3 @@ pub fn main() !void {
362 }334 }
363 }335 }
364}336}
365
366fn usageAndExit(arg0: []const u8) noreturn {
367 std.debug.print("Usage: {s} [--search-path <dir>] --out <dir> --abi <name>\n", .{arg0});
368 std.debug.print("--search-path can be used any number of times.\n", .{});
369 std.debug.print(" subdirectories of search paths look like, e.g. x86_64-linux-gnu\n", .{});
370 std.debug.print("--out is a dir that will be created, and populated with the results\n", .{});
371 std.debug.print("--abi is either glibc, musl, freebsd, or netbsd\n", .{});
372 std.process.exit(1);
373}
tools/update-linux-headers.zig+11-34
...@@ -142,33 +142,18 @@ const PathTable = std.StringHashMap(*TargetToHash);...@@ -142,33 +142,18 @@ const PathTable = std.StringHashMap(*TargetToHash);
142pub fn main() !void {142pub fn main() !void {
143 var arena_state = std.heap.ArenaAllocator.init(std.heap.page_allocator);143 var arena_state = std.heap.ArenaAllocator.init(std.heap.page_allocator);
144 const arena = arena_state.allocator();144 const arena = arena_state.allocator();
145 const args = try std.process.argsAlloc(arena);
146 var search_paths = std.array_list.Managed([]const u8).init(arena);
147 var opt_out_dir: ?[]const u8 = null;
148145
149 var arg_i: usize = 1;146 const args = try std.cli.parse(struct {
150 while (arg_i < args.len) : (arg_i += 1) {147 named: struct {
151 if (std.mem.eql(u8, args[arg_i], "--help"))148 @"search-path": []const []const u8 = &.{},
152 usageAndExit(args[0]);149 out: []const u8,
153 if (arg_i + 1 >= args.len) {
154 std.debug.print("expected argument after '{s}'\n", .{args[arg_i]});
155 usageAndExit(args[0]);
156 }
157
158 if (std.mem.eql(u8, args[arg_i], "--search-path")) {
159 try search_paths.append(args[arg_i + 1]);
160 } else if (std.mem.eql(u8, args[arg_i], "--out")) {
161 assert(opt_out_dir == null);
162 opt_out_dir = args[arg_i + 1];
163 } else {
164 std.debug.print("unrecognized argument: {s}\n", .{args[arg_i]});
165 usageAndExit(args[0]);
166 }
167150
168 arg_i += 1;151 pub const @"search-path_help" = "subdirectories of search paths look like, e.g. x86_64-linux-gnu";
169 }152 pub const out_help = "a dir that will be created, and populated with the results";
170153 },
171 const out_dir = opt_out_dir orelse usageAndExit(args[0]);154 }, arena, .{});
155 const search_paths = args.named.@"search-path";
156 const out_dir = args.named.out;
172 const generic_name = "any-linux-any";157 const generic_name = "any-linux-any";
173158
174 var path_table = PathTable.init(arena);159 var path_table = PathTable.init(arena);
...@@ -182,7 +167,7 @@ pub fn main() !void {...@@ -182,7 +167,7 @@ pub fn main() !void {
182 const dest_target = DestTarget{167 const dest_target = DestTarget{
183 .arch = linux_target.arch,168 .arch = linux_target.arch,
184 };169 };
185 search: for (search_paths.items) |search_path| {170 search: for (search_paths) |search_path| {
186 const target_include_dir = try std.fs.path.join(arena, &.{171 const target_include_dir = try std.fs.path.join(arena, &.{
187 search_path, linux_target.name, "include",172 search_path, linux_target.name, "include",
188 });173 });
...@@ -320,11 +305,3 @@ pub fn main() !void {...@@ -320,11 +305,3 @@ pub fn main() !void {
320 try std.fs.cwd().deleteFile(full_path);305 try std.fs.cwd().deleteFile(full_path);
321 }306 }
322}307}
323
324fn usageAndExit(arg0: []const u8) noreturn {
325 std.debug.print("Usage: {s} [--search-path <dir>] --out <dir> --abi <name>\n", .{arg0});
326 std.debug.print("--search-path can be used any number of times.\n", .{});
327 std.debug.print(" subdirectories of search paths look like, e.g. x86_64-linux-gnu\n", .{});
328 std.debug.print("--out is a dir that will be created, and populated with the results\n", .{});
329 std.process.exit(1);
330}
tools/update_clang_options.zig+9-31
...@@ -630,29 +630,22 @@ const cpu_targets = struct {...@@ -630,29 +630,22 @@ const cpu_targets = struct {
630pub fn main() anyerror!void {630pub fn main() anyerror!void {
631 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);631 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
632 defer arena.deinit();632 defer arena.deinit();
633
634 const allocator = arena.allocator();633 const allocator = arena.allocator();
635 const args = try std.process.argsAlloc(allocator);
636634
637 var stdout_buffer: [4000]u8 = undefined;635 var stdout_buffer: [4000]u8 = undefined;
638 var stdout_writer = fs.File.stdout().writerStreaming(&stdout_buffer);636 var stdout_writer = fs.File.stdout().writerStreaming(&stdout_buffer);
639 const stdout = &stdout_writer.interface;637 const stdout = &stdout_writer.interface;
640638
641 if (args.len <= 1) printUsageAndExit(args[0]);639 const args = try std.cli.parse(struct {
642640 pub const description = "Prints to stdout Zig code which you can use to replace the file src/clang_options_data.zig.";
643 if (std.mem.eql(u8, args[1], "--help")) {641 positional: struct {
644 printUsage(stdout, args[0]) catch std.process.exit(2);642 @"/path/to/llvm-tblgen": [:0]const u8,
645 stdout.flush() catch std.process.exit(2);643 @"/path/to/git/llvm/llvm-project": [:0]const u8,
646 std.process.exit(0);644 },
647 }645 }, allocator, .{});
648
649 if (args.len < 3) printUsageAndExit(args[0]);
650
651 const llvm_tblgen_exe = args[1];
652 if (std.mem.startsWith(u8, llvm_tblgen_exe, "-")) printUsageAndExit(args[0]);
653646
654 const llvm_src_root = args[2];647 const llvm_tblgen_exe = args.positional.@"/path/to/llvm-tblgen";
655 if (std.mem.startsWith(u8, llvm_src_root, "-")) printUsageAndExit(args[0]);648 const llvm_src_root = args.positional.@"/path/to/git/llvm/llvm-project";
656649
657 var llvm_to_zig_cpu_features = std.StringHashMap([]const u8).init(allocator);650 var llvm_to_zig_cpu_features = std.StringHashMap([]const u8).init(allocator);
658651
...@@ -959,18 +952,3 @@ fn objectLessThan(context: void, a: *json.ObjectMap, b: *json.ObjectMap) bool {...@@ -959,18 +952,3 @@ fn objectLessThan(context: void, a: *json.ObjectMap, b: *json.ObjectMap) bool {
959 const b_key = b.get("!name").?.string;952 const b_key = b.get("!name").?.string;
960 return std.mem.lessThan(u8, a_key, b_key);953 return std.mem.lessThan(u8, a_key, b_key);
961}954}
962
963fn printUsageAndExit(arg0: []const u8) noreturn {
964 printUsage(std.debug.lockStderrWriter(&.{}), arg0) catch std.process.exit(2);
965 std.process.exit(1);
966}
967
968fn printUsage(w: *std.Io.Writer, arg0: []const u8) std.Io.Writer.Error!void {
969 try w.print(
970 \\Usage: {s} /path/to/llvm-tblgen /path/to/git/llvm/llvm-project
971 \\Alternative Usage: zig run /path/to/git/zig/tools/update_clang_options.zig -- /path/to/llvm-tblgen /path/to/git/llvm/llvm-project
972 \\
973 \\Prints to stdout Zig code which you can use to replace the file src/clang_options_data.zig.
974 \\
975 , .{arg0});
976}
tools/update_cpu_features.zig+17-45
...@@ -1567,38 +1567,23 @@ pub fn main() anyerror!void {...@@ -1567,38 +1567,23 @@ pub fn main() anyerror!void {
1567 defer arena_state.deinit();1567 defer arena_state.deinit();
1568 const arena = arena_state.allocator();1568 const arena = arena_state.allocator();
15691569
1570 var args = try std.process.argsWithAllocator(arena);1570 const args = try std.cli.parse(struct {
1571 const args0 = args.next().?;1571 pub const description =
15721572 \\Updates lib/std/target/<target>.zig from llvm/lib/Target/<Target>/<Target>.td .
1573 const llvm_tblgen_exe = args.next() orelse1573 \\
1574 usageAndExit(args0, 1);1574 \\On a less beefy system, or when debugging, compile with -fsingle-threaded.
15751575 ;
1576 if (std.mem.eql(u8, llvm_tblgen_exe, "--help")) {1576 positional: struct {
1577 usageAndExit(args0, 0);1577 @"/path/to/llvm-tblgen": [:0]const u8,
1578 }1578 @"/path/git/llvm-project": [:0]const u8,
1579 if (std.mem.startsWith(u8, llvm_tblgen_exe, "-")) {1579 @"/path/git/zig": [:0]const u8,
1580 usageAndExit(args0, 1);1580 zig_name_filter: []const u8 = "",
1581 }1581 },
15821582 }, arena, .{});
1583 const llvm_src_root = args.next() orelse1583 const llvm_tblgen_exe = args.positional.@"/path/to/llvm-tblgen";
1584 usageAndExit(args0, 1);1584 const llvm_src_root = args.positional.@"/path/git/llvm-project";
15851585 const zig_src_root = args.positional.@"/path/git/zig";
1586 if (std.mem.startsWith(u8, llvm_src_root, "-")) {1586 const filter: ?[]const u8 = if (args.positional.zig_name_filter.len > 0) args.positional.zig_name_filter else null;
1587 usageAndExit(args0, 1);
1588 }
1589
1590 const zig_src_root = args.next() orelse
1591 usageAndExit(args0, 1);
1592
1593 if (std.mem.startsWith(u8, zig_src_root, "-")) {
1594 usageAndExit(args0, 1);
1595 }
1596
1597 var filter: ?[]const u8 = null;
1598 if (args.next()) |arg| filter = arg;
1599
1600 // there shouldn't be any more argument after the optional filter
1601 if (args.skip()) usageAndExit(args0, 1);
16021587
1603 var zig_src_dir = try fs.cwd().openDir(zig_src_root, .{});1588 var zig_src_dir = try fs.cwd().openDir(zig_src_root, .{});
1604 defer zig_src_dir.close();1589 defer zig_src_dir.close();
...@@ -2104,19 +2089,6 @@ fn processOneTarget(job: Job) void {...@@ -2104,19 +2089,6 @@ fn processOneTarget(job: Job) void {
2104 render_progress.end();2089 render_progress.end();
2105}2090}
21062091
2107fn usageAndExit(arg0: []const u8, code: u8) noreturn {
2108 const stderr = std.debug.lockStderrWriter(&.{});
2109 stderr.print(
2110 \\Usage: {s} /path/to/llvm-tblgen /path/git/llvm-project /path/git/zig [zig_name filter]
2111 \\
2112 \\Updates lib/std/target/<target>.zig from llvm/lib/Target/<Target>/<Target>.td .
2113 \\
2114 \\On a less beefy system, or when debugging, compile with -fsingle-threaded.
2115 \\
2116 , .{arg0}) catch std.process.exit(1);
2117 std.process.exit(code);
2118}
2119
2120fn featureLessThan(_: void, a: Feature, b: Feature) bool {2092fn featureLessThan(_: void, a: Feature, b: Feature) bool {
2121 return std.ascii.lessThanIgnoreCase(a.zig_name, b.zig_name);2093 return std.ascii.lessThanIgnoreCase(a.zig_name, b.zig_name);
2122}2094}
tools/update_crc_catalog.zig+6-17
...@@ -10,11 +10,12 @@ pub fn main() anyerror!void {...@@ -10,11 +10,12 @@ pub fn main() anyerror!void {
10 defer arena_state.deinit();10 defer arena_state.deinit();
11 const arena = arena_state.allocator();11 const arena = arena_state.allocator();
1212
13 const args = try std.process.argsAlloc(arena);13 const args = try std.cli.parse(struct {
14 if (args.len <= 1) printUsageAndExit(args[0]);14 positional: struct {
1515 @"/path/git/zig": [:0]const u8,
16 const zig_src_root = args[1];16 },
17 if (mem.startsWith(u8, zig_src_root, "-")) printUsageAndExit(args[0]);17 }, arena, .{});
18 const zig_src_root = args.positional.@"/path/git/zig";
1819
19 var zig_src_dir = try fs.cwd().openDir(zig_src_root, .{});20 var zig_src_dir = try fs.cwd().openDir(zig_src_root, .{});
20 defer zig_src_dir.close();21 defer zig_src_dir.close();
...@@ -188,15 +189,3 @@ pub fn main() anyerror!void {...@@ -188,15 +189,3 @@ pub fn main() anyerror!void {
188 try code_writer.flush();189 try code_writer.flush();
189 try test_writer.flush();190 try test_writer.flush();
190}191}
191
192fn printUsageAndExit(arg0: []const u8) noreturn {
193 printUsage(std.debug.lockStderrWriter(&.{}), arg0) catch std.process.exit(2);
194 std.process.exit(1);
195}
196
197fn printUsage(w: *std.Io.Writer, arg0: []const u8) std.Io.Writer.Error!void {
198 return w.print(
199 \\Usage: {s} /path/git/zig
200 \\
201 , .{arg0});
202}
tools/update_freebsd_libc.zig+8-3
...@@ -16,9 +16,14 @@ pub fn main() !void {...@@ -16,9 +16,14 @@ pub fn main() !void {
16 defer arena_instance.deinit();16 defer arena_instance.deinit();
17 const arena = arena_instance.allocator();17 const arena = arena_instance.allocator();
1818
19 const args = try std.process.argsAlloc(arena);19 const args = try std.cli.parse(struct {
20 const freebsd_src_path = args[1];20 positional: struct {
21 const zig_src_path = args[2];21 freebsd_src_path: [:0]const u8,
22 zig_src_path: [:0]const u8,
23 },
24 }, arena, .{});
25 const freebsd_src_path = args.positional.freebsd_src_path;
26 const zig_src_path = args.positional.zig_src_path;
2227
23 const dest_dir_path = try std.fmt.allocPrint(arena, "{s}/lib/libc/freebsd", .{zig_src_path});28 const dest_dir_path = try std.fmt.allocPrint(arena, "{s}/lib/libc/freebsd", .{zig_src_path});
2429
tools/update_glibc.zig+8-3
...@@ -41,9 +41,14 @@ pub fn main() !void {...@@ -41,9 +41,14 @@ pub fn main() !void {
41 defer arena_instance.deinit();41 defer arena_instance.deinit();
42 const arena = arena_instance.allocator();42 const arena = arena_instance.allocator();
4343
44 const args = try std.process.argsAlloc(arena);44 const args = try std.cli.parse(struct {
45 const glibc_src_path = args[1];45 positional: struct {
46 const zig_src_path = args[2];46 glibc_src_path: [:0]const u8,
47 zig_src_path: [:0]const u8,
48 },
49 }, arena, .{});
50 const glibc_src_path = args.positional.glibc_src_path;
51 const zig_src_path = args.positional.zig_src_path;
4752
48 const dest_dir_path = try std.fmt.allocPrint(arena, "{s}/lib/libc/glibc", .{zig_src_path});53 const dest_dir_path = try std.fmt.allocPrint(arena, "{s}/lib/libc/glibc", .{zig_src_path});
4954
tools/update_mingw.zig+8-3
...@@ -5,9 +5,14 @@ pub fn main() !void {...@@ -5,9 +5,14 @@ pub fn main() !void {
5 defer arena_instance.deinit();5 defer arena_instance.deinit();
6 const arena = arena_instance.allocator();6 const arena = arena_instance.allocator();
77
8 const args = try std.process.argsAlloc(arena);8 const args = try std.cli.parse(struct {
9 const zig_src_lib_path = args[1];9 positional: struct {
10 const mingw_src_path = args[2];10 zig_src_lib_path: [:0]const u8,
11 mingw_src_path: [:0]const u8,
12 },
13 }, arena, .{});
14 const zig_src_lib_path = args.positional.zig_src_lib_path;
15 const mingw_src_path = args.positional.mingw_src_path;
1116
12 const dest_mingw_crt_path = try std.fs.path.join(arena, &.{17 const dest_mingw_crt_path = try std.fs.path.join(arena, &.{
13 zig_src_lib_path, "libc", "mingw",18 zig_src_lib_path, "libc", "mingw",
tools/update_netbsd_libc.zig+8-3
...@@ -16,9 +16,14 @@ pub fn main() !void {...@@ -16,9 +16,14 @@ pub fn main() !void {
16 defer arena_instance.deinit();16 defer arena_instance.deinit();
17 const arena = arena_instance.allocator();17 const arena = arena_instance.allocator();
1818
19 const args = try std.process.argsAlloc(arena);19 const args = try std.cli.parse(struct {
20 const netbsd_src_path = args[1];20 positional: struct {
21 const zig_src_path = args[2];21 netbsd_src_path: [:0]const u8,
22 zig_src_path: [:0]const u8,
23 },
24 }, arena, .{});
25 const netbsd_src_path = args.positional.netbsd_src_path;
26 const zig_src_path = args.positional.zig_src_path;
2227
23 const dest_dir_path = try std.fmt.allocPrint(arena, "{s}/lib/libc/netbsd", .{zig_src_path});28 const dest_dir_path = try std.fmt.allocPrint(arena, "{s}/lib/libc/netbsd", .{zig_src_path});
2429