1const std = @import("std");
2const Io = std.Io;
3const Allocator = std.mem.Allocator;
4const mem = std.mem;
5const path = std.Io.Dir.path;
6const assert = std.debug.assert;
7const log = std.log.scoped(.mingw);
8
9const builtin = @import("builtin");
10const Compilation = @import("../Compilation.zig");
11const build_options = @import("build_options");
12const Cache = std.Build.Cache;
13const dev = @import("../dev.zig");
14const def = @import("mingw/def.zig");
15const implib = @import("mingw/implib.zig");
16
17const Preprocessor = @import("mingw/Preprocessor.zig");
18
19test {
20 _ = def;
21 _ = implib;
22 _ = Preprocessor;
23}
24
25pub const CrtFile = enum {
26 crt2_o,
27 dllcrt2_o,
28 libmingw32_lib,
29};
30
31/// TODO replace anyerror with explicit error set, recording user-friendly errors with
32/// lockAndSetMiscFailure and returning error.AlreadyReported. see libcxx.zig for example.
33pub fn buildCrtFile(comp: *Compilation, crt_file: CrtFile, prog_node: std.Progress.Node) anyerror!void {
34 if (!build_options.have_llvm) {
35 return error.ZigCompilerNotBuiltWithLLVMExtensions;
36 }
37 var arena_allocator = std.heap.ArenaAllocator.init(comp.gpa);
38 defer arena_allocator.deinit();
39 const arena = arena_allocator.allocator();
40 const target = comp.getTarget();
41
42 switch (crt_file) {
43 .crt2_o => {
44 var args = std.array_list.Managed([]const u8).init(arena);
45 try addCrtCcArgs(comp, arena, &args);
46 if (comp.mingw_unicode_entry_point) {
47 try args.appendSlice(&.{ "-DUNICODE", "-D_UNICODE" });
48 }
49 var files = [_]Compilation.CSourceFile{
50 .{
51 .src_path = try comp.dirs.zig_lib.join(arena, &.{
52 "libc", "mingw", "crt", "crtexe.c",
53 }),
54 .extra_flags = args.items,
55 .owner = undefined,
56 },
57 };
58 return comp.build_crt_file("crt2", .Obj, .@"mingw-w64 crt2.o", prog_node, &files, .{
59 .function_sections = false, // https://codeberg.org/ziglang/zig/issues/30702
60 });
61 },
62
63 .dllcrt2_o => {
64 var args = std.array_list.Managed([]const u8).init(arena);
65 try addCrtCcArgs(comp, arena, &args);
66 var files = [_]Compilation.CSourceFile{
67 .{
68 .src_path = try comp.dirs.zig_lib.join(arena, &.{
69 "libc", "mingw", "crt", "crtdll.c",
70 }),
71 .extra_flags = args.items,
72 .owner = undefined,
73 },
74 };
75 return comp.build_crt_file("dllcrt2", .Obj, .@"mingw-w64 dllcrt2.o", prog_node, &files, .{});
76 },
77
78 .libmingw32_lib => {
79 var c_source_files = std.array_list.Managed(Compilation.CSourceFile).init(arena);
80
81 {
82 var crt_args = std.array_list.Managed([]const u8).init(arena);
83 try addCrtCcArgs(comp, arena, &crt_args);
84
85 for (mingw32_generic_src) |dep| {
86 try c_source_files.append(.{
87 .src_path = try comp.dirs.zig_lib.join(arena, &.{
88 "libc", "mingw", dep,
89 }),
90 .extra_flags = crt_args.items,
91 .owner = undefined,
92 });
93 }
94 if (target.cpu.arch.isX86()) {
95 for (mingw32_x86_src) |dep| {
96 try c_source_files.append(.{
97 .src_path = try comp.dirs.zig_lib.join(arena, &.{
98 "libc", "mingw", dep,
99 }),
100 .extra_flags = crt_args.items,
101 .owner = undefined,
102 });
103 }
104 if (target.cpu.arch == .x86) {
105 for (mingw32_x86_32_src) |dep| {
106 try c_source_files.append(.{
107 .src_path = try comp.dirs.zig_lib.join(arena, &.{
108 "libc", "mingw", dep,
109 }),
110 .extra_flags = crt_args.items,
111 .owner = undefined,
112 });
113 }
114 }
115 } else if (target.cpu.arch == .thumb or target.cpu.arch == .aarch64) {
116 for (mingw32_arm_src) |dep| {
117 try c_source_files.append(.{
118 .src_path = try comp.dirs.zig_lib.join(arena, &.{
119 "libc", "mingw", dep,
120 }),
121 .extra_flags = crt_args.items,
122 .owner = undefined,
123 });
124 }
125 } else {
126 @panic("unsupported arch");
127 }
128 }
129
130 {
131 var winpthreads_args = std.array_list.Managed([]const u8).init(arena);
132 try addCcArgs(comp, arena, &winpthreads_args);
133 try winpthreads_args.appendSlice(&[_][]const u8{
134 "-DIN_WINPTHREAD",
135 });
136
137 switch (comp.compilerRtOptMode()) {
138 .debug, .safe => try winpthreads_args.append("-DWINPTHREAD_DBG"),
139 .fast, .small => {},
140 }
141
142 for (mingw32_winpthreads_src) |dep| {
143 try c_source_files.append(.{
144 .src_path = try comp.dirs.zig_lib.join(arena, &.{
145 "libc", "mingw", dep,
146 }),
147 .extra_flags = winpthreads_args.items,
148 .owner = undefined,
149 });
150 }
151 }
152
153 return comp.build_crt_file("libmingw32", .Lib, .@"mingw-w64 libmingw32.lib", prog_node, c_source_files.items, .{
154 // https://github.com/llvm/llvm-project/issues/43698#issuecomment-2542660611
155 .allow_lto = false,
156 });
157 },
158 }
159}
160
161fn addCcArgs(
162 comp: *Compilation,
163 arena: Allocator,
164 args: *std.array_list.Managed([]const u8),
165) error{OutOfMemory}!void {
166 try args.appendSlice(&[_][]const u8{
167 "-w", // Disable all warnings.
168 "-std=gnu11",
169 "-D__USE_MINGW_ANSI_STDIO=0",
170
171 "-isystem",
172 try comp.dirs.zig_lib.join(arena, &.{ "libc", "include", "any-windows-any" }),
173 });
174}
175
176fn addCrtCcArgs(
177 comp: *Compilation,
178 arena: Allocator,
179 args: *std.array_list.Managed([]const u8),
180) error{OutOfMemory}!void {
181 try addCcArgs(comp, arena, args);
182
183 if (comp.getTarget().cpu.arch == .thumb) {
184 try args.append("-mfpu=vfp");
185 }
186
187 try args.appendSlice(&[_][]const u8{
188 // According to Martin Storsjö,
189 // > the files under mingw-w64-crt are designed to always
190 // be built with __MSVCRT_VERSION__=0x700
191 "-D__MSVCRT_VERSION__=0x700",
192 "-D_CRTBLD",
193 "-D_SYSCRT=1",
194 "-D_WIN32_WINNT=0x0f00",
195 "-DCRTDLL=1",
196 "-DHAVE_CONFIG_H",
197
198 "-I",
199 try comp.dirs.zig_lib.join(arena, &.{ "libc", "mingw", "include" }),
200 });
201}
202
203pub fn buildImportLib(comp: *Compilation, lib_name: []const u8, prog_node: std.Progress.Node) !Cache.Path {
204 dev.check(.build_import_lib);
205
206 log.debug("buildImportLib({s})", .{lib_name});
207
208 const sub_node = prog_node.start(lib_name, 0);
209 defer sub_node.end();
210
211 const gpa = comp.gpa;
212 const io = comp.io;
213
214 var arena_allocator = std.heap.ArenaAllocator.init(gpa);
215 defer arena_allocator.deinit();
216 const arena = arena_allocator.allocator();
217
218 const def_file_path: Cache.Path = .{
219 .root_dir = comp.dirs.zig_lib,
220 .sub_path = findDef(arena, io, comp.getTarget(), comp.dirs.zig_lib, lib_name) catch |err| switch (err) {
221 error.FileNotFound => return error.DefNotFound,
222 else => |e| return e,
223 },
224 };
225 // Only .def.in files need preprocessing
226 const def_needs_preprocessing = mem.endsWith(u8, def_file_path.sub_path, ".def.in");
227
228 const target = comp.getTarget();
229
230 // Use the global cache directory.
231 var cache: Cache = .{
232 .gpa = gpa,
233 .io = io,
234 .manifest_dir = try comp.dirs.global_cache.handle.createDirPathOpen(io, "h", .{}),
235 .cwd = comp.dirs.cwd,
236 };
237 cache.addPrefix(.{ .path = null, .handle = Io.Dir.cwd() });
238 cache.addPrefix(comp.dirs.zig_lib);
239 cache.addPrefix(comp.dirs.global_cache);
240 defer cache.manifest_dir.close(io);
241
242 cache.hash.addBytes(build_options.version);
243 cache.hash.addOptionalBytes(comp.dirs.zig_lib.path);
244 cache.hash.add(target.cpu.arch);
245
246 var man = cache.obtain();
247 defer man.deinit();
248
249 _ = try man.addFilePath(def_file_path, null);
250
251 const final_lib_basename = try std.fmt.allocPrint(gpa, "{s}.lib", .{lib_name});
252 errdefer gpa.free(final_lib_basename);
253
254 const is_hit = man.hit(prog_node) catch |err| switch (err) {
255 error.CacheCheckFailed => switch (man.diagnostic) {
256 .none => unreachable,
257 .manifest_create, .manifest_read, .manifest_lock => |e| {
258 comp.setMiscFailure(.windows_import_lib, "checking cache failed: {t} {t}", .{ man.diagnostic, e });
259 return error.AlreadyReported;
260 },
261 .file_open, .file_stat, .file_read, .file_hash => |op| {
262 const pp = man.files.keys()[op.file_index].prefixed_path;
263 const prefix = man.cache.prefixes()[pp.prefix];
264 comp.setMiscFailure(.windows_import_lib, "checking cache failed: {f}{s} {t} {t}", .{
265 prefix, pp.sub_path, man.diagnostic, op.err,
266 });
267 return error.AlreadyReported;
268 },
269 },
270 error.OutOfMemory, error.Canceled => |e| return e,
271 error.InvalidFormat => {
272 comp.setMiscFailure(.windows_import_lib, "checking cache failed: invalid manifest file format", .{});
273 return error.AlreadyReported;
274 },
275 };
276 if (is_hit) {
277 const digest = man.final();
278 const sub_path = try std.fs.path.join(gpa, &.{ "o", &digest, final_lib_basename });
279 errdefer gpa.free(sub_path);
280
281 comp.mutex.lockUncancelable(io);
282 defer comp.mutex.unlock(io);
283 try comp.crt_files.ensureUnusedCapacity(gpa, 1);
284
285 const crt_file_path: Cache.Path = .{
286 .root_dir = comp.dirs.global_cache,
287 .sub_path = sub_path,
288 };
289 comp.crt_files.putAssumeCapacityNoClobber(final_lib_basename, .{
290 .full_object_path = crt_file_path,
291 .lock = man.toOwnedLock(),
292 });
293 return crt_file_path;
294 }
295
296 const digest = man.final();
297 const o_sub_path = try std.fs.path.join(arena, &[_][]const u8{ "o", &digest });
298 var o_dir = try comp.dirs.global_cache.handle.createDirPathOpen(io, o_sub_path, .{});
299 defer o_dir.close(io);
300
301 const sep = path.sep_str;
302 const include_dir: Cache.Path = .{
303 .root_dir = comp.dirs.zig_lib,
304 .sub_path = "libc" ++ sep ++ "mingw" ++ sep ++ "def-include",
305 };
306
307 const members = members: {
308 const members_node = sub_node.start("Members", 0);
309 defer members_node.end();
310
311 const input = switch (def_needs_preprocessing) {
312 true => pp: {
313 var aw: Io.Writer.Allocating = .init(gpa);
314 errdefer aw.deinit();
315
316 var pp_arena = std.heap.ArenaAllocator.init(gpa);
317 defer pp_arena.deinit();
318 var pp: Preprocessor = .{
319 .io = io,
320 .arena = pp_arena.allocator(),
321 .include_dir = include_dir,
322 .target = target,
323 };
324 try pp.preprocess(def_file_path);
325 try pp.prettyPrintTokens(&aw.writer);
326
327 break :pp try aw.toOwnedSliceSentinel(0);
328 },
329 false => try def_file_path.root_dir.handle.readFileAllocOptions(io, def_file_path.sub_path, gpa, .unlimited, .of(u8), 0),
330 };
331 defer gpa.free(input);
332
333 const machine_type = target.toCoffMachine();
334 var def_diagnostics: def.Diagnostics = undefined;
335 var module_def = def.parse(gpa, input, machine_type, .mingw, &def_diagnostics) catch |err| switch (err) {
336 error.OutOfMemory => |e| return e,
337 error.ParseError => {
338 var buffer: [64]u8 = undefined;
339 const stderr = try io.lockStderr(&buffer, null);
340 defer io.unlockStderr();
341 const w = &stderr.file_writer.interface;
342 try w.writeAll("error: ");
343 try def_diagnostics.writeMsg(w, input);
344 try w.writeByte('\n');
345 return error.WritingImportLibFailed;
346 },
347 };
348 defer module_def.deinit();
349
350 module_def.fixupForImportLibraryGeneration(machine_type);
351
352 break :members try implib.getMembers(gpa, module_def, machine_type);
353 };
354 defer members.deinit();
355
356 const lib_final_path = try std.fs.path.join(gpa, &.{ "o", &digest, final_lib_basename });
357 errdefer gpa.free(lib_final_path);
358
359 {
360 const lib_final_file = try o_dir.createFile(io, final_lib_basename, .{ .truncate = true });
361 defer lib_final_file.close(io);
362 var buffer: [1024]u8 = undefined;
363 var file_writer = lib_final_file.writer(io, &buffer);
364 try implib.writeCoffArchive(gpa, &file_writer.interface, members);
365 try file_writer.interface.flush();
366 }
367
368 man.writeManifest() catch |err| {
369 log.warn("failed to write cache manifest for DLL import {s}.lib: {s}", .{ lib_name, @errorName(err) });
370 };
371
372 comp.mutex.lockUncancelable(io);
373 defer comp.mutex.unlock(io);
374 const crt_file_path: Cache.Path = .{
375 .root_dir = comp.dirs.global_cache,
376 .sub_path = lib_final_path,
377 };
378 try comp.crt_files.putNoClobber(gpa, final_lib_basename, .{
379 .full_object_path = crt_file_path,
380 .lock = man.toOwnedLock(),
381 });
382 return crt_file_path;
383}
384
385pub fn libExists(
386 allocator: Allocator,
387 io: Io,
388 target: *const std.Target,
389 zig_lib_directory: Cache.Directory,
390 lib_name: []const u8,
391) !bool {
392 const s = findDef(allocator, io, target, zig_lib_directory, lib_name) catch |err| switch (err) {
393 error.FileNotFound => return false,
394 else => |e| return e,
395 };
396 defer allocator.free(s);
397 return true;
398}
399
400/// This function body is verbose but all it does is test 3 different paths and
401/// see if a .def file exists.
402fn findDef(
403 gpa: Allocator,
404 io: Io,
405 target: *const std.Target,
406 zig_lib_directory: Cache.Directory,
407 lib_name: []const u8,
408) ![]u8 {
409 const lib_path = switch (target.cpu.arch) {
410 .thumb => "libarm32",
411 .aarch64 => "libarm64",
412 .x86 => "lib32",
413 .x86_64 => "lib64",
414 else => unreachable,
415 };
416
417 var override_path: std.ArrayList(u8) = .empty;
418 defer override_path.deinit(gpa);
419
420 const s = path.sep_str;
421
422 {
423 // Try the archtecture-specific path first.
424 override_path.shrinkRetainingCapacity(0);
425 try override_path.print(gpa, "libc" ++ s ++ "mingw" ++ s ++ "{s}" ++ s ++ "{s}.def", .{ lib_path, lib_name });
426 if (zig_lib_directory.handle.access(io, override_path.items, .{})) |_| {
427 return override_path.toOwnedSlice(gpa);
428 } else |err| switch (err) {
429 error.FileNotFound => {},
430 else => |e| return e,
431 }
432 }
433
434 {
435 // Try the generic version.
436 override_path.shrinkRetainingCapacity(0);
437 try override_path.print(gpa, "libc" ++ s ++ "mingw" ++ s ++ "lib-common" ++ s ++ "{s}.def", .{lib_name});
438 if (zig_lib_directory.handle.access(io, override_path.items, .{})) |_| {
439 return override_path.toOwnedSlice(gpa);
440 } else |err| switch (err) {
441 error.FileNotFound => {},
442 else => |e| return e,
443 }
444 }
445
446 {
447 // Try the generic version and preprocess it.
448 override_path.shrinkRetainingCapacity(0);
449 try override_path.print(gpa, "libc" ++ s ++ "mingw" ++ s ++ "lib-common" ++ s ++ "{s}.def.in", .{lib_name});
450 if (zig_lib_directory.handle.access(io, override_path.items, .{})) |_| {
451 return override_path.toOwnedSlice(gpa);
452 } else |err| switch (err) {
453 error.FileNotFound => {},
454 else => |e| return e,
455 }
456 }
457
458 return error.FileNotFound;
459}
460
461const mingw32_generic_src = [_][]const u8{
462 // mingw32
463 "crt" ++ path.sep_str ++ "crtexewin.c",
464 "crt" ++ path.sep_str ++ "dll_argv.c",
465 "crt" ++ path.sep_str ++ "gccmain.c",
466 "crt" ++ path.sep_str ++ "natstart.c",
467 "crt" ++ path.sep_str ++ "pseudo-reloc-list.c",
468 "crt" ++ path.sep_str ++ "wildcard.c",
469 "crt" ++ path.sep_str ++ "charmax.c",
470 "crt" ++ path.sep_str ++ "ucrtexewin.c",
471 "crt" ++ path.sep_str ++ "dllargv.c",
472 "crt" ++ path.sep_str ++ "_newmode.c",
473 "crt" ++ path.sep_str ++ "tlssup.c",
474 "crt" ++ path.sep_str ++ "xncommod.c",
475 "crt" ++ path.sep_str ++ "cinitexe.c",
476 "crt" ++ path.sep_str ++ "merr.c",
477 "crt" ++ path.sep_str ++ "usermatherr.c",
478 "crt" ++ path.sep_str ++ "pesect.c",
479 "crt" ++ path.sep_str ++ "udllargc.c",
480 "crt" ++ path.sep_str ++ "xthdloc.c",
481 "crt" ++ path.sep_str ++ "mingw_helpers.c",
482 "crt" ++ path.sep_str ++ "pseudo-reloc.c",
483 "crt" ++ path.sep_str ++ "udll_argv.c",
484 "crt" ++ path.sep_str ++ "xtxtmode.c",
485 "crt" ++ path.sep_str ++ "crt_handler.c",
486 "crt" ++ path.sep_str ++ "tlsthrd.c",
487 "crt" ++ path.sep_str ++ "tlsmthread.c",
488 "crt" ++ path.sep_str ++ "tlsmcrt.c",
489 "crt" ++ path.sep_str ++ "cxa_atexit.c",
490 "crt" ++ path.sep_str ++ "cxa_thread_atexit.c",
491 "crt" ++ path.sep_str ++ "tls_atexit.c",
492 "intrincs" ++ path.sep_str ++ "RtlSecureZeroMemory.c",
493 // mingwex
494 "cfguard" ++ path.sep_str ++ "mingw_cfguard_support.c",
495 "complex" ++ path.sep_str ++ "_cabs.c",
496 "gdtoa" ++ path.sep_str ++ "arithchk.c",
497 "gdtoa" ++ path.sep_str ++ "dmisc.c",
498 "gdtoa" ++ path.sep_str ++ "dtoa.c",
499 "gdtoa" ++ path.sep_str ++ "g__fmt.c",
500 "gdtoa" ++ path.sep_str ++ "g_dfmt.c",
501 "gdtoa" ++ path.sep_str ++ "g_ffmt.c",
502 "gdtoa" ++ path.sep_str ++ "g_xfmt.c",
503 "gdtoa" ++ path.sep_str ++ "gdtoa.c",
504 "gdtoa" ++ path.sep_str ++ "gethex.c",
505 "gdtoa" ++ path.sep_str ++ "gmisc.c",
506 "gdtoa" ++ path.sep_str ++ "hd_init.c",
507 "gdtoa" ++ path.sep_str ++ "hexnan.c",
508 "gdtoa" ++ path.sep_str ++ "misc.c",
509 "gdtoa" ++ path.sep_str ++ "qnan.c",
510 "gdtoa" ++ path.sep_str ++ "smisc.c",
511 "gdtoa" ++ path.sep_str ++ "strtodg.c",
512 "gdtoa" ++ path.sep_str ++ "strtodnrp.c",
513 "gdtoa" ++ path.sep_str ++ "strtof.c",
514 "gdtoa" ++ path.sep_str ++ "strtopx.c",
515 "gdtoa" ++ path.sep_str ++ "sum.c",
516 "gdtoa" ++ path.sep_str ++ "ulp.c",
517 "math" ++ path.sep_str ++ "acospi.c",
518 "math" ++ path.sep_str ++ "acospif.c",
519 "math" ++ path.sep_str ++ "acospil.c",
520 "math" ++ path.sep_str ++ "asinpi.c",
521 "math" ++ path.sep_str ++ "asinpif.c",
522 "math" ++ path.sep_str ++ "asinpil.c",
523 "math" ++ path.sep_str ++ "atanpi.c",
524 "math" ++ path.sep_str ++ "atanpif.c",
525 "math" ++ path.sep_str ++ "atanpil.c",
526 "math" ++ path.sep_str ++ "atan2pi.c",
527 "math" ++ path.sep_str ++ "atan2pif.c",
528 "math" ++ path.sep_str ++ "atan2pil.c",
529 "math" ++ path.sep_str ++ "coshl.c",
530 "math" ++ path.sep_str ++ "cospi.c",
531 "math" ++ path.sep_str ++ "cospif.c",
532 "math" ++ path.sep_str ++ "cospil.c",
533 "math" ++ path.sep_str ++ "fpclassify.c",
534 "math" ++ path.sep_str ++ "fpclassifyf.c",
535 "math" ++ path.sep_str ++ "fpclassifyl.c",
536 "math" ++ path.sep_str ++ "ldexpf.c",
537 "math" ++ path.sep_str ++ "lgamma.c",
538 "math" ++ path.sep_str ++ "lgammaf.c",
539 "math" ++ path.sep_str ++ "lgammal.c",
540 "math" ++ path.sep_str ++ "powi.c",
541 "math" ++ path.sep_str ++ "powif.c",
542 "math" ++ path.sep_str ++ "powil.c",
543 "math" ++ path.sep_str ++ "signbit.c",
544 "math" ++ path.sep_str ++ "signbitf.c",
545 "math" ++ path.sep_str ++ "signbitl.c",
546 "math" ++ path.sep_str ++ "signgam.c",
547 "math" ++ path.sep_str ++ "sinhl.c",
548 "math" ++ path.sep_str ++ "sinpi.c",
549 "math" ++ path.sep_str ++ "sinpif.c",
550 "math" ++ path.sep_str ++ "sinpil.c",
551 "math" ++ path.sep_str ++ "tanhl.c",
552 "math" ++ path.sep_str ++ "tanpi.c",
553 "math" ++ path.sep_str ++ "tanpif.c",
554 "math" ++ path.sep_str ++ "tanpil.c",
555 "misc" ++ path.sep_str ++ "__mingw_filename_cp.c",
556 "misc" ++ path.sep_str ++ "__mingw_isleadbyte_cp.c",
557 "misc" ++ path.sep_str ++ "_assert.c",
558 "misc" ++ path.sep_str ++ "alarm.c",
559 "misc" ++ path.sep_str ++ "btowc.c",
560 "misc" ++ path.sep_str ++ "delay-f.c",
561 "misc" ++ path.sep_str ++ "delay-n.c",
562 "misc" ++ path.sep_str ++ "delayimp.c",
563 "misc" ++ path.sep_str ++ "dirent.c",
564 "misc" ++ path.sep_str ++ "dirname.c",
565 "misc" ++ path.sep_str ++ "dllmain.c",
566 "misc" ++ path.sep_str ++ "feclearexcept.c",
567 "misc" ++ path.sep_str ++ "fedisableexcept.c",
568 "misc" ++ path.sep_str ++ "feenableexcept.c",
569 "misc" ++ path.sep_str ++ "fegetenv.c",
570 "misc" ++ path.sep_str ++ "fegetexcept.c",
571 "misc" ++ path.sep_str ++ "fegetexceptflag.c",
572 "misc" ++ path.sep_str ++ "fegetround.c",
573 "misc" ++ path.sep_str ++ "feholdexcept.c",
574 "misc" ++ path.sep_str ++ "feraiseexcept.c",
575 "misc" ++ path.sep_str ++ "fesetenv.c",
576 "misc" ++ path.sep_str ++ "fesetexceptflag.c",
577 "misc" ++ path.sep_str ++ "fesetround.c",
578 "misc" ++ path.sep_str ++ "fetestexcept.c",
579 "misc" ++ path.sep_str ++ "mingw_controlfp.c",
580 "misc" ++ path.sep_str ++ "mingw_setfp.c",
581 "misc" ++ path.sep_str ++ "feupdateenv.c",
582 "misc" ++ path.sep_str ++ "ftime32.c",
583 "misc" ++ path.sep_str ++ "ftime64.c",
584 "misc" ++ path.sep_str ++ "ftw32.c",
585 "misc" ++ path.sep_str ++ "ftw32i64.c",
586 "misc" ++ path.sep_str ++ "ftw64.c",
587 "misc" ++ path.sep_str ++ "ftw64i32.c",
588 "misc" ++ path.sep_str ++ "fwide.c",
589 "misc" ++ path.sep_str ++ "getlogin.c",
590 "misc" ++ path.sep_str ++ "getopt.c",
591 "misc" ++ path.sep_str ++ "gettimeofday.c",
592 "misc" ++ path.sep_str ++ "memalignment.c",
593 "misc" ++ path.sep_str ++ "memset_explicit.c",
594 "misc" ++ path.sep_str ++ "mingw-access.c",
595 "misc" ++ path.sep_str ++ "mingw-aligned-malloc.c",
596 "misc" ++ path.sep_str ++ "mingw_getsp.S",
597 "misc" ++ path.sep_str ++ "mingw_longjmp.S",
598 "misc" ++ path.sep_str ++ "mingw_matherr.c",
599 "misc" ++ path.sep_str ++ "mingw_mbwc_convert.c",
600 "misc" ++ path.sep_str ++ "mingw_usleep.c",
601 "misc" ++ path.sep_str ++ "mingw_wcstod.c",
602 "misc" ++ path.sep_str ++ "mingw_wcstof.c",
603 "misc" ++ path.sep_str ++ "mingw_wcstold.c",
604 "misc" ++ path.sep_str ++ "mkdtemp.c",
605 "misc" ++ path.sep_str ++ "mkstemp.c",
606 "misc" ++ path.sep_str ++ "sleep.c",
607 "misc" ++ path.sep_str ++ "strsafe.c",
608 "misc" ++ path.sep_str ++ "tdelete.c",
609 "misc" ++ path.sep_str ++ "tdestroy.c",
610 "misc" ++ path.sep_str ++ "tfind.c",
611 "misc" ++ path.sep_str ++ "tsearch.c",
612 "misc" ++ path.sep_str ++ "twalk.c",
613 "misc" ++ path.sep_str ++ "wctob.c",
614 "misc" ++ path.sep_str ++ "wdirent.c",
615 "stdio" ++ path.sep_str ++ "__mingw_fix_fstat_finish.c",
616 "stdio" ++ path.sep_str ++ "__mingw_fix_stat_fallback_fd.c",
617 "stdio" ++ path.sep_str ++ "__mingw_fix_stat_finish.c",
618 "stdio" ++ path.sep_str ++ "__mingw_fix_stat_path.c",
619 "stdio" ++ path.sep_str ++ "__mingw_fix_wstat_fallback_fd.c",
620 "stdio" ++ path.sep_str ++ "__mingw_fix_wstat_path.c",
621 "stdio" ++ path.sep_str ++ "asprintf.c",
622 "stdio" ++ path.sep_str ++ "lltoa.c",
623 "stdio" ++ path.sep_str ++ "lltow.c",
624 "stdio" ++ path.sep_str ++ "mingw_asprintf.c",
625 "stdio" ++ path.sep_str ++ "mingw_fprintf.c",
626 "stdio" ++ path.sep_str ++ "mingw_fwprintf.c",
627 "stdio" ++ path.sep_str ++ "mingw_fscanf.c",
628 "stdio" ++ path.sep_str ++ "mingw_ftruncate64.c",
629 "stdio" ++ path.sep_str ++ "mingw_fwscanf.c",
630 "stdio" ++ path.sep_str ++ "mingw_pformat.c",
631 "stdio" ++ path.sep_str ++ "mingw_sformat.c",
632 "stdio" ++ path.sep_str ++ "mingw_swformat.c",
633 "stdio" ++ path.sep_str ++ "mingw_wpformat.c",
634 "stdio" ++ path.sep_str ++ "mingw_printf.c",
635 "stdio" ++ path.sep_str ++ "mingw_wprintf.c",
636 "stdio" ++ path.sep_str ++ "mingw_scanf.c",
637 "stdio" ++ path.sep_str ++ "mingw_snprintf.c",
638 "stdio" ++ path.sep_str ++ "mingw_snwprintf.c",
639 "stdio" ++ path.sep_str ++ "mingw_sprintf.c",
640 "stdio" ++ path.sep_str ++ "mingw_swprintf.c",
641 "stdio" ++ path.sep_str ++ "mingw_sscanf.c",
642 "stdio" ++ path.sep_str ++ "mingw_swscanf.c",
643 "stdio" ++ path.sep_str ++ "mingw_vasprintf.c",
644 "stdio" ++ path.sep_str ++ "mingw_vfprintf.c",
645 "stdio" ++ path.sep_str ++ "mingw_vfwprintf.c",
646 "stdio" ++ path.sep_str ++ "mingw_vfscanf.c",
647 "stdio" ++ path.sep_str ++ "mingw_vprintf.c",
648 "stdio" ++ path.sep_str ++ "mingw_vsscanf.c",
649 "stdio" ++ path.sep_str ++ "mingw_vwprintf.c",
650 "stdio" ++ path.sep_str ++ "mingw_vsnprintf.c",
651 "stdio" ++ path.sep_str ++ "mingw_vsnwprintf.c",
652 "stdio" ++ path.sep_str ++ "mingw_vsprintf.c",
653 "stdio" ++ path.sep_str ++ "mingw_vswprintf.c",
654 "stdio" ++ path.sep_str ++ "mingw_wscanf.c",
655 "stdio" ++ path.sep_str ++ "mingw_vfwscanf.c",
656 "stdio" ++ path.sep_str ++ "mingw_vswscanf.c",
657 "stdio" ++ path.sep_str ++ "snprintf.c",
658 "stdio" ++ path.sep_str ++ "snwprintf.c",
659 "stdio" ++ path.sep_str ++ "truncate.c",
660 "stdio" ++ path.sep_str ++ "truncate64.c",
661 "stdio" ++ path.sep_str ++ "ulltoa.c",
662 "stdio" ++ path.sep_str ++ "ulltow.c",
663 "stdio" ++ path.sep_str ++ "vasprintf.c",
664 "stdio" ++ path.sep_str ++ "vsnprintf.c",
665 "stdio" ++ path.sep_str ++ "vsnwprintf.c",
666 "stdio" ++ path.sep_str ++ "wtoll.c",
667 // mingwthrd
668 "libsrc" ++ path.sep_str ++ "mingwthrd_mt.c",
669 // ucrtbase
670 "ctype" ++ path.sep_str ++ "_iscsym_l.c",
671 "ctype" ++ path.sep_str ++ "_iscsymf_l.c",
672 "ctype" ++ path.sep_str ++ "iswctype.c",
673 "ctype" ++ path.sep_str ++ "towctrans.c",
674 "math" ++ path.sep_str ++ "_huge.c",
675 "misc" ++ path.sep_str ++ "__initenv.c",
676 "misc" ++ path.sep_str ++ "__winitenv.c",
677 "misc" ++ path.sep_str ++ "__p___initenv.c",
678 "misc" ++ path.sep_str ++ "__p___winitenv.c",
679 "misc" ++ path.sep_str ++ "_onexit.c",
680 "misc" ++ path.sep_str ++ "ucrt-access.c",
681 "misc" ++ path.sep_str ++ "ucrt__getmainargs.c",
682 "misc" ++ path.sep_str ++ "ucrt__wgetmainargs.c",
683 "misc" ++ path.sep_str ++ "ucrt_amsg_exit.c",
684 "misc" ++ path.sep_str ++ "ucrt_at_quick_exit.c",
685 "misc" ++ path.sep_str ++ "ucrt_mbsinit.c",
686 "misc" ++ path.sep_str ++ "ucrt_tzset.c",
687 "stdio" ++ path.sep_str ++ "msvcr80plus_ftruncate64.c",
688 "stdio" ++ path.sep_str ++ "ucrt__scprintf.c",
689 "stdio" ++ path.sep_str ++ "ucrt__scwprintf.c",
690 "stdio" ++ path.sep_str ++ "ucrt__snprintf.c",
691 "stdio" ++ path.sep_str ++ "ucrt__snscanf.c",
692 "stdio" ++ path.sep_str ++ "ucrt__snwprintf.c",
693 "stdio" ++ path.sep_str ++ "ucrt__swprintf.c",
694 "stdio" ++ path.sep_str ++ "ucrt__vscprintf.c",
695 "stdio" ++ path.sep_str ++ "ucrt__vscwprintf.c",
696 "stdio" ++ path.sep_str ++ "ucrt__vsnprintf.c",
697 "stdio" ++ path.sep_str ++ "ucrt__vsnwprintf.c",
698 "stdio" ++ path.sep_str ++ "ucrt__vswprintf.c",
699 "stdio" ++ path.sep_str ++ "ucrt___local_stdio_printf_options.c",
700 "stdio" ++ path.sep_str ++ "ucrt___local_stdio_scanf_options.c",
701 "stdio" ++ path.sep_str ++ "ucrt_fprintf.c",
702 "stdio" ++ path.sep_str ++ "ucrt_fscanf.c",
703 "stdio" ++ path.sep_str ++ "ucrt_fwprintf.c",
704 "stdio" ++ path.sep_str ++ "ucrt_fwscanf.c",
705 "stdio" ++ path.sep_str ++ "ucrt_ms_fwprintf.c",
706 "stdio" ++ path.sep_str ++ "ucrt_printf.c",
707 "stdio" ++ path.sep_str ++ "ucrt_scanf.c",
708 "stdio" ++ path.sep_str ++ "ucrt_snprintf.c",
709 "stdio" ++ path.sep_str ++ "ucrt_snwprintf.c",
710 "stdio" ++ path.sep_str ++ "ucrt_sprintf.c",
711 "stdio" ++ path.sep_str ++ "ucrt_sscanf.c",
712 "stdio" ++ path.sep_str ++ "ucrt_swscanf.c",
713 "stdio" ++ path.sep_str ++ "ucrt_swprintf.c",
714 "stdio" ++ path.sep_str ++ "ucrt_vfprintf.c",
715 "stdio" ++ path.sep_str ++ "ucrt_vfscanf.c",
716 "stdio" ++ path.sep_str ++ "ucrt_vfwscanf.c",
717 "stdio" ++ path.sep_str ++ "ucrt_vfwprintf.c",
718 "stdio" ++ path.sep_str ++ "ucrt_vprintf.c",
719 "stdio" ++ path.sep_str ++ "ucrt_vscanf.c",
720 "stdio" ++ path.sep_str ++ "ucrt_vsnprintf.c",
721 "stdio" ++ path.sep_str ++ "ucrt_vsnwprintf.c",
722 "stdio" ++ path.sep_str ++ "ucrt_vsprintf.c",
723 "stdio" ++ path.sep_str ++ "ucrt_vswprintf.c",
724 "stdio" ++ path.sep_str ++ "ucrt_vsscanf.c",
725 "stdio" ++ path.sep_str ++ "ucrt_vwscanf.c",
726 "stdio" ++ path.sep_str ++ "ucrt_wscanf.c",
727 "stdio" ++ path.sep_str ++ "ucrt_vwprintf.c",
728 "stdio" ++ path.sep_str ++ "ucrt_wprintf.c",
729 "string" ++ path.sep_str ++ "ucrt__wcstok.c",
730 // uuid
731 "libsrc" ++ path.sep_str ++ "atsmedia-uuid.c",
732 "libsrc" ++ path.sep_str ++ "bth-uuid.c",
733 "libsrc" ++ path.sep_str ++ "cguid-uuid.c",
734 "libsrc" ++ path.sep_str ++ "comcat-uuid.c",
735 "libsrc" ++ path.sep_str ++ "ctxtcall-uuid.c",
736 "libsrc" ++ path.sep_str ++ "devguid.c",
737 "libsrc" ++ path.sep_str ++ "docobj-uuid.c",
738 "libsrc" ++ path.sep_str ++ "dxva-uuid.c",
739 "libsrc" ++ path.sep_str ++ "exdisp-uuid.c",
740 "libsrc" ++ path.sep_str ++ "extras-uuid.c",
741 "libsrc" ++ path.sep_str ++ "fwp-uuid.c",
742 "libsrc" ++ path.sep_str ++ "guid_nul.c",
743 "libsrc" ++ path.sep_str ++ "hlguids-uuid.c",
744 "libsrc" ++ path.sep_str ++ "hlink-uuid.c",
745 "libsrc" ++ path.sep_str ++ "mlang-uuid.c",
746 "libsrc" ++ path.sep_str ++ "msctf-uuid.c",
747 "libsrc" ++ path.sep_str ++ "mshtmhst-uuid.c",
748 "libsrc" ++ path.sep_str ++ "mshtml-uuid.c",
749 "libsrc" ++ path.sep_str ++ "msxml-uuid.c",
750 "libsrc" ++ path.sep_str ++ "netcfg-uuid.c",
751 "libsrc" ++ path.sep_str ++ "netcon-uuid.c",
752 "libsrc" ++ path.sep_str ++ "ntddkbd-uuid.c",
753 "libsrc" ++ path.sep_str ++ "ntddmou-uuid.c",
754 "libsrc" ++ path.sep_str ++ "ntddpar-uuid.c",
755 "libsrc" ++ path.sep_str ++ "ntddscsi-uuid.c",
756 "libsrc" ++ path.sep_str ++ "ntddser-uuid.c",
757 "libsrc" ++ path.sep_str ++ "ntddstor-uuid.c",
758 "libsrc" ++ path.sep_str ++ "ntddvdeo-uuid.c",
759 "libsrc" ++ path.sep_str ++ "oaidl-uuid.c",
760 "libsrc" ++ path.sep_str ++ "objidl-uuid.c",
761 "libsrc" ++ path.sep_str ++ "objsafe-uuid.c",
762 "libsrc" ++ path.sep_str ++ "ocidl-uuid.c",
763 "libsrc" ++ path.sep_str ++ "oleacc-uuid.c",
764 "libsrc" ++ path.sep_str ++ "olectlid-uuid.c",
765 "libsrc" ++ path.sep_str ++ "oleidl-uuid.c",
766 "libsrc" ++ path.sep_str ++ "power-uuid.c",
767 "libsrc" ++ path.sep_str ++ "powrprof-uuid.c",
768 "libsrc" ++ path.sep_str ++ "uianimation-uuid.c",
769 "libsrc" ++ path.sep_str ++ "usbcamdi-uuid.c",
770 "libsrc" ++ path.sep_str ++ "usbiodef-uuid.c",
771 "libsrc" ++ path.sep_str ++ "uuid.c",
772 "libsrc" ++ path.sep_str ++ "vds-uuid.c",
773 "libsrc" ++ path.sep_str ++ "virtdisk-uuid.c",
774 "libsrc" ++ path.sep_str ++ "vss-uuid.c",
775 "libsrc" ++ path.sep_str ++ "wia-uuid.c",
776 "libsrc" ++ path.sep_str ++ "windowscodecs.c",
777 // ws2_32
778 "libsrc" ++ path.sep_str ++ "ws2_32.c",
779 "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "in6_addr_equal.c",
780 "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "in6addr_isany.c",
781 "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "in6addr_isloopback.c",
782 "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "in6addr_setany.c",
783 "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "in6addr_setloopback.c",
784 "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "in6_is_addr_linklocal.c",
785 "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "in6_is_addr_loopback.c",
786 "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "in6_is_addr_mc_global.c",
787 "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "in6_is_addr_mc_linklocal.c",
788 "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "in6_is_addr_mc_nodelocal.c",
789 "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "in6_is_addr_mc_orglocal.c",
790 "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "in6_is_addr_mc_sitelocal.c",
791 "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "in6_is_addr_multicast.c",
792 "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "in6_is_addr_sitelocal.c",
793 "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "in6_is_addr_unspecified.c",
794 "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "in6_is_addr_v4compat.c",
795 "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "in6_is_addr_v4mapped.c",
796 "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "in6_set_addr_loopback.c",
797 "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "in6_set_addr_unspecified.c",
798 "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "gai_strerrorA.c",
799 "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "gai_strerrorW.c",
800 "libsrc" ++ path.sep_str ++ "wspiapi" ++ path.sep_str ++ "WspiapiStrdup.c",
801 "libsrc" ++ path.sep_str ++ "wspiapi" ++ path.sep_str ++ "WspiapiParseV4Address.c",
802 "libsrc" ++ path.sep_str ++ "wspiapi" ++ path.sep_str ++ "WspiapiNewAddrInfo.c",
803 "libsrc" ++ path.sep_str ++ "wspiapi" ++ path.sep_str ++ "WspiapiQueryDNS.c",
804 "libsrc" ++ path.sep_str ++ "wspiapi" ++ path.sep_str ++ "WspiapiLookupNode.c",
805 "libsrc" ++ path.sep_str ++ "wspiapi" ++ path.sep_str ++ "WspiapiClone.c",
806 "libsrc" ++ path.sep_str ++ "wspiapi" ++ path.sep_str ++ "WspiapiLegacyFreeAddrInfo.c",
807 "libsrc" ++ path.sep_str ++ "wspiapi" ++ path.sep_str ++ "WspiapiLegacyGetAddrInfo.c",
808 "libsrc" ++ path.sep_str ++ "wspiapi" ++ path.sep_str ++ "WspiapiLegacyGetNameInfo.c",
809 "libsrc" ++ path.sep_str ++ "wspiapi" ++ path.sep_str ++ "WspiapiLoad.c",
810 "libsrc" ++ path.sep_str ++ "wspiapi" ++ path.sep_str ++ "WspiapiGetAddrInfo.c",
811 "libsrc" ++ path.sep_str ++ "wspiapi" ++ path.sep_str ++ "WspiapiGetNameInfo.c",
812 "libsrc" ++ path.sep_str ++ "wspiapi" ++ path.sep_str ++ "WspiapiFreeAddrInfo.c",
813 // dinput
814 "libsrc" ++ path.sep_str ++ "dinput_kbd.c",
815 "libsrc" ++ path.sep_str ++ "dinput_joy.c",
816 "libsrc" ++ path.sep_str ++ "dinput_joy2.c",
817 "libsrc" ++ path.sep_str ++ "dinput_mouse.c",
818 "libsrc" ++ path.sep_str ++ "dinput_mouse2.c",
819 // dloadhelper
820 "libsrc" ++ path.sep_str ++ "dloadhelper.c",
821 "misc" ++ path.sep_str ++ "delay-f.c",
822 // misc.
823 "libsrc" ++ path.sep_str ++ "bits.c",
824 "libsrc" ++ path.sep_str ++ "shell32.c",
825 "libsrc" ++ path.sep_str ++ "dmoguids.c",
826 "libsrc" ++ path.sep_str ++ "dxerr8.c",
827 "libsrc" ++ path.sep_str ++ "dxerr8w.c",
828 "libsrc" ++ path.sep_str ++ "dxerr9.c",
829 "libsrc" ++ path.sep_str ++ "dxerr9w.c",
830 "libsrc" ++ path.sep_str ++ "mfuuid.c",
831 "libsrc" ++ path.sep_str ++ "msxml2.c",
832 "libsrc" ++ path.sep_str ++ "msxml6.c",
833 "libsrc" ++ path.sep_str ++ "amstrmid.c",
834 "libsrc" ++ path.sep_str ++ "wbemuuid.c",
835 "libsrc" ++ path.sep_str ++ "wmcodecdspuuid.c",
836 "libsrc" ++ path.sep_str ++ "windowscodecs.c",
837 "libsrc" ++ path.sep_str ++ "dxguid.c",
838 "libsrc" ++ path.sep_str ++ "ksuser.c",
839 "libsrc" ++ path.sep_str ++ "largeint.c",
840 "libsrc" ++ path.sep_str ++ "locationapi.c",
841 "libsrc" ++ path.sep_str ++ "sapi.c",
842 "libsrc" ++ path.sep_str ++ "sensorsapi.c",
843 "libsrc" ++ path.sep_str ++ "portabledeviceguids.c",
844 "libsrc" ++ path.sep_str ++ "taskschd.c",
845 "libsrc" ++ path.sep_str ++ "strmiids.c",
846 "libsrc" ++ path.sep_str ++ "gdiplus.c",
847 "libsrc" ++ path.sep_str ++ "activeds-uuid.c",
848};
849
850const mingw32_x86_src = [_][]const u8{
851 // mingw32
852 "crt" ++ path.sep_str ++ "CRT_fp10.c",
853 // mingwex
854 "complex" ++ path.sep_str ++ "cabsl.c",
855 "complex" ++ path.sep_str ++ "cacosl.c",
856 "complex" ++ path.sep_str ++ "cargl.c",
857 "complex" ++ path.sep_str ++ "casinl.c",
858 "complex" ++ path.sep_str ++ "catanl.c",
859 "complex" ++ path.sep_str ++ "ccosl.c",
860 "complex" ++ path.sep_str ++ "cexpl.c",
861 "complex" ++ path.sep_str ++ "cimagl.c",
862 "complex" ++ path.sep_str ++ "clog10l.c",
863 "complex" ++ path.sep_str ++ "clogl.c",
864 "complex" ++ path.sep_str ++ "conjl.c",
865 "complex" ++ path.sep_str ++ "cpowl.c",
866 "complex" ++ path.sep_str ++ "cprojl.c",
867 "complex" ++ path.sep_str ++ "creall.c",
868 "complex" ++ path.sep_str ++ "csinl.c",
869 "complex" ++ path.sep_str ++ "csqrtl.c",
870 "complex" ++ path.sep_str ++ "ctanl.c",
871 "math" ++ path.sep_str ++ "cbrtl.c",
872 "math" ++ path.sep_str ++ "erfl.c",
873 "math" ++ path.sep_str ++ "fmal.c",
874 "math" ++ path.sep_str ++ "llrintl.c",
875 "math" ++ path.sep_str ++ "llroundl.c",
876 "math" ++ path.sep_str ++ "tgammal.c",
877 "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "_chgsignl.S",
878 "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "acoshl.c",
879 "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "acosl.c",
880 "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "asinhl.c",
881 "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "asinl.c",
882 "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "atan2l.c",
883 "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "atanhl.c",
884 "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "cossinl.c",
885 "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "exp2l.S",
886 "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "expl.c",
887 "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "expm1l.c",
888 "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "fucom.c",
889 "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "ilogbl.S",
890 "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "internal_logl.S",
891 "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "ldexpl.c",
892 "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "log10l.S",
893 "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "log1pl.S",
894 "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "log2l.S",
895 "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "logbl.c",
896 "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "logl.c",
897 "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "nearbyintl.S",
898 "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "powl.c",
899 "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "remainderl.S",
900 "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "remquol.S",
901 "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "scalbnl.S",
902 "misc" ++ path.sep_str ++ "wcstold.c",
903 // ucrtbase
904 "math" ++ path.sep_str ++ "nextafterl.c",
905 "math" ++ path.sep_str ++ "nexttoward.c",
906 "math" ++ path.sep_str ++ "nexttowardf.c",
907};
908
909const mingw32_x86_32_src = [_][]const u8{
910 // ucrtbase
911 "math" ++ path.sep_str ++ "powf.c",
912 "math" ++ path.sep_str ++ "sinhf.c",
913 "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "asinf.c",
914 "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "atan2f.c",
915};
916
917const mingw32_arm_src = [_][]const u8{
918 // mingwex
919 "math" ++ path.sep_str ++ "arm-common" ++ path.sep_str ++ "ldexpl.c",
920};
921
922const mingw32_winpthreads_src = [_][]const u8{
923 // winpthreads
924 "winpthreads" ++ path.sep_str ++ "barrier.c",
925 "winpthreads" ++ path.sep_str ++ "clock.c",
926 "winpthreads" ++ path.sep_str ++ "cond.c",
927 "winpthreads" ++ path.sep_str ++ "misc.c",
928 "winpthreads" ++ path.sep_str ++ "mutex.c",
929 "winpthreads" ++ path.sep_str ++ "nanosleep.c",
930 "winpthreads" ++ path.sep_str ++ "rwlock.c",
931 "winpthreads" ++ path.sep_str ++ "sched.c",
932 "winpthreads" ++ path.sep_str ++ "sem.c",
933 "winpthreads" ++ path.sep_str ++ "thread.c",
934};
935
936pub const always_link_libs = [_][]const u8{
937 "api-ms-win-crt-conio-l1-1-0",
938 "api-ms-win-crt-convert-l1-1-0",
939 "api-ms-win-crt-environment-l1-1-0",
940 "api-ms-win-crt-filesystem-l1-1-0",
941 "api-ms-win-crt-heap-l1-1-0",
942 "api-ms-win-crt-locale-l1-1-0",
943 "api-ms-win-crt-math-l1-1-0",
944 "api-ms-win-crt-multibyte-l1-1-0",
945 "api-ms-win-crt-private-l1-1-0",
946 "api-ms-win-crt-process-l1-1-0",
947 "api-ms-win-crt-runtime-l1-1-0",
948 "api-ms-win-crt-stdio-l1-1-0",
949 "api-ms-win-crt-string-l1-1-0",
950 "api-ms-win-crt-time-l1-1-0",
951 "api-ms-win-crt-utility-l1-1-0",
952 "advapi32",
953 "kernel32",
954 "ntdll",
955 "shell32",
956 "user32",
957};