| author | |
| committer | |
| log | 140fb615a6a351fb397d6a538a4954a2229e90a8 |
| tree | f1d3cfab015500387401b7fabdf58ab38e8edfb1 |
| parent | bdb00b393e1910d30be04490535960651a7a07b7 |
| signature | Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM |
These are really answering questions about the Zig compiler's capacity to
provide a libc/libc++ implementation. As such, std.zig.target seems like a more
fitting place for these.6 files changed, 145 insertions(+), 143 deletions(-)
lib/std/Build/Module.zig+2-2| ... | ... | @@ -492,11 +492,11 @@ pub fn linkSystemLibrary( |
| 492 | 492 | const b = m.owner; |
| 493 | 493 | |
| 494 | 494 | const target = m.requireKnownTarget(); |
| 495 | if (target.isLibCLibName(name)) { | |
| 495 | if (std.zig.target.isLibCLibName(target, name)) { | |
| 496 | 496 | m.link_libc = true; |
| 497 | 497 | return; |
| 498 | 498 | } |
| 499 | if (target.isLibCxxLibName(name)) { | |
| 499 | if (std.zig.target.isLibCxxLibName(target, name)) { | |
| 500 | 500 | m.link_libcpp = true; |
| 501 | 501 | return; |
| 502 | 502 | } |
lib/std/Build/Step/Compile.zig+4-2| ... | ... | @@ -611,11 +611,13 @@ pub fn dependsOnSystemLibrary(compile: *const Compile, name: []const u8) bool { |
| 611 | 611 | is_linking_libcpp = is_linking_libcpp or module.link_libcpp == true; |
| 612 | 612 | } |
| 613 | 613 | |
| 614 | if (compile.rootModuleTarget().isLibCLibName(name)) { | |
| 614 | const target = compile.rootModuleTarget(); | |
| 615 | ||
| 616 | if (std.zig.target.isLibCLibName(target, name)) { | |
| 615 | 617 | return is_linking_libc; |
| 616 | 618 | } |
| 617 | 619 | |
| 618 | if (compile.rootModuleTarget().isLibCxxLibName(name)) { | |
| 620 | if (std.zig.target.isLibCxxLibName(target, name)) { | |
| 619 | 621 | return is_linking_libcpp; |
| 620 | 622 | } |
| 621 | 623 |
lib/std/Target.zig-135| ... | ... | @@ -2868,141 +2868,6 @@ pub fn cTypePreferredAlignment(target: Target, c_type: CType) u16 { |
| 2868 | 2868 | ); |
| 2869 | 2869 | } |
| 2870 | 2870 | |
| 2871 | pub fn isLibCLibName(target: std.Target, name: []const u8) bool { | |
| 2872 | const ignore_case = target.os.tag.isDarwin() or target.os.tag == .windows; | |
| 2873 | ||
| 2874 | if (eqlIgnoreCase(ignore_case, name, "c")) | |
| 2875 | return true; | |
| 2876 | ||
| 2877 | if (target.isMinGW()) { | |
| 2878 | if (eqlIgnoreCase(ignore_case, name, "m")) | |
| 2879 | return true; | |
| 2880 | if (eqlIgnoreCase(ignore_case, name, "mingw32")) | |
| 2881 | return true; | |
| 2882 | if (eqlIgnoreCase(ignore_case, name, "msvcrt-os")) | |
| 2883 | return true; | |
| 2884 | if (eqlIgnoreCase(ignore_case, name, "mingwex")) | |
| 2885 | return true; | |
| 2886 | if (eqlIgnoreCase(ignore_case, name, "uuid")) | |
| 2887 | return true; | |
| 2888 | if (eqlIgnoreCase(ignore_case, name, "bits")) | |
| 2889 | return true; | |
| 2890 | if (eqlIgnoreCase(ignore_case, name, "dmoguids")) | |
| 2891 | return true; | |
| 2892 | if (eqlIgnoreCase(ignore_case, name, "dxerr8")) | |
| 2893 | return true; | |
| 2894 | if (eqlIgnoreCase(ignore_case, name, "dxerr9")) | |
| 2895 | return true; | |
| 2896 | if (eqlIgnoreCase(ignore_case, name, "mfuuid")) | |
| 2897 | return true; | |
| 2898 | if (eqlIgnoreCase(ignore_case, name, "msxml2")) | |
| 2899 | return true; | |
| 2900 | if (eqlIgnoreCase(ignore_case, name, "msxml6")) | |
| 2901 | return true; | |
| 2902 | if (eqlIgnoreCase(ignore_case, name, "amstrmid")) | |
| 2903 | return true; | |
| 2904 | if (eqlIgnoreCase(ignore_case, name, "wbemuuid")) | |
| 2905 | return true; | |
| 2906 | if (eqlIgnoreCase(ignore_case, name, "wmcodecdspuuid")) | |
| 2907 | return true; | |
| 2908 | if (eqlIgnoreCase(ignore_case, name, "dxguid")) | |
| 2909 | return true; | |
| 2910 | if (eqlIgnoreCase(ignore_case, name, "ksguid")) | |
| 2911 | return true; | |
| 2912 | if (eqlIgnoreCase(ignore_case, name, "locationapi")) | |
| 2913 | return true; | |
| 2914 | if (eqlIgnoreCase(ignore_case, name, "portabledeviceguids")) | |
| 2915 | return true; | |
| 2916 | if (eqlIgnoreCase(ignore_case, name, "mfuuid")) | |
| 2917 | return true; | |
| 2918 | if (eqlIgnoreCase(ignore_case, name, "dloadhelper")) | |
| 2919 | return true; | |
| 2920 | if (eqlIgnoreCase(ignore_case, name, "strmiids")) | |
| 2921 | return true; | |
| 2922 | if (eqlIgnoreCase(ignore_case, name, "mfuuid")) | |
| 2923 | return true; | |
| 2924 | if (eqlIgnoreCase(ignore_case, name, "adsiid")) | |
| 2925 | return true; | |
| 2926 | ||
| 2927 | return false; | |
| 2928 | } | |
| 2929 | ||
| 2930 | if (target.abi.isGnu() or target.abi.isMusl()) { | |
| 2931 | if (eqlIgnoreCase(ignore_case, name, "m")) | |
| 2932 | return true; | |
| 2933 | if (eqlIgnoreCase(ignore_case, name, "rt")) | |
| 2934 | return true; | |
| 2935 | if (eqlIgnoreCase(ignore_case, name, "pthread")) | |
| 2936 | return true; | |
| 2937 | if (eqlIgnoreCase(ignore_case, name, "util")) | |
| 2938 | return true; | |
| 2939 | if (eqlIgnoreCase(ignore_case, name, "resolv")) | |
| 2940 | return true; | |
| 2941 | if (eqlIgnoreCase(ignore_case, name, "dl")) | |
| 2942 | return true; | |
| 2943 | } | |
| 2944 | ||
| 2945 | if (target.abi.isMusl()) { | |
| 2946 | if (eqlIgnoreCase(ignore_case, name, "crypt")) | |
| 2947 | return true; | |
| 2948 | if (eqlIgnoreCase(ignore_case, name, "xnet")) | |
| 2949 | return true; | |
| 2950 | } | |
| 2951 | ||
| 2952 | if (target.os.tag.isDarwin()) { | |
| 2953 | if (eqlIgnoreCase(ignore_case, name, "System")) | |
| 2954 | return true; | |
| 2955 | if (eqlIgnoreCase(ignore_case, name, "c")) | |
| 2956 | return true; | |
| 2957 | if (eqlIgnoreCase(ignore_case, name, "dbm")) | |
| 2958 | return true; | |
| 2959 | if (eqlIgnoreCase(ignore_case, name, "dl")) | |
| 2960 | return true; | |
| 2961 | if (eqlIgnoreCase(ignore_case, name, "info")) | |
| 2962 | return true; | |
| 2963 | if (eqlIgnoreCase(ignore_case, name, "m")) | |
| 2964 | return true; | |
| 2965 | if (eqlIgnoreCase(ignore_case, name, "poll")) | |
| 2966 | return true; | |
| 2967 | if (eqlIgnoreCase(ignore_case, name, "proc")) | |
| 2968 | return true; | |
| 2969 | if (eqlIgnoreCase(ignore_case, name, "pthread")) | |
| 2970 | return true; | |
| 2971 | if (eqlIgnoreCase(ignore_case, name, "rpcsvc")) | |
| 2972 | return true; | |
| 2973 | } | |
| 2974 | ||
| 2975 | if (target.os.isAtLeast(.macos, .{ .major = 10, .minor = 8, .patch = 0 }) orelse false) { | |
| 2976 | if (eqlIgnoreCase(ignore_case, name, "mx")) | |
| 2977 | return true; | |
| 2978 | } | |
| 2979 | ||
| 2980 | if (target.os.tag == .haiku) { | |
| 2981 | if (eqlIgnoreCase(ignore_case, name, "root")) | |
| 2982 | return true; | |
| 2983 | if (eqlIgnoreCase(ignore_case, name, "network")) | |
| 2984 | return true; | |
| 2985 | } | |
| 2986 | ||
| 2987 | return false; | |
| 2988 | } | |
| 2989 | ||
| 2990 | pub fn isLibCxxLibName(target: std.Target, name: []const u8) bool { | |
| 2991 | const ignore_case = target.os.tag.isDarwin() or target.os.tag == .windows; | |
| 2992 | ||
| 2993 | return eqlIgnoreCase(ignore_case, name, "c++") or | |
| 2994 | eqlIgnoreCase(ignore_case, name, "stdc++") or | |
| 2995 | eqlIgnoreCase(ignore_case, name, "c++abi"); | |
| 2996 | } | |
| 2997 | ||
| 2998 | fn eqlIgnoreCase(ignore_case: bool, a: []const u8, b: []const u8) bool { | |
| 2999 | if (ignore_case) { | |
| 3000 | return std.ascii.eqlIgnoreCase(a, b); | |
| 3001 | } else { | |
| 3002 | return std.mem.eql(u8, a, b); | |
| 3003 | } | |
| 3004 | } | |
| 3005 | ||
| 3006 | 2871 | pub fn osArchName(target: std.Target) [:0]const u8 { |
| 3007 | 2872 | return target.os.tag.archName(target.cpu.arch); |
| 3008 | 2873 | } |
lib/std/zig/target.zig+135| ... | ... | @@ -124,4 +124,139 @@ pub fn muslArchName(arch: std.Target.Cpu.Arch) [:0]const u8 { |
| 124 | 124 | } |
| 125 | 125 | } |
| 126 | 126 | |
| 127 | pub fn isLibCLibName(target: std.Target, name: []const u8) bool { | |
| 128 | const ignore_case = target.os.tag.isDarwin() or target.os.tag == .windows; | |
| 129 | ||
| 130 | if (eqlIgnoreCase(ignore_case, name, "c")) | |
| 131 | return true; | |
| 132 | ||
| 133 | if (target.isMinGW()) { | |
| 134 | if (eqlIgnoreCase(ignore_case, name, "m")) | |
| 135 | return true; | |
| 136 | if (eqlIgnoreCase(ignore_case, name, "mingw32")) | |
| 137 | return true; | |
| 138 | if (eqlIgnoreCase(ignore_case, name, "msvcrt-os")) | |
| 139 | return true; | |
| 140 | if (eqlIgnoreCase(ignore_case, name, "mingwex")) | |
| 141 | return true; | |
| 142 | if (eqlIgnoreCase(ignore_case, name, "uuid")) | |
| 143 | return true; | |
| 144 | if (eqlIgnoreCase(ignore_case, name, "bits")) | |
| 145 | return true; | |
| 146 | if (eqlIgnoreCase(ignore_case, name, "dmoguids")) | |
| 147 | return true; | |
| 148 | if (eqlIgnoreCase(ignore_case, name, "dxerr8")) | |
| 149 | return true; | |
| 150 | if (eqlIgnoreCase(ignore_case, name, "dxerr9")) | |
| 151 | return true; | |
| 152 | if (eqlIgnoreCase(ignore_case, name, "mfuuid")) | |
| 153 | return true; | |
| 154 | if (eqlIgnoreCase(ignore_case, name, "msxml2")) | |
| 155 | return true; | |
| 156 | if (eqlIgnoreCase(ignore_case, name, "msxml6")) | |
| 157 | return true; | |
| 158 | if (eqlIgnoreCase(ignore_case, name, "amstrmid")) | |
| 159 | return true; | |
| 160 | if (eqlIgnoreCase(ignore_case, name, "wbemuuid")) | |
| 161 | return true; | |
| 162 | if (eqlIgnoreCase(ignore_case, name, "wmcodecdspuuid")) | |
| 163 | return true; | |
| 164 | if (eqlIgnoreCase(ignore_case, name, "dxguid")) | |
| 165 | return true; | |
| 166 | if (eqlIgnoreCase(ignore_case, name, "ksguid")) | |
| 167 | return true; | |
| 168 | if (eqlIgnoreCase(ignore_case, name, "locationapi")) | |
| 169 | return true; | |
| 170 | if (eqlIgnoreCase(ignore_case, name, "portabledeviceguids")) | |
| 171 | return true; | |
| 172 | if (eqlIgnoreCase(ignore_case, name, "mfuuid")) | |
| 173 | return true; | |
| 174 | if (eqlIgnoreCase(ignore_case, name, "dloadhelper")) | |
| 175 | return true; | |
| 176 | if (eqlIgnoreCase(ignore_case, name, "strmiids")) | |
| 177 | return true; | |
| 178 | if (eqlIgnoreCase(ignore_case, name, "mfuuid")) | |
| 179 | return true; | |
| 180 | if (eqlIgnoreCase(ignore_case, name, "adsiid")) | |
| 181 | return true; | |
| 182 | ||
| 183 | return false; | |
| 184 | } | |
| 185 | ||
| 186 | if (target.abi.isGnu() or target.abi.isMusl()) { | |
| 187 | if (eqlIgnoreCase(ignore_case, name, "m")) | |
| 188 | return true; | |
| 189 | if (eqlIgnoreCase(ignore_case, name, "rt")) | |
| 190 | return true; | |
| 191 | if (eqlIgnoreCase(ignore_case, name, "pthread")) | |
| 192 | return true; | |
| 193 | if (eqlIgnoreCase(ignore_case, name, "util")) | |
| 194 | return true; | |
| 195 | if (eqlIgnoreCase(ignore_case, name, "resolv")) | |
| 196 | return true; | |
| 197 | if (eqlIgnoreCase(ignore_case, name, "dl")) | |
| 198 | return true; | |
| 199 | } | |
| 200 | ||
| 201 | if (target.abi.isMusl()) { | |
| 202 | if (eqlIgnoreCase(ignore_case, name, "crypt")) | |
| 203 | return true; | |
| 204 | if (eqlIgnoreCase(ignore_case, name, "xnet")) | |
| 205 | return true; | |
| 206 | } | |
| 207 | ||
| 208 | if (target.os.tag.isDarwin()) { | |
| 209 | if (eqlIgnoreCase(ignore_case, name, "System")) | |
| 210 | return true; | |
| 211 | if (eqlIgnoreCase(ignore_case, name, "c")) | |
| 212 | return true; | |
| 213 | if (eqlIgnoreCase(ignore_case, name, "dbm")) | |
| 214 | return true; | |
| 215 | if (eqlIgnoreCase(ignore_case, name, "dl")) | |
| 216 | return true; | |
| 217 | if (eqlIgnoreCase(ignore_case, name, "info")) | |
| 218 | return true; | |
| 219 | if (eqlIgnoreCase(ignore_case, name, "m")) | |
| 220 | return true; | |
| 221 | if (eqlIgnoreCase(ignore_case, name, "poll")) | |
| 222 | return true; | |
| 223 | if (eqlIgnoreCase(ignore_case, name, "proc")) | |
| 224 | return true; | |
| 225 | if (eqlIgnoreCase(ignore_case, name, "pthread")) | |
| 226 | return true; | |
| 227 | if (eqlIgnoreCase(ignore_case, name, "rpcsvc")) | |
| 228 | return true; | |
| 229 | } | |
| 230 | ||
| 231 | if (target.os.isAtLeast(.macos, .{ .major = 10, .minor = 8, .patch = 0 }) orelse false) { | |
| 232 | if (eqlIgnoreCase(ignore_case, name, "mx")) | |
| 233 | return true; | |
| 234 | } | |
| 235 | ||
| 236 | if (target.os.tag == .haiku) { | |
| 237 | if (eqlIgnoreCase(ignore_case, name, "root")) | |
| 238 | return true; | |
| 239 | if (eqlIgnoreCase(ignore_case, name, "network")) | |
| 240 | return true; | |
| 241 | } | |
| 242 | ||
| 243 | return false; | |
| 244 | } | |
| 245 | ||
| 246 | pub fn isLibCxxLibName(target: std.Target, name: []const u8) bool { | |
| 247 | const ignore_case = target.os.tag.isDarwin() or target.os.tag == .windows; | |
| 248 | ||
| 249 | return eqlIgnoreCase(ignore_case, name, "c++") or | |
| 250 | eqlIgnoreCase(ignore_case, name, "stdc++") or | |
| 251 | eqlIgnoreCase(ignore_case, name, "c++abi"); | |
| 252 | } | |
| 253 | ||
| 254 | fn eqlIgnoreCase(ignore_case: bool, a: []const u8, b: []const u8) bool { | |
| 255 | if (ignore_case) { | |
| 256 | return std.ascii.eqlIgnoreCase(a, b); | |
| 257 | } else { | |
| 258 | return std.mem.eql(u8, a, b); | |
| 259 | } | |
| 260 | } | |
| 261 | ||
| 127 | 262 | const std = @import("std"); |
src/Sema.zig+2-2| ... | ... | @@ -9606,7 +9606,7 @@ fn handleExternLibName( |
| 9606 | 9606 | const comp = zcu.comp; |
| 9607 | 9607 | const target = zcu.getTarget(); |
| 9608 | 9608 | log.debug("extern fn symbol expected in lib '{s}'", .{lib_name}); |
| 9609 | if (target.isLibCLibName(lib_name)) { | |
| 9609 | if (std.zig.target.isLibCLibName(target, lib_name)) { | |
| 9610 | 9610 | if (!comp.config.link_libc) { |
| 9611 | 9611 | return sema.fail( |
| 9612 | 9612 | block, |
| ... | ... | @@ -9617,7 +9617,7 @@ fn handleExternLibName( |
| 9617 | 9617 | } |
| 9618 | 9618 | break :blk; |
| 9619 | 9619 | } |
| 9620 | if (target.isLibCxxLibName(lib_name)) { | |
| 9620 | if (std.zig.target.isLibCxxLibName(target, lib_name)) { | |
| 9621 | 9621 | if (!comp.config.link_libcpp) return sema.fail( |
| 9622 | 9622 | block, |
| 9623 | 9623 | src_loc, |
src/main.zig+2-2| ... | ... | @@ -3765,11 +3765,11 @@ fn createModule( |
| 3765 | 3765 | info: SystemLib, |
| 3766 | 3766 | }) = .{}; |
| 3767 | 3767 | for (create_module.system_libs.keys(), create_module.system_libs.values()) |lib_name, info| { |
| 3768 | if (target.isLibCLibName(lib_name)) { | |
| 3768 | if (std.zig.target.isLibCLibName(target, lib_name)) { | |
| 3769 | 3769 | create_module.opts.link_libc = true; |
| 3770 | 3770 | continue; |
| 3771 | 3771 | } |
| 3772 | if (target.isLibCxxLibName(lib_name)) { | |
| 3772 | if (std.zig.target.isLibCxxLibName(target, lib_name)) { | |
| 3773 | 3773 | create_module.opts.link_libcpp = true; |
| 3774 | 3774 | continue; |
| 3775 | 3775 | } |