authorgravatar for stephen@hexops.comStephen Gutekanst <stephen@hexops.com> 2022-02-21 14:18:15-07:00
committergravatar for stephen@hexops.comStephen Gutekanst <stephen@hexops.com> 2022-02-21 14:20:38-07:00
logb341967da0fc0fe5dfc8fa914006fd6a7624297f
tree622c3b71c2950b05d8d1799c1a51cfa856c4732f
parentefd473bbfc1417c5cc376f1b8ec44036752570bf

zig build: use a custom iterator for merging args and response file

Signed-off-by: Stephen Gutekanst <stephen@hexops.com>

1 files changed, 54 insertions(+), 54 deletions(-)

src/main.zig+54-54
...@@ -765,30 +765,30 @@ fn buildOutputType(...@@ -765,30 +765,30 @@ fn buildOutputType(
765 }765 }
766766
767 soname = .yes_default_value;767 soname = .yes_default_value;
768 var process_args_iter = try process.argsWithAllocator(arena);
769 _ = process_args_iter.skip(); // "zig"
770 _ = process_args_iter.skip(); // e.g. "build-lib"
771 var resp_file_args_iter: ?ArgIteratorResponseFile = null;
772
773 const getNextArg = (struct {
774 pub fn getNextArg(_process_args_iter: *process.ArgIterator, maybe_resp_file_args_iter: *?ArgIteratorResponseFile) ?[:0]const u8 {
775 if (_process_args_iter.next()) |proc_arg| return proc_arg;
776 if (maybe_resp_file_args_iter.*) |*iter| return iter.next();
777 return null;
778 }
779 }).getNextArg;
780768
781 args_loop: while (getNextArg(&process_args_iter, &resp_file_args_iter)) |arg| {769 const Iterator = struct {
782 var args_index = process_args_iter.inner.index;770 resp_file: ?ArgIteratorResponseFile = null,
783 if (resp_file_args_iter) |iter| {771 args: []const []const u8,
784 args_index = iter.index;772 i: usize = 0,
773 fn next(it: *@This()) ?[]const u8 {
774 if (it.i >= it.args.len) {
775 if (it.resp_file) |*resp| return if (resp.next()) |sentinel| std.mem.span(sentinel) else null;
776 return null;
777 }
778 defer it.i += 1;
779 return it.args[it.i];
785 }780 }
781 };
782 var args_iter = Iterator{
783 .args = all_args[2..],
784 };
786785
786 args_loop: while (args_iter.next()) |arg| {
787 if (mem.startsWith(u8, arg, "@")) {787 if (mem.startsWith(u8, arg, "@")) {
788 // This is a "compiler response file". We must parse the file and treat its788 // This is a "compiler response file". We must parse the file and treat its
789 // contents as command line parameters.789 // contents as command line parameters.
790 const resp_file_path = arg[1..];790 const resp_file_path = arg[1..];
791 resp_file_args_iter = initArgIteratorResponseFile(arena, resp_file_path) catch |err| {791 args_iter.resp_file = initArgIteratorResponseFile(arena, resp_file_path) catch |err| {
792 fatal("unable to read response file '{s}': {s}", .{ resp_file_path, @errorName(err) });792 fatal("unable to read response file '{s}': {s}", .{ resp_file_path, @errorName(err) });
793 };793 };
794 } else if (mem.startsWith(u8, arg, "-")) {794 } else if (mem.startsWith(u8, arg, "-")) {
...@@ -799,14 +799,14 @@ fn buildOutputType(...@@ -799,14 +799,14 @@ fn buildOutputType(
799 if (arg_mode == .run) {799 if (arg_mode == .run) {
800 // The index refers to all_args so skip `zig` `run`800 // The index refers to all_args so skip `zig` `run`
801 // and `--`801 // and `--`
802 runtime_args_start = args_index + 3;802 runtime_args_start = args_iter.i + 3;
803 break :args_loop;803 break :args_loop;
804 } else {804 } else {
805 fatal("unexpected end-of-parameter mark: --", .{});805 fatal("unexpected end-of-parameter mark: --", .{});
806 }806 }
807 } else if (mem.eql(u8, arg, "--pkg-begin")) {807 } else if (mem.eql(u8, arg, "--pkg-begin")) {
808 const pkg_name = getNextArg(&process_args_iter, &resp_file_args_iter);808 const pkg_name = args_iter.next();
809 const pkg_path = getNextArg(&process_args_iter, &resp_file_args_iter);809 const pkg_path = args_iter.next();
810 if (pkg_name == null or pkg_path == null) fatal("Expected 2 arguments after {s}", .{arg});810 if (pkg_name == null or pkg_path == null) fatal("Expected 2 arguments after {s}", .{arg});
811811
812 const new_cur_pkg = Package.create(812 const new_cur_pkg = Package.create(
...@@ -822,28 +822,28 @@ fn buildOutputType(...@@ -822,28 +822,28 @@ fn buildOutputType(
822 cur_pkg = cur_pkg.parent orelse822 cur_pkg = cur_pkg.parent orelse
823 fatal("encountered --pkg-end with no matching --pkg-begin", .{});823 fatal("encountered --pkg-end with no matching --pkg-begin", .{});
824 } else if (mem.eql(u8, arg, "--main-pkg-path")) {824 } else if (mem.eql(u8, arg, "--main-pkg-path")) {
825 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {825 const next_arg = args_iter.next() orelse {
826 fatal("expected parameter after {s}", .{arg});826 fatal("expected parameter after {s}", .{arg});
827 };827 };
828 main_pkg_path = next_arg;828 main_pkg_path = next_arg;
829 } else if (mem.eql(u8, arg, "-cflags")) {829 } else if (mem.eql(u8, arg, "-cflags")) {
830 extra_cflags.shrinkRetainingCapacity(0);830 extra_cflags.shrinkRetainingCapacity(0);
831 while (true) {831 while (true) {
832 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {832 const next_arg = args_iter.next() orelse {
833 fatal("expected -- after -cflags", .{});833 fatal("expected -- after -cflags", .{});
834 };834 };
835 if (mem.eql(u8, next_arg, "--")) break;835 if (mem.eql(u8, next_arg, "--")) break;
836 try extra_cflags.append(next_arg);836 try extra_cflags.append(next_arg);
837 }837 }
838 } else if (mem.eql(u8, arg, "--color")) {838 } else if (mem.eql(u8, arg, "--color")) {
839 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {839 const next_arg = args_iter.next() orelse {
840 fatal("expected [auto|on|off] after --color", .{});840 fatal("expected [auto|on|off] after --color", .{});
841 };841 };
842 color = std.meta.stringToEnum(Color, next_arg) orelse {842 color = std.meta.stringToEnum(Color, next_arg) orelse {
843 fatal("expected [auto|on|off] after --color, found '{s}'", .{next_arg});843 fatal("expected [auto|on|off] after --color, found '{s}'", .{next_arg});
844 };844 };
845 } else if (mem.eql(u8, arg, "--subsystem")) {845 } else if (mem.eql(u8, arg, "--subsystem")) {
846 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {846 const next_arg = args_iter.next() orelse {
847 fatal("expected parameter after {s}", .{arg});847 fatal("expected parameter after {s}", .{arg});
848 };848 };
849 if (mem.eql(u8, next_arg, "console")) {849 if (mem.eql(u8, next_arg, "console")) {
...@@ -877,78 +877,78 @@ fn buildOutputType(...@@ -877,78 +877,78 @@ fn buildOutputType(
877 });877 });
878 }878 }
879 } else if (mem.eql(u8, arg, "-O")) {879 } else if (mem.eql(u8, arg, "-O")) {
880 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {880 const next_arg = args_iter.next() orelse {
881 fatal("expected parameter after {s}", .{arg});881 fatal("expected parameter after {s}", .{arg});
882 };882 };
883 optimize_mode_string = next_arg;883 optimize_mode_string = next_arg;
884 } else if (mem.eql(u8, arg, "--entry")) {884 } else if (mem.eql(u8, arg, "--entry")) {
885 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {885 const next_arg = args_iter.next() orelse {
886 fatal("expected parameter after {s}", .{arg});886 fatal("expected parameter after {s}", .{arg});
887 };887 };
888 entry = next_arg;888 entry = next_arg;
889 } else if (mem.eql(u8, arg, "--stack")) {889 } else if (mem.eql(u8, arg, "--stack")) {
890 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {890 const next_arg = args_iter.next() orelse {
891 fatal("expected parameter after {s}", .{arg});891 fatal("expected parameter after {s}", .{arg});
892 };892 };
893 stack_size_override = std.fmt.parseUnsigned(u64, next_arg, 0) catch |err| {893 stack_size_override = std.fmt.parseUnsigned(u64, next_arg, 0) catch |err| {
894 fatal("unable to parse '{s}': {s}", .{ arg, @errorName(err) });894 fatal("unable to parse '{s}': {s}", .{ arg, @errorName(err) });
895 };895 };
896 } else if (mem.eql(u8, arg, "--image-base")) {896 } else if (mem.eql(u8, arg, "--image-base")) {
897 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {897 const next_arg = args_iter.next() orelse {
898 fatal("expected parameter after {s}", .{arg});898 fatal("expected parameter after {s}", .{arg});
899 };899 };
900 image_base_override = std.fmt.parseUnsigned(u64, next_arg, 0) catch |err| {900 image_base_override = std.fmt.parseUnsigned(u64, next_arg, 0) catch |err| {
901 fatal("unable to parse '{s}': {s}", .{ arg, @errorName(err) });901 fatal("unable to parse '{s}': {s}", .{ arg, @errorName(err) });
902 };902 };
903 } else if (mem.eql(u8, arg, "--name")) {903 } else if (mem.eql(u8, arg, "--name")) {
904 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {904 const next_arg = args_iter.next() orelse {
905 fatal("expected parameter after {s}", .{arg});905 fatal("expected parameter after {s}", .{arg});
906 };906 };
907 provided_name = next_arg;907 provided_name = next_arg;
908 } else if (mem.eql(u8, arg, "-rpath")) {908 } else if (mem.eql(u8, arg, "-rpath")) {
909 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {909 const next_arg = args_iter.next() orelse {
910 fatal("expected parameter after {s}", .{arg});910 fatal("expected parameter after {s}", .{arg});
911 };911 };
912 try rpath_list.append(next_arg);912 try rpath_list.append(next_arg);
913 } else if (mem.eql(u8, arg, "--library-directory") or mem.eql(u8, arg, "-L")) {913 } else if (mem.eql(u8, arg, "--library-directory") or mem.eql(u8, arg, "-L")) {
914 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {914 const next_arg = args_iter.next() orelse {
915 fatal("expected parameter after {s}", .{arg});915 fatal("expected parameter after {s}", .{arg});
916 };916 };
917 try lib_dirs.append(next_arg);917 try lib_dirs.append(next_arg);
918 } else if (mem.eql(u8, arg, "-F")) {918 } else if (mem.eql(u8, arg, "-F")) {
919 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {919 const next_arg = args_iter.next() orelse {
920 fatal("expected parameter after {s}", .{arg});920 fatal("expected parameter after {s}", .{arg});
921 };921 };
922 try framework_dirs.append(next_arg);922 try framework_dirs.append(next_arg);
923 } else if (mem.eql(u8, arg, "-framework")) {923 } else if (mem.eql(u8, arg, "-framework")) {
924 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {924 const next_arg = args_iter.next() orelse {
925 fatal("expected parameter after {s}", .{arg});925 fatal("expected parameter after {s}", .{arg});
926 };926 };
927 try frameworks.append(next_arg);927 try frameworks.append(next_arg);
928 } else if (mem.eql(u8, arg, "-install_name")) {928 } else if (mem.eql(u8, arg, "-install_name")) {
929 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {929 const next_arg = args_iter.next() orelse {
930 fatal("expected parameter after {s}", .{arg});930 fatal("expected parameter after {s}", .{arg});
931 };931 };
932 install_name = next_arg;932 install_name = next_arg;
933 } else if (mem.eql(u8, arg, "-T") or mem.eql(u8, arg, "--script")) {933 } else if (mem.eql(u8, arg, "-T") or mem.eql(u8, arg, "--script")) {
934 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {934 const next_arg = args_iter.next() orelse {
935 fatal("expected parameter after {s}", .{arg});935 fatal("expected parameter after {s}", .{arg});
936 };936 };
937 linker_script = next_arg;937 linker_script = next_arg;
938 } else if (mem.eql(u8, arg, "--version-script")) {938 } else if (mem.eql(u8, arg, "--version-script")) {
939 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {939 const next_arg = args_iter.next() orelse {
940 fatal("expected parameter after {s}", .{arg});940 fatal("expected parameter after {s}", .{arg});
941 };941 };
942 version_script = next_arg;942 version_script = next_arg;
943 } else if (mem.eql(u8, arg, "--library") or mem.eql(u8, arg, "-l")) {943 } else if (mem.eql(u8, arg, "--library") or mem.eql(u8, arg, "-l")) {
944 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {944 const next_arg = args_iter.next() orelse {
945 fatal("expected parameter after {s}", .{arg});945 fatal("expected parameter after {s}", .{arg});
946 };946 };
947 // We don't know whether this library is part of libc or libc++ until947 // We don't know whether this library is part of libc or libc++ until
948 // we resolve the target, so we simply append to the list for now.948 // we resolve the target, so we simply append to the list for now.
949 try system_libs.put(next_arg, .{ .needed = false });949 try system_libs.put(next_arg, .{ .needed = false });
950 } else if (mem.eql(u8, arg, "--needed-library") or mem.eql(u8, arg, "-needed-l")) {950 } else if (mem.eql(u8, arg, "--needed-library") or mem.eql(u8, arg, "-needed-l")) {
951 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {951 const next_arg = args_iter.next() orelse {
952 fatal("expected parameter after {s}", .{arg});952 fatal("expected parameter after {s}", .{arg});
953 };953 };
954 try system_libs.put(next_arg, .{ .needed = true });954 try system_libs.put(next_arg, .{ .needed = true });
...@@ -960,13 +960,13 @@ fn buildOutputType(...@@ -960,13 +960,13 @@ fn buildOutputType(
960 mem.eql(u8, arg, "-iframework") or960 mem.eql(u8, arg, "-iframework") or
961 mem.eql(u8, arg, "-iframeworkwithsysroot"))961 mem.eql(u8, arg, "-iframeworkwithsysroot"))
962 {962 {
963 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {963 const next_arg = args_iter.next() orelse {
964 fatal("expected parameter after {s}", .{arg});964 fatal("expected parameter after {s}", .{arg});
965 };965 };
966 try clang_argv.append(arg);966 try clang_argv.append(arg);
967 try clang_argv.append(next_arg);967 try clang_argv.append(next_arg);
968 } else if (mem.eql(u8, arg, "--version")) {968 } else if (mem.eql(u8, arg, "--version")) {
969 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {969 const next_arg = args_iter.next() orelse {
970 fatal("expected parameter after {s}", .{arg});970 fatal("expected parameter after {s}", .{arg});
971 };971 };
972 version = std.builtin.Version.parse(next_arg) catch |err| {972 version = std.builtin.Version.parse(next_arg) catch |err| {
...@@ -974,17 +974,17 @@ fn buildOutputType(...@@ -974,17 +974,17 @@ fn buildOutputType(
974 };974 };
975 have_version = true;975 have_version = true;
976 } else if (mem.eql(u8, arg, "-target")) {976 } else if (mem.eql(u8, arg, "-target")) {
977 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {977 const next_arg = args_iter.next() orelse {
978 fatal("expected parameter after {s}", .{arg});978 fatal("expected parameter after {s}", .{arg});
979 };979 };
980 target_arch_os_abi = next_arg;980 target_arch_os_abi = next_arg;
981 } else if (mem.eql(u8, arg, "-mcpu")) {981 } else if (mem.eql(u8, arg, "-mcpu")) {
982 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {982 const next_arg = args_iter.next() orelse {
983 fatal("expected parameter after {s}", .{arg});983 fatal("expected parameter after {s}", .{arg});
984 };984 };
985 target_mcpu = next_arg;985 target_mcpu = next_arg;
986 } else if (mem.eql(u8, arg, "-mcmodel")) {986 } else if (mem.eql(u8, arg, "-mcmodel")) {
987 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {987 const next_arg = args_iter.next() orelse {
988 fatal("expected parameter after {s}", .{arg});988 fatal("expected parameter after {s}", .{arg});
989 };989 };
990 machine_code_model = parseCodeModel(next_arg);990 machine_code_model = parseCodeModel(next_arg);
...@@ -997,54 +997,54 @@ fn buildOutputType(...@@ -997,54 +997,54 @@ fn buildOutputType(
997 } else if (mem.startsWith(u8, arg, "-O")) {997 } else if (mem.startsWith(u8, arg, "-O")) {
998 optimize_mode_string = arg["-O".len..];998 optimize_mode_string = arg["-O".len..];
999 } else if (mem.eql(u8, arg, "--dynamic-linker")) {999 } else if (mem.eql(u8, arg, "--dynamic-linker")) {
1000 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {1000 const next_arg = args_iter.next() orelse {
1001 fatal("expected parameter after {s}", .{arg});1001 fatal("expected parameter after {s}", .{arg});
1002 };1002 };
1003 target_dynamic_linker = next_arg;1003 target_dynamic_linker = next_arg;
1004 } else if (mem.eql(u8, arg, "--sysroot")) {1004 } else if (mem.eql(u8, arg, "--sysroot")) {
1005 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {1005 const next_arg = args_iter.next() orelse {
1006 fatal("expected parameter after {s}", .{arg});1006 fatal("expected parameter after {s}", .{arg});
1007 };1007 };
1008 sysroot = next_arg;1008 sysroot = next_arg;
1009 try clang_argv.append("-isysroot");1009 try clang_argv.append("-isysroot");
1010 try clang_argv.append(next_arg);1010 try clang_argv.append(next_arg);
1011 } else if (mem.eql(u8, arg, "--libc")) {1011 } else if (mem.eql(u8, arg, "--libc")) {
1012 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {1012 const next_arg = args_iter.next() orelse {
1013 fatal("expected parameter after {s}", .{arg});1013 fatal("expected parameter after {s}", .{arg});
1014 };1014 };
1015 libc_paths_file = next_arg;1015 libc_paths_file = next_arg;
1016 } else if (mem.eql(u8, arg, "--test-filter")) {1016 } else if (mem.eql(u8, arg, "--test-filter")) {
1017 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {1017 const next_arg = args_iter.next() orelse {
1018 fatal("expected parameter after {s}", .{arg});1018 fatal("expected parameter after {s}", .{arg});
1019 };1019 };
1020 test_filter = next_arg;1020 test_filter = next_arg;
1021 } else if (mem.eql(u8, arg, "--test-name-prefix")) {1021 } else if (mem.eql(u8, arg, "--test-name-prefix")) {
1022 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {1022 const next_arg = args_iter.next() orelse {
1023 fatal("expected parameter after {s}", .{arg});1023 fatal("expected parameter after {s}", .{arg});
1024 };1024 };
1025 test_name_prefix = next_arg;1025 test_name_prefix = next_arg;
1026 } else if (mem.eql(u8, arg, "--test-cmd")) {1026 } else if (mem.eql(u8, arg, "--test-cmd")) {
1027 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {1027 const next_arg = args_iter.next() orelse {
1028 fatal("expected parameter after {s}", .{arg});1028 fatal("expected parameter after {s}", .{arg});
1029 };1029 };
1030 try test_exec_args.append(next_arg);1030 try test_exec_args.append(next_arg);
1031 } else if (mem.eql(u8, arg, "--cache-dir")) {1031 } else if (mem.eql(u8, arg, "--cache-dir")) {
1032 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {1032 const next_arg = args_iter.next() orelse {
1033 fatal("expected parameter after {s}", .{arg});1033 fatal("expected parameter after {s}", .{arg});
1034 };1034 };
1035 override_local_cache_dir = next_arg;1035 override_local_cache_dir = next_arg;
1036 } else if (mem.eql(u8, arg, "--global-cache-dir")) {1036 } else if (mem.eql(u8, arg, "--global-cache-dir")) {
1037 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {1037 const next_arg = args_iter.next() orelse {
1038 fatal("expected parameter after {s}", .{arg});1038 fatal("expected parameter after {s}", .{arg});
1039 };1039 };
1040 override_global_cache_dir = next_arg;1040 override_global_cache_dir = next_arg;
1041 } else if (mem.eql(u8, arg, "--zig-lib-dir")) {1041 } else if (mem.eql(u8, arg, "--zig-lib-dir")) {
1042 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {1042 const next_arg = args_iter.next() orelse {
1043 fatal("expected parameter after {s}", .{arg});1043 fatal("expected parameter after {s}", .{arg});
1044 };1044 };
1045 override_lib_dir = next_arg;1045 override_lib_dir = next_arg;
1046 } else if (mem.eql(u8, arg, "--debug-log")) {1046 } else if (mem.eql(u8, arg, "--debug-log")) {
1047 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {1047 const next_arg = args_iter.next() orelse {
1048 fatal("expected parameter after {s}", .{arg});1048 fatal("expected parameter after {s}", .{arg});
1049 };1049 };
1050 if (!build_options.enable_logging) {1050 if (!build_options.enable_logging) {
...@@ -1223,7 +1223,7 @@ fn buildOutputType(...@@ -1223,7 +1223,7 @@ fn buildOutputType(
1223 } else if (mem.eql(u8, arg, "-fno-allow-shlib-undefined")) {1223 } else if (mem.eql(u8, arg, "-fno-allow-shlib-undefined")) {
1224 linker_allow_shlib_undefined = false;1224 linker_allow_shlib_undefined = false;
1225 } else if (mem.eql(u8, arg, "-z")) {1225 } else if (mem.eql(u8, arg, "-z")) {
1226 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter) orelse {1226 const next_arg = args_iter.next() orelse {
1227 fatal("expected parameter after {s}", .{arg});1227 fatal("expected parameter after {s}", .{arg});
1228 };1228 };
1229 const z_arg = next_arg;1229 const z_arg = next_arg;