authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-10-08 08:14:11+02:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-10-16 22:25:13+02:00
log140fb615a6a351fb397d6a538a4954a2229e90a8
treef1d3cfab015500387401b7fabdf58ab38e8edfb1
parentbdb00b393e1910d30be04490535960651a7a07b7
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

std.Target: Move isLib{C,Cxx}LibName() to std.zig.target.

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(
492492 const b = m.owner;
493493
494494 const target = m.requireKnownTarget();
495 if (target.isLibCLibName(name)) {
495 if (std.zig.target.isLibCLibName(target, name)) {
496496 m.link_libc = true;
497497 return;
498498 }
499 if (target.isLibCxxLibName(name)) {
499 if (std.zig.target.isLibCxxLibName(target, name)) {
500500 m.link_libcpp = true;
501501 return;
502502 }
lib/std/Build/Step/Compile.zig+4-2
......@@ -611,11 +611,13 @@ pub fn dependsOnSystemLibrary(compile: *const Compile, name: []const u8) bool {
611611 is_linking_libcpp = is_linking_libcpp or module.link_libcpp == true;
612612 }
613613
614 if (compile.rootModuleTarget().isLibCLibName(name)) {
614 const target = compile.rootModuleTarget();
615
616 if (std.zig.target.isLibCLibName(target, name)) {
615617 return is_linking_libc;
616618 }
617619
618 if (compile.rootModuleTarget().isLibCxxLibName(name)) {
620 if (std.zig.target.isLibCxxLibName(target, name)) {
619621 return is_linking_libcpp;
620622 }
621623
lib/std/Target.zig-135
......@@ -2868,141 +2868,6 @@ pub fn cTypePreferredAlignment(target: Target, c_type: CType) u16 {
28682868 );
28692869}
28702870
2871pub 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
2990pub 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
2998fn 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
30062871pub fn osArchName(target: std.Target) [:0]const u8 {
30072872 return target.os.tag.archName(target.cpu.arch);
30082873}
lib/std/zig/target.zig+135
......@@ -124,4 +124,139 @@ pub fn muslArchName(arch: std.Target.Cpu.Arch) [:0]const u8 {
124124 }
125125}
126126
127pub 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
246pub 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
254fn 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
127262const std = @import("std");
src/Sema.zig+2-2
......@@ -9606,7 +9606,7 @@ fn handleExternLibName(
96069606 const comp = zcu.comp;
96079607 const target = zcu.getTarget();
96089608 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)) {
96109610 if (!comp.config.link_libc) {
96119611 return sema.fail(
96129612 block,
......@@ -9617,7 +9617,7 @@ fn handleExternLibName(
96179617 }
96189618 break :blk;
96199619 }
9620 if (target.isLibCxxLibName(lib_name)) {
9620 if (std.zig.target.isLibCxxLibName(target, lib_name)) {
96219621 if (!comp.config.link_libcpp) return sema.fail(
96229622 block,
96239623 src_loc,
src/main.zig+2-2
......@@ -3765,11 +3765,11 @@ fn createModule(
37653765 info: SystemLib,
37663766 }) = .{};
37673767 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)) {
37693769 create_module.opts.link_libc = true;
37703770 continue;
37713771 }
3772 if (target.isLibCxxLibName(lib_name)) {
3772 if (std.zig.target.isLibCxxLibName(target, lib_name)) {
37733773 create_module.opts.link_libcpp = true;
37743774 continue;
37753775 }