| ... | ... | @@ -768,14 +768,30 @@ fn buildOutputType( |
| 768 | 768 | var process_args_iter = try process.argsWithAllocator(arena); |
| 769 | 769 | _ = process_args_iter.skip(); // "zig" |
| 770 | 770 | _ = process_args_iter.skip(); // e.g. "build-lib" |
| 771 | var resp_file_args_iter: ?ArgIteratorResponseFile = null; |
| 771 | 772 | |
| 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 | 782 | var args_index = process_args_iter.inner.index; |
| 774 | 783 | if (resp_file_args_iter) |iter| { |
| 775 | 784 | args_index = iter.index; |
| 776 | 785 | } |
| 777 | 786 | |
| 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 | 795 | if (mem.eql(u8, arg, "-h") or mem.eql(u8, arg, "--help")) { |
| 780 | 796 | try io.getStdOut().writeAll(usage_build_generic); |
| 781 | 797 | return cleanExit(); |
| ... | ... | @@ -789,8 +805,8 @@ fn buildOutputType( |
| 789 | 805 | fatal("unexpected end-of-parameter mark: --", .{}); |
| 790 | 806 | } |
| 791 | 807 | } else if (mem.eql(u8, arg, "--pkg-begin")) { |
| 792 | | const pkg_name = process_args_iter.next(); |
| 793 | | const pkg_path = process_args_iter.next(); |
| 808 | const pkg_name = getNextArg(&process_args_iter, &resp_file_args_iter); |
| 809 | const pkg_path = getNextArg(&process_args_iter, &resp_file_args_iter); |
| 794 | 810 | if (pkg_name == null or pkg_path == null) fatal("Expected 2 arguments after {s}", .{arg}); |
| 795 | 811 | |
| 796 | 812 | const new_cur_pkg = Package.create( |
| ... | ... | @@ -806,25 +822,25 @@ fn buildOutputType( |
| 806 | 822 | cur_pkg = cur_pkg.parent orelse |
| 807 | 823 | fatal("encountered --pkg-end with no matching --pkg-begin", .{}); |
| 808 | 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 | 826 | if (next_arg == null) fatal("expected parameter after {s}", .{arg}); |
| 811 | 827 | main_pkg_path = next_arg.?; |
| 812 | 828 | } else if (mem.eql(u8, arg, "-cflags")) { |
| 813 | 829 | extra_cflags.shrinkRetainingCapacity(0); |
| 814 | 830 | while (true) { |
| 815 | | const next_arg = process_args_iter.next(); |
| 831 | const next_arg = getNextArg(&process_args_iter, &resp_file_args_iter); |
| 816 | 832 | if (next_arg == null) fatal("expected -- after -cflags", .{}); |
| 817 | 833 | if (mem.eql(u8, next_arg.?, "--")) break; |
| 818 | 834 | try extra_cflags.append(next_arg.?); |
| 819 | 835 | } |
| 820 | 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 | 838 | if (next_arg == null) fatal("expected [auto|on|off] after --color", .{}); |
| 823 | 839 | color = std.meta.stringToEnum(Color, next_arg.?) orelse { |
| 824 | 840 | fatal("expected [auto|on|off] after --color, found '{s}'", .{next_arg.?}); |
| 825 | 841 | }; |
| 826 | 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 | 844 | if (next_arg == null) fatal("expected parameter after {s}", .{arg}); |
| 829 | 845 | if (mem.eql(u8, next_arg.?, "console")) { |
| 830 | 846 | subsystem = .Console; |
| ... | ... | @@ -857,65 +873,65 @@ fn buildOutputType( |
| 857 | 873 | }); |
| 858 | 874 | } |
| 859 | 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 | 877 | if (next_arg == null) fatal("expected parameter after {s}", .{arg}); |
| 862 | 878 | optimize_mode_string = next_arg.?; |
| 863 | 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 | 881 | if (next_arg == null) fatal("expected parameter after {s}", .{arg}); |
| 866 | 882 | entry = next_arg.?; |
| 867 | 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 | 885 | if (next_arg == null) fatal("expected parameter after {s}", .{arg}); |
| 870 | 886 | stack_size_override = std.fmt.parseUnsigned(u64, next_arg.?, 0) catch |err| { |
| 871 | 887 | fatal("unable to parse '{s}': {s}", .{ arg, @errorName(err) }); |
| 872 | 888 | }; |
| 873 | 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 | 891 | if (next_arg == null) fatal("expected parameter after {s}", .{arg}); |
| 876 | 892 | image_base_override = std.fmt.parseUnsigned(u64, next_arg.?, 0) catch |err| { |
| 877 | 893 | fatal("unable to parse '{s}': {s}", .{ arg, @errorName(err) }); |
| 878 | 894 | }; |
| 879 | 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 | 897 | if (next_arg == null) fatal("expected parameter after {s}", .{arg}); |
| 882 | 898 | provided_name = next_arg.?; |
| 883 | 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 | 901 | if (next_arg == null) fatal("expected parameter after {s}", .{arg}); |
| 886 | 902 | try rpath_list.append(next_arg.?); |
| 887 | 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 | 905 | if (next_arg == null) fatal("expected parameter after {s}", .{arg}); |
| 890 | 906 | try lib_dirs.append(next_arg.?); |
| 891 | 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 | 909 | if (next_arg == null) fatal("expected parameter after {s}", .{arg}); |
| 894 | 910 | try framework_dirs.append(next_arg.?); |
| 895 | 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 | 913 | if (next_arg == null) fatal("expected parameter after {s}", .{arg}); |
| 898 | 914 | try frameworks.append(next_arg.?); |
| 899 | 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 | 917 | if (next_arg == null) fatal("expected parameter after {s}", .{arg}); |
| 902 | 918 | install_name = next_arg.?; |
| 903 | 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 | 921 | if (next_arg == null) fatal("expected parameter after {s}", .{arg}); |
| 906 | 922 | linker_script = next_arg.?; |
| 907 | 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 | 925 | if (next_arg == null) fatal("expected parameter after {s}", .{arg}); |
| 910 | 926 | version_script = next_arg.?; |
| 911 | 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 | 929 | if (next_arg == null) fatal("expected parameter after {s}", .{arg}); |
| 914 | 930 | // We don't know whether this library is part of libc or libc++ until |
| 915 | 931 | // we resolve the target, so we simply append to the list for now. |
| 916 | 932 | try system_libs.put(next_arg.?, .{ .needed = false }); |
| 917 | 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 | 935 | if (next_arg == null) fatal("expected parameter after {s}", .{arg}); |
| 920 | 936 | try system_libs.put(next_arg.?, .{ .needed = true }); |
| 921 | 937 | } else if (mem.eql(u8, arg, "-D") or |
| ... | ... | @@ -926,27 +942,27 @@ fn buildOutputType( |
| 926 | 942 | mem.eql(u8, arg, "-iframework") or |
| 927 | 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 | 946 | if (next_arg == null) fatal("expected parameter after {s}", .{arg}); |
| 931 | 947 | try clang_argv.append(arg); |
| 932 | 948 | try clang_argv.append(next_arg.?); |
| 933 | 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 | 951 | if (next_arg == null) fatal("expected parameter after --version", .{}); |
| 936 | 952 | version = std.builtin.Version.parse(next_arg.?) catch |err| { |
| 937 | 953 | fatal("unable to parse --version '{s}': {s}", .{ next_arg.?, @errorName(err) }); |
| 938 | 954 | }; |
| 939 | 955 | have_version = true; |
| 940 | 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 | 958 | if (next_arg == null) fatal("expected parameter after {s}", .{arg}); |
| 943 | 959 | target_arch_os_abi = next_arg.?; |
| 944 | 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 | 962 | if (next_arg == null) fatal("expected parameter after {s}", .{arg}); |
| 947 | 963 | target_mcpu = next_arg.?; |
| 948 | 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 | 966 | if (next_arg == null) fatal("expected parameter after {s}", .{arg}); |
| 951 | 967 | machine_code_model = parseCodeModel(next_arg.?); |
| 952 | 968 | } else if (mem.startsWith(u8, arg, "-ofmt=")) { |
| ... | ... | @@ -958,45 +974,45 @@ fn buildOutputType( |
| 958 | 974 | } else if (mem.startsWith(u8, arg, "-O")) { |
| 959 | 975 | optimize_mode_string = arg["-O".len..]; |
| 960 | 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 | 978 | if (next_arg == null) fatal("expected parameter after {s}", .{arg}); |
| 963 | 979 | target_dynamic_linker = next_arg.?; |
| 964 | 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 | 982 | if (next_arg == null) fatal("expected parameter after {s}", .{arg}); |
| 967 | 983 | sysroot = next_arg.?; |
| 968 | 984 | try clang_argv.append("-isysroot"); |
| 969 | 985 | try clang_argv.append(next_arg.?); |
| 970 | 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 | 988 | if (next_arg == null) fatal("expected parameter after {s}", .{arg}); |
| 973 | 989 | libc_paths_file = next_arg.?; |
| 974 | 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 | 992 | if (next_arg == null) fatal("expected parameter after {s}", .{arg}); |
| 977 | 993 | test_filter = next_arg.?; |
| 978 | 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 | 996 | if (next_arg == null) fatal("expected parameter after {s}", .{arg}); |
| 981 | 997 | test_name_prefix = next_arg.?; |
| 982 | 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 | 1000 | if (next_arg == null) fatal("expected parameter after {s}", .{arg}); |
| 985 | 1001 | try test_exec_args.append(next_arg.?); |
| 986 | 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 | 1004 | if (next_arg == null) fatal("expected parameter after {s}", .{arg}); |
| 989 | 1005 | override_local_cache_dir = next_arg.?; |
| 990 | 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 | 1008 | if (next_arg == null) fatal("expected parameter after {s}", .{arg}); |
| 993 | 1009 | override_global_cache_dir = next_arg.?; |
| 994 | 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 | 1012 | if (next_arg == null) fatal("expected parameter after {s}", .{arg}); |
| 997 | 1013 | override_lib_dir = next_arg.?; |
| 998 | 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 | 1016 | if (next_arg == null) fatal("expected parameter after {s}", .{arg}); |
| 1001 | 1017 | if (!build_options.enable_logging) { |
| 1002 | 1018 | std.log.warn("Zig was compiled without logging enabled (-Dlog). --debug-log has no effect.", .{}); |
| ... | ... | @@ -1174,7 +1190,7 @@ fn buildOutputType( |
| 1174 | 1190 | } else if (mem.eql(u8, arg, "-fno-allow-shlib-undefined")) { |
| 1175 | 1191 | linker_allow_shlib_undefined = false; |
| 1176 | 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 | 1194 | if (next_arg == null) fatal("expected linker extension flag after '{s}'", .{arg}); |
| 1179 | 1195 | const z_arg = next_arg.?; |
| 1180 | 1196 | if (mem.eql(u8, z_arg, "nodelete")) { |