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
signature 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(...@@ -492,11 +492,11 @@ pub fn linkSystemLibrary(
492 const b = m.owner;492 const b = m.owner;
493493
494 const target = m.requireKnownTarget();494 const target = m.requireKnownTarget();
495 if (target.isLibCLibName(name)) {495 if (std.zig.target.isLibCLibName(target, name)) {
496 m.link_libc = true;496 m.link_libc = true;
497 return;497 return;
498 }498 }
499 if (target.isLibCxxLibName(name)) {499 if (std.zig.target.isLibCxxLibName(target, name)) {
500 m.link_libcpp = true;500 m.link_libcpp = true;
501 return;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,11 +611,13 @@ pub fn dependsOnSystemLibrary(compile: *const Compile, name: []const u8) bool {
611 is_linking_libcpp = is_linking_libcpp or module.link_libcpp == true;611 is_linking_libcpp = is_linking_libcpp or module.link_libcpp == true;
612 }612 }
613613
614 if (compile.rootModuleTarget().isLibCLibName(name)) {614 const target = compile.rootModuleTarget();
615
616 if (std.zig.target.isLibCLibName(target, name)) {
615 return is_linking_libc;617 return is_linking_libc;
616 }618 }
617619
618 if (compile.rootModuleTarget().isLibCxxLibName(name)) {620 if (std.zig.target.isLibCxxLibName(target, name)) {
619 return is_linking_libcpp;621 return is_linking_libcpp;
620 }622 }
621623
lib/std/Target.zig-135
...@@ -2868,141 +2868,6 @@ pub fn cTypePreferredAlignment(target: Target, c_type: CType) u16 {...@@ -2868,141 +2868,6 @@ pub fn cTypePreferredAlignment(target: Target, c_type: CType) u16 {
2868 );2868 );
2869}2869}
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
3006pub fn osArchName(target: std.Target) [:0]const u8 {2871pub fn osArchName(target: std.Target) [:0]const u8 {
3007 return target.os.tag.archName(target.cpu.arch);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,4 +124,139 @@ pub fn muslArchName(arch: std.Target.Cpu.Arch) [:0]const u8 {
124 }124 }
125}125}
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
127const std = @import("std");262const std = @import("std");
src/Sema.zig+2-2
...@@ -9606,7 +9606,7 @@ fn handleExternLibName(...@@ -9606,7 +9606,7 @@ fn handleExternLibName(
9606 const comp = zcu.comp;9606 const comp = zcu.comp;
9607 const target = zcu.getTarget();9607 const target = zcu.getTarget();
9608 log.debug("extern fn symbol expected in lib '{s}'", .{lib_name});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 if (!comp.config.link_libc) {9610 if (!comp.config.link_libc) {
9611 return sema.fail(9611 return sema.fail(
9612 block,9612 block,
...@@ -9617,7 +9617,7 @@ fn handleExternLibName(...@@ -9617,7 +9617,7 @@ fn handleExternLibName(
9617 }9617 }
9618 break :blk;9618 break :blk;
9619 }9619 }
9620 if (target.isLibCxxLibName(lib_name)) {9620 if (std.zig.target.isLibCxxLibName(target, lib_name)) {
9621 if (!comp.config.link_libcpp) return sema.fail(9621 if (!comp.config.link_libcpp) return sema.fail(
9622 block,9622 block,
9623 src_loc,9623 src_loc,
src/main.zig+2-2
...@@ -3765,11 +3765,11 @@ fn createModule(...@@ -3765,11 +3765,11 @@ fn createModule(
3765 info: SystemLib,3765 info: SystemLib,
3766 }) = .{};3766 }) = .{};
3767 for (create_module.system_libs.keys(), create_module.system_libs.values()) |lib_name, info| {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 create_module.opts.link_libc = true;3769 create_module.opts.link_libc = true;
3770 continue;3770 continue;
3771 }3771 }
3772 if (target.isLibCxxLibName(lib_name)) {3772 if (std.zig.target.isLibCxxLibName(target, lib_name)) {
3773 create_module.opts.link_libcpp = true;3773 create_module.opts.link_libcpp = true;
3774 continue;3774 continue;
3775 }3775 }