authorgravatar for stephen@hexops.comStephen Gutekanst <stephen@hexops.com> 2022-02-20 13:43:52-07:00
committergravatar for stephen@hexops.comStephen Gutekanst <stephen@hexops.com> 2022-02-20 13:50:09-07:00
loge41d4df93cf78b7ecccd959472dc653dc089f8aa
treecd41631cf1883ba5915e22a4e3fd634115afe97b
parent0778f644b519a83e95848d05d5a9e6241f8f41f3

enable passing build-[lib|exe|obj] params via @args.rsp file

This change enables `zig build-lib` and friends to take a response file of command line arguments, for example: ```sh zig build-lib @args.rsp ``` Which effectively does the same thing as this in Bash: ```sh zig build-lib $(cat args.rsp) ``` Being able to use a file for arguments is important as one can quickly exceed the 32 KiB limit that Windows imposes on arguments to a process. Helps #10693 Signed-off-by: Stephen Gutekanst <stephen@hexops.com>

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

src/main.zig+54-38
...@@ -768,14 +768,30 @@ fn buildOutputType(...@@ -768,14 +768,30 @@ fn buildOutputType(
768 var process_args_iter = try process.argsWithAllocator(arena);768 var process_args_iter = try process.argsWithAllocator(arena);
769 _ = process_args_iter.skip(); // "zig"769 _ = process_args_iter.skip(); // "zig"
770 _ = process_args_iter.skip(); // e.g. "build-lib"770 _ = process_args_iter.skip(); // e.g. "build-lib"
771 var resp_file_args_iter: ?ArgIteratorResponseFile = null;
771772
772 args_loop: while (process_args_iter.next()) |arg| {773 var 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;
780
781 args_loop: while (getNextArg(&process_args_iter, &resp_file_args_iter)) |arg| {
773 var args_index = process_args_iter.inner.index;782 var args_index = process_args_iter.inner.index;
774 if (resp_file_args_iter) |iter| {783 if (resp_file_args_iter) |iter| {
775 args_index = iter.index;784 args_index = iter.index;
776 }785 }
777786
778 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 its
789 // contents as command line parameters.
790 const resp_file_path = arg[1..];
791 resp_file_args_iter = initArgIteratorResponseFile(arena, resp_file_path) catch |err| {
792 fatal("unable to read response file '{s}': {s}", .{ resp_file_path, @errorName(err) });
793 };
794 } else if (mem.startsWith(u8, arg, "-")) {
779 if (mem.eql(u8, arg, "-h") or mem.eql(u8, arg, "--help")) {795 if (mem.eql(u8, arg, "-h") or mem.eql(u8, arg, "--help")) {
780 try io.getStdOut().writeAll(usage_build_generic);796 try io.getStdOut().writeAll(usage_build_generic);
781 return cleanExit();797 return cleanExit();
...@@ -789,8 +805,8 @@ fn buildOutputType(...@@ -789,8 +805,8 @@ fn buildOutputType(
789 fatal("unexpected end-of-parameter mark: --", .{});805 fatal("unexpected end-of-parameter mark: --", .{});
790 }806 }
791 } else if (mem.eql(u8, arg, "--pkg-begin")) {807 } else if (mem.eql(u8, arg, "--pkg-begin")) {
792 const pkg_name = process_args_iter.next();808 const pkg_name = getNextArg(&process_args_iter, &resp_file_args_iter);
793 const pkg_path = process_args_iter.next();809 const pkg_path = getNextArg(&process_args_iter, &resp_file_args_iter);
794 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});
795811
796 const new_cur_pkg = Package.create(812 const new_cur_pkg = Package.create(
...@@ -806,25 +822,25 @@ fn buildOutputType(...@@ -806,25 +822,25 @@ fn buildOutputType(
806 cur_pkg = cur_pkg.parent orelse822 cur_pkg = cur_pkg.parent orelse
807 fatal("encountered --pkg-end with no matching --pkg-begin", .{});823 fatal("encountered --pkg-end with no matching --pkg-begin", .{});
808 } else if (mem.eql(u8, arg, "--main-pkg-path")) {824 } else if (mem.eql(u8, arg, "--main-pkg-path")) {
809 const next_arg = process_args_iter.next();825 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter);
810 if (next_arg == null) fatal("expected parameter after {s}", .{arg});826 if (next_arg == null) fatal("expected parameter after {s}", .{arg});
811 main_pkg_path = next_arg.?;827 main_pkg_path = next_arg.?;
812 } else if (mem.eql(u8, arg, "-cflags")) {828 } else if (mem.eql(u8, arg, "-cflags")) {
813 extra_cflags.shrinkRetainingCapacity(0);829 extra_cflags.shrinkRetainingCapacity(0);
814 while (true) {830 while (true) {
815 const next_arg = process_args_iter.next();831 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter);
816 if (next_arg == null) fatal("expected -- after -cflags", .{});832 if (next_arg == null) fatal("expected -- after -cflags", .{});
817 if (mem.eql(u8, next_arg.?, "--")) break;833 if (mem.eql(u8, next_arg.?, "--")) break;
818 try extra_cflags.append(next_arg.?);834 try extra_cflags.append(next_arg.?);
819 }835 }
820 } else if (mem.eql(u8, arg, "--color")) {836 } else if (mem.eql(u8, arg, "--color")) {
821 const next_arg = process_args_iter.next();837 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter);
822 if (next_arg == null) fatal("expected [auto|on|off] after --color", .{});838 if (next_arg == null) fatal("expected [auto|on|off] after --color", .{});
823 color = std.meta.stringToEnum(Color, next_arg.?) orelse {839 color = std.meta.stringToEnum(Color, next_arg.?) orelse {
824 fatal("expected [auto|on|off] after --color, found '{s}'", .{next_arg.?});840 fatal("expected [auto|on|off] after --color, found '{s}'", .{next_arg.?});
825 };841 };
826 } else if (mem.eql(u8, arg, "--subsystem")) {842 } else if (mem.eql(u8, arg, "--subsystem")) {
827 const next_arg = process_args_iter.next();843 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter);
828 if (next_arg == null) fatal("expected parameter after {s}", .{arg});844 if (next_arg == null) fatal("expected parameter after {s}", .{arg});
829 if (mem.eql(u8, next_arg.?, "console")) {845 if (mem.eql(u8, next_arg.?, "console")) {
830 subsystem = .Console;846 subsystem = .Console;
...@@ -857,65 +873,65 @@ fn buildOutputType(...@@ -857,65 +873,65 @@ fn buildOutputType(
857 });873 });
858 }874 }
859 } else if (mem.eql(u8, arg, "-O")) {875 } else if (mem.eql(u8, arg, "-O")) {
860 const next_arg = process_args_iter.next();876 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter);
861 if (next_arg == null) fatal("expected parameter after {s}", .{arg});877 if (next_arg == null) fatal("expected parameter after {s}", .{arg});
862 optimize_mode_string = next_arg.?;878 optimize_mode_string = next_arg.?;
863 } else if (mem.eql(u8, arg, "--entry")) {879 } else if (mem.eql(u8, arg, "--entry")) {
864 const next_arg = process_args_iter.next();880 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter);
865 if (next_arg == null) fatal("expected parameter after {s}", .{arg});881 if (next_arg == null) fatal("expected parameter after {s}", .{arg});
866 entry = next_arg.?;882 entry = next_arg.?;
867 } else if (mem.eql(u8, arg, "--stack")) {883 } else if (mem.eql(u8, arg, "--stack")) {
868 const next_arg = process_args_iter.next();884 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter);
869 if (next_arg == null) fatal("expected parameter after {s}", .{arg});885 if (next_arg == null) fatal("expected parameter after {s}", .{arg});
870 stack_size_override = std.fmt.parseUnsigned(u64, next_arg.?, 0) catch |err| {886 stack_size_override = std.fmt.parseUnsigned(u64, next_arg.?, 0) catch |err| {
871 fatal("unable to parse '{s}': {s}", .{ arg, @errorName(err) });887 fatal("unable to parse '{s}': {s}", .{ arg, @errorName(err) });
872 };888 };
873 } else if (mem.eql(u8, arg, "--image-base")) {889 } else if (mem.eql(u8, arg, "--image-base")) {
874 const next_arg = process_args_iter.next();890 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter);
875 if (next_arg == null) fatal("expected parameter after {s}", .{arg});891 if (next_arg == null) fatal("expected parameter after {s}", .{arg});
876 image_base_override = std.fmt.parseUnsigned(u64, next_arg.?, 0) catch |err| {892 image_base_override = std.fmt.parseUnsigned(u64, next_arg.?, 0) catch |err| {
877 fatal("unable to parse '{s}': {s}", .{ arg, @errorName(err) });893 fatal("unable to parse '{s}': {s}", .{ arg, @errorName(err) });
878 };894 };
879 } else if (mem.eql(u8, arg, "--name")) {895 } else if (mem.eql(u8, arg, "--name")) {
880 const next_arg = process_args_iter.next();896 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter);
881 if (next_arg == null) fatal("expected parameter after {s}", .{arg});897 if (next_arg == null) fatal("expected parameter after {s}", .{arg});
882 provided_name = next_arg.?;898 provided_name = next_arg.?;
883 } else if (mem.eql(u8, arg, "-rpath")) {899 } else if (mem.eql(u8, arg, "-rpath")) {
884 const next_arg = process_args_iter.next();900 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter);
885 if (next_arg == null) fatal("expected parameter after {s}", .{arg});901 if (next_arg == null) fatal("expected parameter after {s}", .{arg});
886 try rpath_list.append(next_arg.?);902 try rpath_list.append(next_arg.?);
887 } else if (mem.eql(u8, arg, "--library-directory") or mem.eql(u8, arg, "-L")) {903 } else if (mem.eql(u8, arg, "--library-directory") or mem.eql(u8, arg, "-L")) {
888 const next_arg = process_args_iter.next();904 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter);
889 if (next_arg == null) fatal("expected parameter after {s}", .{arg});905 if (next_arg == null) fatal("expected parameter after {s}", .{arg});
890 try lib_dirs.append(next_arg.?);906 try lib_dirs.append(next_arg.?);
891 } else if (mem.eql(u8, arg, "-F")) {907 } else if (mem.eql(u8, arg, "-F")) {
892 const next_arg = process_args_iter.next();908 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter);
893 if (next_arg == null) fatal("expected parameter after {s}", .{arg});909 if (next_arg == null) fatal("expected parameter after {s}", .{arg});
894 try framework_dirs.append(next_arg.?);910 try framework_dirs.append(next_arg.?);
895 } else if (mem.eql(u8, arg, "-framework")) {911 } else if (mem.eql(u8, arg, "-framework")) {
896 const next_arg = process_args_iter.next();912 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter);
897 if (next_arg == null) fatal("expected parameter after {s}", .{arg});913 if (next_arg == null) fatal("expected parameter after {s}", .{arg});
898 try frameworks.append(next_arg.?);914 try frameworks.append(next_arg.?);
899 } else if (mem.eql(u8, arg, "-install_name")) {915 } else if (mem.eql(u8, arg, "-install_name")) {
900 const next_arg = process_args_iter.next();916 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter);
901 if (next_arg == null) fatal("expected parameter after {s}", .{arg});917 if (next_arg == null) fatal("expected parameter after {s}", .{arg});
902 install_name = next_arg.?;918 install_name = next_arg.?;
903 } else if (mem.eql(u8, arg, "-T") or mem.eql(u8, arg, "--script")) {919 } else if (mem.eql(u8, arg, "-T") or mem.eql(u8, arg, "--script")) {
904 const next_arg = process_args_iter.next();920 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter);
905 if (next_arg == null) fatal("expected parameter after {s}", .{arg});921 if (next_arg == null) fatal("expected parameter after {s}", .{arg});
906 linker_script = next_arg.?;922 linker_script = next_arg.?;
907 } else if (mem.eql(u8, arg, "--version-script")) {923 } else if (mem.eql(u8, arg, "--version-script")) {
908 const next_arg = process_args_iter.next();924 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter);
909 if (next_arg == null) fatal("expected parameter after {s}", .{arg});925 if (next_arg == null) fatal("expected parameter after {s}", .{arg});
910 version_script = next_arg.?;926 version_script = next_arg.?;
911 } else if (mem.eql(u8, arg, "--library") or mem.eql(u8, arg, "-l")) {927 } else if (mem.eql(u8, arg, "--library") or mem.eql(u8, arg, "-l")) {
912 const next_arg = process_args_iter.next();928 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter);
913 if (next_arg == null) fatal("expected parameter after {s}", .{arg});929 if (next_arg == null) fatal("expected parameter after {s}", .{arg});
914 // We don't know whether this library is part of libc or libc++ until930 // We don't know whether this library is part of libc or libc++ until
915 // we resolve the target, so we simply append to the list for now.931 // we resolve the target, so we simply append to the list for now.
916 try system_libs.put(next_arg.?, .{ .needed = false });932 try system_libs.put(next_arg.?, .{ .needed = false });
917 } else if (mem.eql(u8, arg, "--needed-library") or mem.eql(u8, arg, "-needed-l")) {933 } else if (mem.eql(u8, arg, "--needed-library") or mem.eql(u8, arg, "-needed-l")) {
918 const next_arg = process_args_iter.next();934 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter);
919 if (next_arg == null) fatal("expected parameter after {s}", .{arg});935 if (next_arg == null) fatal("expected parameter after {s}", .{arg});
920 try system_libs.put(next_arg.?, .{ .needed = true });936 try system_libs.put(next_arg.?, .{ .needed = true });
921 } else if (mem.eql(u8, arg, "-D") or937 } else if (mem.eql(u8, arg, "-D") or
...@@ -926,27 +942,27 @@ fn buildOutputType(...@@ -926,27 +942,27 @@ fn buildOutputType(
926 mem.eql(u8, arg, "-iframework") or942 mem.eql(u8, arg, "-iframework") or
927 mem.eql(u8, arg, "-iframeworkwithsysroot"))943 mem.eql(u8, arg, "-iframeworkwithsysroot"))
928 {944 {
929 const next_arg = process_args_iter.next();945 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter);
930 if (next_arg == null) fatal("expected parameter after {s}", .{arg});946 if (next_arg == null) fatal("expected parameter after {s}", .{arg});
931 try clang_argv.append(arg);947 try clang_argv.append(arg);
932 try clang_argv.append(next_arg.?);948 try clang_argv.append(next_arg.?);
933 } else if (mem.eql(u8, arg, "--version")) {949 } else if (mem.eql(u8, arg, "--version")) {
934 const next_arg = process_args_iter.next();950 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter);
935 if (next_arg == null) fatal("expected parameter after --version", .{});951 if (next_arg == null) fatal("expected parameter after --version", .{});
936 version = std.builtin.Version.parse(next_arg.?) catch |err| {952 version = std.builtin.Version.parse(next_arg.?) catch |err| {
937 fatal("unable to parse --version '{s}': {s}", .{ next_arg.?, @errorName(err) });953 fatal("unable to parse --version '{s}': {s}", .{ next_arg.?, @errorName(err) });
938 };954 };
939 have_version = true;955 have_version = true;
940 } else if (mem.eql(u8, arg, "-target")) {956 } else if (mem.eql(u8, arg, "-target")) {
941 const next_arg = process_args_iter.next();957 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter);
942 if (next_arg == null) fatal("expected parameter after {s}", .{arg});958 if (next_arg == null) fatal("expected parameter after {s}", .{arg});
943 target_arch_os_abi = next_arg.?;959 target_arch_os_abi = next_arg.?;
944 } else if (mem.eql(u8, arg, "-mcpu")) {960 } else if (mem.eql(u8, arg, "-mcpu")) {
945 const next_arg = process_args_iter.next();961 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter);
946 if (next_arg == null) fatal("expected parameter after {s}", .{arg});962 if (next_arg == null) fatal("expected parameter after {s}", .{arg});
947 target_mcpu = next_arg.?;963 target_mcpu = next_arg.?;
948 } else if (mem.eql(u8, arg, "-mcmodel")) {964 } else if (mem.eql(u8, arg, "-mcmodel")) {
949 const next_arg = process_args_iter.next();965 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter);
950 if (next_arg == null) fatal("expected parameter after {s}", .{arg});966 if (next_arg == null) fatal("expected parameter after {s}", .{arg});
951 machine_code_model = parseCodeModel(next_arg.?);967 machine_code_model = parseCodeModel(next_arg.?);
952 } else if (mem.startsWith(u8, arg, "-ofmt=")) {968 } else if (mem.startsWith(u8, arg, "-ofmt=")) {
...@@ -958,45 +974,45 @@ fn buildOutputType(...@@ -958,45 +974,45 @@ fn buildOutputType(
958 } else if (mem.startsWith(u8, arg, "-O")) {974 } else if (mem.startsWith(u8, arg, "-O")) {
959 optimize_mode_string = arg["-O".len..];975 optimize_mode_string = arg["-O".len..];
960 } else if (mem.eql(u8, arg, "--dynamic-linker")) {976 } else if (mem.eql(u8, arg, "--dynamic-linker")) {
961 const next_arg = process_args_iter.next();977 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter);
962 if (next_arg == null) fatal("expected parameter after {s}", .{arg});978 if (next_arg == null) fatal("expected parameter after {s}", .{arg});
963 target_dynamic_linker = next_arg.?;979 target_dynamic_linker = next_arg.?;
964 } else if (mem.eql(u8, arg, "--sysroot")) {980 } else if (mem.eql(u8, arg, "--sysroot")) {
965 const next_arg = process_args_iter.next();981 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter);
966 if (next_arg == null) fatal("expected parameter after {s}", .{arg});982 if (next_arg == null) fatal("expected parameter after {s}", .{arg});
967 sysroot = next_arg.?;983 sysroot = next_arg.?;
968 try clang_argv.append("-isysroot");984 try clang_argv.append("-isysroot");
969 try clang_argv.append(next_arg.?);985 try clang_argv.append(next_arg.?);
970 } else if (mem.eql(u8, arg, "--libc")) {986 } else if (mem.eql(u8, arg, "--libc")) {
971 const next_arg = process_args_iter.next();987 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter);
972 if (next_arg == null) fatal("expected parameter after {s}", .{arg});988 if (next_arg == null) fatal("expected parameter after {s}", .{arg});
973 libc_paths_file = next_arg.?;989 libc_paths_file = next_arg.?;
974 } else if (mem.eql(u8, arg, "--test-filter")) {990 } else if (mem.eql(u8, arg, "--test-filter")) {
975 const next_arg = process_args_iter.next();991 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter);
976 if (next_arg == null) fatal("expected parameter after {s}", .{arg});992 if (next_arg == null) fatal("expected parameter after {s}", .{arg});
977 test_filter = next_arg.?;993 test_filter = next_arg.?;
978 } else if (mem.eql(u8, arg, "--test-name-prefix")) {994 } else if (mem.eql(u8, arg, "--test-name-prefix")) {
979 const next_arg = process_args_iter.next();995 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter);
980 if (next_arg == null) fatal("expected parameter after {s}", .{arg});996 if (next_arg == null) fatal("expected parameter after {s}", .{arg});
981 test_name_prefix = next_arg.?;997 test_name_prefix = next_arg.?;
982 } else if (mem.eql(u8, arg, "--test-cmd")) {998 } else if (mem.eql(u8, arg, "--test-cmd")) {
983 const next_arg = process_args_iter.next();999 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter);
984 if (next_arg == null) fatal("expected parameter after {s}", .{arg});1000 if (next_arg == null) fatal("expected parameter after {s}", .{arg});
985 try test_exec_args.append(next_arg.?);1001 try test_exec_args.append(next_arg.?);
986 } else if (mem.eql(u8, arg, "--cache-dir")) {1002 } else if (mem.eql(u8, arg, "--cache-dir")) {
987 const next_arg = process_args_iter.next();1003 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter);
988 if (next_arg == null) fatal("expected parameter after {s}", .{arg});1004 if (next_arg == null) fatal("expected parameter after {s}", .{arg});
989 override_local_cache_dir = next_arg.?;1005 override_local_cache_dir = next_arg.?;
990 } else if (mem.eql(u8, arg, "--global-cache-dir")) {1006 } else if (mem.eql(u8, arg, "--global-cache-dir")) {
991 const next_arg = process_args_iter.next();1007 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter);
992 if (next_arg == null) fatal("expected parameter after {s}", .{arg});1008 if (next_arg == null) fatal("expected parameter after {s}", .{arg});
993 override_global_cache_dir = next_arg.?;1009 override_global_cache_dir = next_arg.?;
994 } else if (mem.eql(u8, arg, "--zig-lib-dir")) {1010 } else if (mem.eql(u8, arg, "--zig-lib-dir")) {
995 const next_arg = process_args_iter.next();1011 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter);
996 if (next_arg == null) fatal("expected parameter after {s}", .{arg});1012 if (next_arg == null) fatal("expected parameter after {s}", .{arg});
997 override_lib_dir = next_arg.?;1013 override_lib_dir = next_arg.?;
998 } else if (mem.eql(u8, arg, "--debug-log")) {1014 } else if (mem.eql(u8, arg, "--debug-log")) {
999 const next_arg = process_args_iter.next();1015 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter);
1000 if (next_arg == null) fatal("expected parameter after {s}", .{arg});1016 if (next_arg == null) fatal("expected parameter after {s}", .{arg});
1001 if (!build_options.enable_logging) {1017 if (!build_options.enable_logging) {
1002 std.log.warn("Zig was compiled without logging enabled (-Dlog). --debug-log has no effect.", .{});1018 std.log.warn("Zig was compiled without logging enabled (-Dlog). --debug-log has no effect.", .{});
...@@ -1174,7 +1190,7 @@ fn buildOutputType(...@@ -1174,7 +1190,7 @@ fn buildOutputType(
1174 } else if (mem.eql(u8, arg, "-fno-allow-shlib-undefined")) {1190 } else if (mem.eql(u8, arg, "-fno-allow-shlib-undefined")) {
1175 linker_allow_shlib_undefined = false;1191 linker_allow_shlib_undefined = false;
1176 } else if (mem.eql(u8, arg, "-z")) {1192 } else if (mem.eql(u8, arg, "-z")) {
1177 const next_arg = process_args_iter.next();1193 const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter);
1178 if (next_arg == null) fatal("expected linker extension flag after '{s}'", .{arg});1194 if (next_arg == null) fatal("expected linker extension flag after '{s}'", .{arg});
1179 const z_arg = next_arg.?;1195 const z_arg = next_arg.?;
1180 if (mem.eql(u8, z_arg, "nodelete")) {1196 if (mem.eql(u8, z_arg, "nodelete")) {