zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

blob 2efc0fe4 (40747B) - Raw


      1 const std = @import("std");
      2 const Allocator = std.mem.Allocator;
      3 const mem = std.mem;
      4 const path = std.fs.path;
      5 const assert = std.debug.assert;
      6 const log = std.log.scoped(.mingw);
      7 
      8 const builtin = @import("builtin");
      9 const Compilation = @import("Compilation.zig");
     10 const build_options = @import("build_options");
     11 const Cache = std.Build.Cache;
     12 
     13 pub const CRTFile = enum {
     14     crt2_o,
     15     dllcrt2_o,
     16     mingwex_lib,
     17 };
     18 
     19 pub fn buildCRTFile(comp: *Compilation, crt_file: CRTFile, prog_node: *std.Progress.Node) !void {
     20     if (!build_options.have_llvm) {
     21         return error.ZigCompilerNotBuiltWithLLVMExtensions;
     22     }
     23     var arena_allocator = std.heap.ArenaAllocator.init(comp.gpa);
     24     defer arena_allocator.deinit();
     25     const arena = arena_allocator.allocator();
     26 
     27     switch (crt_file) {
     28         .crt2_o => {
     29             var args = std.ArrayList([]const u8).init(arena);
     30             try add_cc_args(comp, arena, &args);
     31             try args.appendSlice(&[_][]const u8{
     32                 // Prevents warning: 'used' attribute ignored on a non-definition declaration
     33                 // pointing at extern _CRTALLOC
     34                 "-Wno-ignored-attributes",
     35                 // Uncommenting this makes mingw-w64 look for wmain instead of main.
     36                 //"-DUNICODE",
     37                 //"-D_UNICODE",
     38             });
     39             var files = [_]Compilation.CSourceFile{
     40                 .{
     41                     .src_path = try comp.zig_lib_directory.join(arena, &[_][]const u8{
     42                         "libc", "mingw", "crt", "crtexe.c",
     43                     }),
     44                     .extra_flags = args.items,
     45                     .owner = undefined,
     46                 },
     47             };
     48             return comp.build_crt_file("crt2", .Obj, .@"mingw-w64 crt2.o", prog_node, &files);
     49         },
     50 
     51         .dllcrt2_o => {
     52             var args = std.ArrayList([]const u8).init(arena);
     53             try add_cc_args(comp, arena, &args);
     54             var files = [_]Compilation.CSourceFile{
     55                 .{
     56                     .src_path = try comp.zig_lib_directory.join(arena, &[_][]const u8{
     57                         "libc", "mingw", "crt", "crtdll.c",
     58                     }),
     59                     .extra_flags = args.items,
     60                     .owner = undefined,
     61                 },
     62             };
     63             return comp.build_crt_file("dllcrt2", .Obj, .@"mingw-w64 dllcrt2.o", prog_node, &files);
     64         },
     65 
     66         .mingwex_lib => {
     67             var args = std.ArrayList([]const u8).init(arena);
     68             try add_cc_args(comp, arena, &args);
     69             var c_source_files = std.ArrayList(Compilation.CSourceFile).init(arena);
     70 
     71             for (mingwex_generic_src) |dep| {
     72                 try c_source_files.append(.{
     73                     .src_path = try comp.zig_lib_directory.join(arena, &[_][]const u8{
     74                         "libc", "mingw", dep,
     75                     }),
     76                     .extra_flags = args.items,
     77                     .owner = undefined,
     78                 });
     79             }
     80             const target = comp.getTarget();
     81             if (target.cpu.arch == .x86 or target.cpu.arch == .x86_64) {
     82                 for (mingwex_x86_src) |dep| {
     83                     try c_source_files.append(.{
     84                         .src_path = try comp.zig_lib_directory.join(arena, &[_][]const u8{
     85                             "libc", "mingw", dep,
     86                         }),
     87                         .extra_flags = args.items,
     88                         .owner = undefined,
     89                     });
     90                 }
     91                 if (target.cpu.arch == .x86) {
     92                     for (mingwex_x86_32_src) |dep| {
     93                         try c_source_files.append(.{
     94                             .src_path = try comp.zig_lib_directory.join(arena, &[_][]const u8{
     95                                 "libc", "mingw", dep,
     96                             }),
     97                             .extra_flags = args.items,
     98                             .owner = undefined,
     99                         });
    100                     }
    101                 }
    102             } else if (target.cpu.arch.isARM()) {
    103                 for (mingwex_arm32_src) |dep| {
    104                     try c_source_files.append(.{
    105                         .src_path = try comp.zig_lib_directory.join(arena, &[_][]const u8{
    106                             "libc", "mingw", dep,
    107                         }),
    108                         .extra_flags = args.items,
    109                         .owner = undefined,
    110                     });
    111                 }
    112             } else if (target.cpu.arch.isAARCH64()) {
    113                 for (mingwex_arm64_src) |dep| {
    114                     try c_source_files.append(.{
    115                         .src_path = try comp.zig_lib_directory.join(arena, &[_][]const u8{
    116                             "libc", "mingw", dep,
    117                         }),
    118                         .extra_flags = args.items,
    119                         .owner = undefined,
    120                     });
    121                 }
    122             } else {
    123                 @panic("unsupported arch");
    124             }
    125             return comp.build_crt_file("mingwex", .Lib, .@"mingw-w64 mingwex.lib", prog_node, c_source_files.items);
    126         },
    127     }
    128 }
    129 
    130 fn add_cc_args(
    131     comp: *Compilation,
    132     arena: Allocator,
    133     args: *std.ArrayList([]const u8),
    134 ) error{OutOfMemory}!void {
    135     try args.appendSlice(&[_][]const u8{
    136         "-DHAVE_CONFIG_H",
    137 
    138         "-I",
    139         try comp.zig_lib_directory.join(arena, &[_][]const u8{ "libc", "mingw", "include" }),
    140 
    141         "-isystem",
    142         try comp.zig_lib_directory.join(arena, &[_][]const u8{ "libc", "include", "any-windows-any" }),
    143     });
    144 
    145     const target = comp.getTarget();
    146     if (target.cpu.arch.isARM() and target.ptrBitWidth() == 32) {
    147         try args.append("-mfpu=vfp");
    148     }
    149 
    150     try args.appendSlice(&[_][]const u8{
    151         "-std=gnu11",
    152         "-D_CRTBLD",
    153         "-D_SYSCRT=1",
    154         "-DCRTDLL=1",
    155         // According to Martin Storsjö,
    156         // > the files under mingw-w64-crt are designed to always
    157         // be built with __MSVCRT_VERSION__=0x700
    158         "-D__MSVCRT_VERSION__=0x700",
    159         "-D__USE_MINGW_ANSI_STDIO=0",
    160     });
    161 }
    162 
    163 pub fn buildImportLib(comp: *Compilation, lib_name: []const u8) !void {
    164     if (build_options.only_c) @compileError("building import libs not included in core functionality");
    165     var arena_allocator = std.heap.ArenaAllocator.init(comp.gpa);
    166     defer arena_allocator.deinit();
    167     const arena = arena_allocator.allocator();
    168 
    169     const def_file_path = findDef(arena, comp.getTarget(), comp.zig_lib_directory, lib_name) catch |err| switch (err) {
    170         error.FileNotFound => {
    171             log.debug("no {s}.def file available to make a DLL import {s}.lib", .{ lib_name, lib_name });
    172             // In this case we will end up putting foo.lib onto the linker line and letting the linker
    173             // use its library paths to look for libraries and report any problems.
    174             return;
    175         },
    176         else => |e| return e,
    177     };
    178 
    179     const target = comp.getTarget();
    180 
    181     var cache: Cache = .{
    182         .gpa = comp.gpa,
    183         .manifest_dir = comp.cache_parent.manifest_dir,
    184     };
    185     for (comp.cache_parent.prefixes()) |prefix| {
    186         cache.addPrefix(prefix);
    187     }
    188 
    189     cache.hash.addBytes(build_options.version);
    190     cache.hash.addOptionalBytes(comp.zig_lib_directory.path);
    191     cache.hash.add(target.cpu.arch);
    192 
    193     var man = cache.obtain();
    194     defer man.deinit();
    195 
    196     _ = try man.addFile(def_file_path, null);
    197 
    198     const final_lib_basename = try std.fmt.allocPrint(comp.gpa, "{s}.lib", .{lib_name});
    199     errdefer comp.gpa.free(final_lib_basename);
    200 
    201     if (try man.hit()) {
    202         const digest = man.final();
    203 
    204         try comp.crt_files.ensureUnusedCapacity(comp.gpa, 1);
    205         comp.crt_files.putAssumeCapacityNoClobber(final_lib_basename, .{
    206             .full_object_path = try comp.global_cache_directory.join(comp.gpa, &[_][]const u8{
    207                 "o", &digest, final_lib_basename,
    208             }),
    209             .lock = man.toOwnedLock(),
    210         });
    211         return;
    212     }
    213 
    214     const digest = man.final();
    215     const o_sub_path = try std.fs.path.join(arena, &[_][]const u8{ "o", &digest });
    216     var o_dir = try comp.global_cache_directory.handle.makeOpenPath(o_sub_path, .{});
    217     defer o_dir.close();
    218 
    219     const final_def_basename = try std.fmt.allocPrint(arena, "{s}.def", .{lib_name});
    220     const def_final_path = try comp.global_cache_directory.join(arena, &[_][]const u8{
    221         "o", &digest, final_def_basename,
    222     });
    223 
    224     const target_defines = switch (target.cpu.arch) {
    225         .x86 => "#define DEF_I386\n",
    226         .x86_64 => "#define DEF_X64\n",
    227         .arm, .armeb, .thumb, .thumbeb, .aarch64_32 => "#define DEF_ARM32\n",
    228         .aarch64, .aarch64_be => "#define DEF_ARM64\n",
    229         else => unreachable,
    230     };
    231 
    232     const aro = @import("aro");
    233     var aro_comp = aro.Compilation.init(comp.gpa);
    234     defer aro_comp.deinit();
    235 
    236     const include_dir = try comp.zig_lib_directory.join(arena, &[_][]const u8{ "libc", "mingw", "def-include" });
    237 
    238     if (comp.verbose_cc) print: {
    239         std.debug.getStderrMutex().lock();
    240         defer std.debug.getStderrMutex().unlock();
    241         const stderr = std.io.getStdErr().writer();
    242         nosuspend stderr.print("def file: {s}\n", .{def_file_path}) catch break :print;
    243         nosuspend stderr.print("include dir: {s}\n", .{include_dir}) catch break :print;
    244         nosuspend stderr.print("output path: {s}\n", .{def_final_path}) catch break :print;
    245     }
    246 
    247     try aro_comp.include_dirs.append(comp.gpa, include_dir);
    248 
    249     const builtin_macros = try aro_comp.generateBuiltinMacros(.include_system_defines);
    250     const user_macros = try aro_comp.addSourceFromBuffer("<command line>", target_defines);
    251     const def_file_source = try aro_comp.addSourceFromPath(def_file_path);
    252 
    253     var pp = aro.Preprocessor.init(&aro_comp);
    254     defer pp.deinit();
    255     pp.linemarkers = .none;
    256     pp.preserve_whitespace = true;
    257 
    258     try pp.preprocessSources(&.{ def_file_source, builtin_macros, user_macros });
    259 
    260     for (aro_comp.diagnostics.list.items) |diagnostic| {
    261         if (diagnostic.kind == .@"fatal error" or diagnostic.kind == .@"error") {
    262             aro.Diagnostics.render(&aro_comp, std.io.tty.detectConfig(std.io.getStdErr()));
    263             return error.AroPreprocessorFailed;
    264         }
    265     }
    266 
    267     {
    268         // new scope to ensure definition file is written before passing the path to WriteImportLibrary
    269         const def_final_file = try comp.global_cache_directory.handle.createFile(def_final_path, .{ .truncate = true });
    270         defer def_final_file.close();
    271         try pp.prettyPrintTokens(def_final_file.writer());
    272     }
    273 
    274     const lib_final_path = try comp.global_cache_directory.join(comp.gpa, &[_][]const u8{
    275         "o", &digest, final_lib_basename,
    276     });
    277     errdefer comp.gpa.free(lib_final_path);
    278 
    279     if (!build_options.have_llvm) return error.ZigCompilerNotBuiltWithLLVMExtensions;
    280     const llvm_bindings = @import("codegen/llvm/bindings.zig");
    281     const llvm = @import("codegen/llvm.zig");
    282     const arch_tag = llvm.targetArch(target.cpu.arch);
    283     const def_final_path_z = try arena.dupeZ(u8, def_final_path);
    284     const lib_final_path_z = try arena.dupeZ(u8, lib_final_path);
    285     if (llvm_bindings.WriteImportLibrary(def_final_path_z.ptr, arch_tag, lib_final_path_z.ptr, true)) {
    286         // TODO surface a proper error here
    287         log.err("unable to turn {s}.def into {s}.lib", .{ lib_name, lib_name });
    288         return error.WritingImportLibFailed;
    289     }
    290 
    291     man.writeManifest() catch |err| {
    292         log.warn("failed to write cache manifest for DLL import {s}.lib: {s}", .{ lib_name, @errorName(err) });
    293     };
    294 
    295     try comp.crt_files.putNoClobber(comp.gpa, final_lib_basename, .{
    296         .full_object_path = lib_final_path,
    297         .lock = man.toOwnedLock(),
    298     });
    299 }
    300 
    301 pub fn libExists(
    302     allocator: Allocator,
    303     target: std.Target,
    304     zig_lib_directory: Cache.Directory,
    305     lib_name: []const u8,
    306 ) !bool {
    307     const s = findDef(allocator, target, zig_lib_directory, lib_name) catch |err| switch (err) {
    308         error.FileNotFound => return false,
    309         else => |e| return e,
    310     };
    311     defer allocator.free(s);
    312     return true;
    313 }
    314 
    315 /// This function body is verbose but all it does is test 3 different paths and
    316 /// see if a .def file exists.
    317 fn findDef(
    318     allocator: Allocator,
    319     target: std.Target,
    320     zig_lib_directory: Cache.Directory,
    321     lib_name: []const u8,
    322 ) ![]u8 {
    323     const lib_path = switch (target.cpu.arch) {
    324         .x86 => "lib32",
    325         .x86_64 => "lib64",
    326         .arm, .armeb, .thumb, .thumbeb, .aarch64_32 => "libarm32",
    327         .aarch64, .aarch64_be => "libarm64",
    328         else => unreachable,
    329     };
    330 
    331     var override_path = std.ArrayList(u8).init(allocator);
    332     defer override_path.deinit();
    333 
    334     const s = path.sep_str;
    335 
    336     {
    337         // Try the archtecture-specific path first.
    338         const fmt_path = "libc" ++ s ++ "mingw" ++ s ++ "{s}" ++ s ++ "{s}.def";
    339         if (zig_lib_directory.path) |p| {
    340             try override_path.writer().print("{s}" ++ s ++ fmt_path, .{ p, lib_path, lib_name });
    341         } else {
    342             try override_path.writer().print(fmt_path, .{ lib_path, lib_name });
    343         }
    344         if (std.fs.cwd().access(override_path.items, .{})) |_| {
    345             return override_path.toOwnedSlice();
    346         } else |err| switch (err) {
    347             error.FileNotFound => {},
    348             else => |e| return e,
    349         }
    350     }
    351 
    352     {
    353         // Try the generic version.
    354         override_path.shrinkRetainingCapacity(0);
    355         const fmt_path = "libc" ++ s ++ "mingw" ++ s ++ "lib-common" ++ s ++ "{s}.def";
    356         if (zig_lib_directory.path) |p| {
    357             try override_path.writer().print("{s}" ++ s ++ fmt_path, .{ p, lib_name });
    358         } else {
    359             try override_path.writer().print(fmt_path, .{lib_name});
    360         }
    361         if (std.fs.cwd().access(override_path.items, .{})) |_| {
    362             return override_path.toOwnedSlice();
    363         } else |err| switch (err) {
    364             error.FileNotFound => {},
    365             else => |e| return e,
    366         }
    367     }
    368 
    369     {
    370         // Try the generic version and preprocess it.
    371         override_path.shrinkRetainingCapacity(0);
    372         const fmt_path = "libc" ++ s ++ "mingw" ++ s ++ "lib-common" ++ s ++ "{s}.def.in";
    373         if (zig_lib_directory.path) |p| {
    374             try override_path.writer().print("{s}" ++ s ++ fmt_path, .{ p, lib_name });
    375         } else {
    376             try override_path.writer().print(fmt_path, .{lib_name});
    377         }
    378         if (std.fs.cwd().access(override_path.items, .{})) |_| {
    379             return override_path.toOwnedSlice();
    380         } else |err| switch (err) {
    381             error.FileNotFound => {},
    382             else => |e| return e,
    383         }
    384     }
    385 
    386     return error.FileNotFound;
    387 }
    388 
    389 const mingwex_generic_src = [_][]const u8{
    390     // mingw32
    391     "crt" ++ path.sep_str ++ "dll_argv.c",
    392     "crt" ++ path.sep_str ++ "gccmain.c",
    393     "crt" ++ path.sep_str ++ "natstart.c",
    394     "crt" ++ path.sep_str ++ "pseudo-reloc-list.c",
    395     "crt" ++ path.sep_str ++ "wildcard.c",
    396     "crt" ++ path.sep_str ++ "charmax.c",
    397     "crt" ++ path.sep_str ++ "dllargv.c",
    398     "crt" ++ path.sep_str ++ "_newmode.c",
    399     "crt" ++ path.sep_str ++ "tlssup.c",
    400     "crt" ++ path.sep_str ++ "xncommod.c",
    401     "crt" ++ path.sep_str ++ "cinitexe.c",
    402     "crt" ++ path.sep_str ++ "merr.c",
    403     "crt" ++ path.sep_str ++ "usermatherr.c",
    404     "crt" ++ path.sep_str ++ "pesect.c",
    405     "crt" ++ path.sep_str ++ "udllargc.c",
    406     "crt" ++ path.sep_str ++ "xthdloc.c",
    407     "crt" ++ path.sep_str ++ "CRT_fp10.c",
    408     "crt" ++ path.sep_str ++ "mingw_helpers.c",
    409     "crt" ++ path.sep_str ++ "pseudo-reloc.c",
    410     "crt" ++ path.sep_str ++ "udll_argv.c",
    411     "crt" ++ path.sep_str ++ "xtxtmode.c",
    412     "crt" ++ path.sep_str ++ "crt_handler.c",
    413     "crt" ++ path.sep_str ++ "tlsthrd.c",
    414     "crt" ++ path.sep_str ++ "tlsmthread.c",
    415     "crt" ++ path.sep_str ++ "tlsmcrt.c",
    416     "crt" ++ path.sep_str ++ "cxa_atexit.c",
    417     "crt" ++ path.sep_str ++ "cxa_thread_atexit.c",
    418     "crt" ++ path.sep_str ++ "tls_atexit.c",
    419     // mingwex
    420     "cfguard" ++ path.sep_str ++ "mingw_cfguard_support.c",
    421     "complex" ++ path.sep_str ++ "_cabs.c",
    422     "complex" ++ path.sep_str ++ "cabs.c",
    423     "complex" ++ path.sep_str ++ "cabsf.c",
    424     "complex" ++ path.sep_str ++ "cabsl.c",
    425     "complex" ++ path.sep_str ++ "cacos.c",
    426     "complex" ++ path.sep_str ++ "cacosf.c",
    427     "complex" ++ path.sep_str ++ "cacosl.c",
    428     "complex" ++ path.sep_str ++ "carg.c",
    429     "complex" ++ path.sep_str ++ "cargf.c",
    430     "complex" ++ path.sep_str ++ "cargl.c",
    431     "complex" ++ path.sep_str ++ "casin.c",
    432     "complex" ++ path.sep_str ++ "casinf.c",
    433     "complex" ++ path.sep_str ++ "casinl.c",
    434     "complex" ++ path.sep_str ++ "catan.c",
    435     "complex" ++ path.sep_str ++ "catanf.c",
    436     "complex" ++ path.sep_str ++ "catanl.c",
    437     "complex" ++ path.sep_str ++ "ccos.c",
    438     "complex" ++ path.sep_str ++ "ccosf.c",
    439     "complex" ++ path.sep_str ++ "ccosl.c",
    440     "complex" ++ path.sep_str ++ "cexp.c",
    441     "complex" ++ path.sep_str ++ "cexpf.c",
    442     "complex" ++ path.sep_str ++ "cexpl.c",
    443     "complex" ++ path.sep_str ++ "cimag.c",
    444     "complex" ++ path.sep_str ++ "cimagf.c",
    445     "complex" ++ path.sep_str ++ "cimagl.c",
    446     "complex" ++ path.sep_str ++ "clog.c",
    447     "complex" ++ path.sep_str ++ "clog10.c",
    448     "complex" ++ path.sep_str ++ "clog10f.c",
    449     "complex" ++ path.sep_str ++ "clog10l.c",
    450     "complex" ++ path.sep_str ++ "clogf.c",
    451     "complex" ++ path.sep_str ++ "clogl.c",
    452     "complex" ++ path.sep_str ++ "conj.c",
    453     "complex" ++ path.sep_str ++ "conjf.c",
    454     "complex" ++ path.sep_str ++ "conjl.c",
    455     "complex" ++ path.sep_str ++ "cpow.c",
    456     "complex" ++ path.sep_str ++ "cpowf.c",
    457     "complex" ++ path.sep_str ++ "cpowl.c",
    458     "complex" ++ path.sep_str ++ "cproj.c",
    459     "complex" ++ path.sep_str ++ "cprojf.c",
    460     "complex" ++ path.sep_str ++ "cprojl.c",
    461     "complex" ++ path.sep_str ++ "creal.c",
    462     "complex" ++ path.sep_str ++ "crealf.c",
    463     "complex" ++ path.sep_str ++ "creall.c",
    464     "complex" ++ path.sep_str ++ "csin.c",
    465     "complex" ++ path.sep_str ++ "csinf.c",
    466     "complex" ++ path.sep_str ++ "csinl.c",
    467     "complex" ++ path.sep_str ++ "csqrt.c",
    468     "complex" ++ path.sep_str ++ "csqrtf.c",
    469     "complex" ++ path.sep_str ++ "csqrtl.c",
    470     "complex" ++ path.sep_str ++ "ctan.c",
    471     "complex" ++ path.sep_str ++ "ctanf.c",
    472     "complex" ++ path.sep_str ++ "ctanl.c",
    473     "crt" ++ path.sep_str ++ "dllentry.c",
    474     "crt" ++ path.sep_str ++ "dllmain.c",
    475     "gdtoa" ++ path.sep_str ++ "arithchk.c",
    476     "gdtoa" ++ path.sep_str ++ "dmisc.c",
    477     "gdtoa" ++ path.sep_str ++ "dtoa.c",
    478     "gdtoa" ++ path.sep_str ++ "g__fmt.c",
    479     "gdtoa" ++ path.sep_str ++ "g_dfmt.c",
    480     "gdtoa" ++ path.sep_str ++ "g_ffmt.c",
    481     "gdtoa" ++ path.sep_str ++ "g_xfmt.c",
    482     "gdtoa" ++ path.sep_str ++ "gdtoa.c",
    483     "gdtoa" ++ path.sep_str ++ "gethex.c",
    484     "gdtoa" ++ path.sep_str ++ "gmisc.c",
    485     "gdtoa" ++ path.sep_str ++ "hd_init.c",
    486     "gdtoa" ++ path.sep_str ++ "hexnan.c",
    487     "gdtoa" ++ path.sep_str ++ "misc.c",
    488     "gdtoa" ++ path.sep_str ++ "qnan.c",
    489     "gdtoa" ++ path.sep_str ++ "smisc.c",
    490     "gdtoa" ++ path.sep_str ++ "strtodg.c",
    491     "gdtoa" ++ path.sep_str ++ "strtodnrp.c",
    492     "gdtoa" ++ path.sep_str ++ "strtof.c",
    493     "gdtoa" ++ path.sep_str ++ "strtopx.c",
    494     "gdtoa" ++ path.sep_str ++ "sum.c",
    495     "gdtoa" ++ path.sep_str ++ "ulp.c",
    496     "math" ++ path.sep_str ++ "coshl.c",
    497     "math" ++ path.sep_str ++ "fabsl.c",
    498     "math" ++ path.sep_str ++ "fp_consts.c",
    499     "math" ++ path.sep_str ++ "fp_constsf.c",
    500     "math" ++ path.sep_str ++ "fp_constsl.c",
    501     "math" ++ path.sep_str ++ "fpclassify.c",
    502     "math" ++ path.sep_str ++ "fpclassifyf.c",
    503     "math" ++ path.sep_str ++ "fpclassifyl.c",
    504     "math" ++ path.sep_str ++ "frexpf.c",
    505     "math" ++ path.sep_str ++ "frexpl.c",
    506     "math" ++ path.sep_str ++ "hypotf.c",
    507     "math" ++ path.sep_str ++ "hypotl.c",
    508     "math" ++ path.sep_str ++ "isnan.c",
    509     "math" ++ path.sep_str ++ "isnanf.c",
    510     "math" ++ path.sep_str ++ "isnanl.c",
    511     "math" ++ path.sep_str ++ "ldexpf.c",
    512     "math" ++ path.sep_str ++ "lgamma.c",
    513     "math" ++ path.sep_str ++ "lgammaf.c",
    514     "math" ++ path.sep_str ++ "lgammal.c",
    515     "math" ++ path.sep_str ++ "modfl.c",
    516     "math" ++ path.sep_str ++ "nextafterl.c",
    517     "math" ++ path.sep_str ++ "nexttoward.c",
    518     "math" ++ path.sep_str ++ "powi.c",
    519     "math" ++ path.sep_str ++ "powif.c",
    520     "math" ++ path.sep_str ++ "powil.c",
    521     "math" ++ path.sep_str ++ "signbit.c",
    522     "math" ++ path.sep_str ++ "signbitf.c",
    523     "math" ++ path.sep_str ++ "signbitl.c",
    524     "math" ++ path.sep_str ++ "signgam.c",
    525     "math" ++ path.sep_str ++ "sinhl.c",
    526     "math" ++ path.sep_str ++ "sqrtl.c",
    527     "math" ++ path.sep_str ++ "tanhl.c",
    528     "misc" ++ path.sep_str ++ "alarm.c",
    529     "misc" ++ path.sep_str ++ "btowc.c",
    530     "misc" ++ path.sep_str ++ "delay-f.c",
    531     "misc" ++ path.sep_str ++ "delay-n.c",
    532     "misc" ++ path.sep_str ++ "delayimp.c",
    533     "misc" ++ path.sep_str ++ "dirent.c",
    534     "misc" ++ path.sep_str ++ "dirname.c",
    535     "misc" ++ path.sep_str ++ "feclearexcept.c",
    536     "misc" ++ path.sep_str ++ "fegetenv.c",
    537     "misc" ++ path.sep_str ++ "fegetexceptflag.c",
    538     "misc" ++ path.sep_str ++ "fegetround.c",
    539     "misc" ++ path.sep_str ++ "feholdexcept.c",
    540     "misc" ++ path.sep_str ++ "feraiseexcept.c",
    541     "misc" ++ path.sep_str ++ "fesetenv.c",
    542     "misc" ++ path.sep_str ++ "fesetexceptflag.c",
    543     "misc" ++ path.sep_str ++ "fesetround.c",
    544     "misc" ++ path.sep_str ++ "fetestexcept.c",
    545     "misc" ++ path.sep_str ++ "feupdateenv.c",
    546     "misc" ++ path.sep_str ++ "ftruncate.c",
    547     "misc" ++ path.sep_str ++ "ftw.c",
    548     "misc" ++ path.sep_str ++ "ftw64.c",
    549     "misc" ++ path.sep_str ++ "fwide.c",
    550     "misc" ++ path.sep_str ++ "getlogin.c",
    551     "misc" ++ path.sep_str ++ "getopt.c",
    552     "misc" ++ path.sep_str ++ "gettimeofday.c",
    553     "misc" ++ path.sep_str ++ "isblank.c",
    554     "misc" ++ path.sep_str ++ "iswblank.c",
    555     "misc" ++ path.sep_str ++ "mempcpy.c",
    556     "misc" ++ path.sep_str ++ "mingw-access.c",
    557     "misc" ++ path.sep_str ++ "mingw-aligned-malloc.c",
    558     "misc" ++ path.sep_str ++ "mingw_getsp.S",
    559     "misc" ++ path.sep_str ++ "mingw_longjmp.S",
    560     "misc" ++ path.sep_str ++ "mingw_matherr.c",
    561     "misc" ++ path.sep_str ++ "mingw_mbwc_convert.c",
    562     "misc" ++ path.sep_str ++ "mingw_usleep.c",
    563     "misc" ++ path.sep_str ++ "mingw_wcstod.c",
    564     "misc" ++ path.sep_str ++ "mingw_wcstof.c",
    565     "misc" ++ path.sep_str ++ "mingw_wcstold.c",
    566     "misc" ++ path.sep_str ++ "mkstemp.c",
    567     "misc" ++ path.sep_str ++ "sleep.c",
    568     "misc" ++ path.sep_str ++ "strnlen.c",
    569     "misc" ++ path.sep_str ++ "strsafe.c",
    570     "misc" ++ path.sep_str ++ "tdelete.c",
    571     "misc" ++ path.sep_str ++ "tdestroy.c",
    572     "misc" ++ path.sep_str ++ "tfind.c",
    573     "misc" ++ path.sep_str ++ "tsearch.c",
    574     "misc" ++ path.sep_str ++ "twalk.c",
    575     "misc" ++ path.sep_str ++ "wcsnlen.c",
    576     "misc" ++ path.sep_str ++ "wcstof.c",
    577     "misc" ++ path.sep_str ++ "wcstoimax.c",
    578     "misc" ++ path.sep_str ++ "wcstold.c",
    579     "misc" ++ path.sep_str ++ "wcstoumax.c",
    580     "misc" ++ path.sep_str ++ "wctob.c",
    581     "misc" ++ path.sep_str ++ "wctrans.c",
    582     "misc" ++ path.sep_str ++ "wctype.c",
    583     "misc" ++ path.sep_str ++ "wdirent.c",
    584     "misc" ++ path.sep_str ++ "winbs_uint64.c",
    585     "misc" ++ path.sep_str ++ "winbs_ulong.c",
    586     "misc" ++ path.sep_str ++ "winbs_ushort.c",
    587     "misc" ++ path.sep_str ++ "wmemchr.c",
    588     "misc" ++ path.sep_str ++ "wmemcmp.c",
    589     "misc" ++ path.sep_str ++ "wmemcpy.c",
    590     "misc" ++ path.sep_str ++ "wmemmove.c",
    591     "misc" ++ path.sep_str ++ "wmempcpy.c",
    592     "misc" ++ path.sep_str ++ "wmemset.c",
    593     "stdio" ++ path.sep_str ++ "_Exit.c",
    594     "stdio" ++ path.sep_str ++ "_findfirst64i32.c",
    595     "stdio" ++ path.sep_str ++ "_findnext64i32.c",
    596     "stdio" ++ path.sep_str ++ "_fstat.c",
    597     "stdio" ++ path.sep_str ++ "_fstat64i32.c",
    598     "stdio" ++ path.sep_str ++ "_ftime.c",
    599     "stdio" ++ path.sep_str ++ "_stat.c",
    600     "stdio" ++ path.sep_str ++ "_stat64i32.c",
    601     "stdio" ++ path.sep_str ++ "_wfindfirst64i32.c",
    602     "stdio" ++ path.sep_str ++ "_wfindnext64i32.c",
    603     "stdio" ++ path.sep_str ++ "_wstat.c",
    604     "stdio" ++ path.sep_str ++ "_wstat64i32.c",
    605     "stdio" ++ path.sep_str ++ "asprintf.c",
    606     "stdio" ++ path.sep_str ++ "fgetpos64.c",
    607     "stdio" ++ path.sep_str ++ "fopen64.c",
    608     "stdio" ++ path.sep_str ++ "fseeko32.c",
    609     "stdio" ++ path.sep_str ++ "fseeko64.c",
    610     "stdio" ++ path.sep_str ++ "fsetpos64.c",
    611     "stdio" ++ path.sep_str ++ "ftello.c",
    612     "stdio" ++ path.sep_str ++ "ftello64.c",
    613     "stdio" ++ path.sep_str ++ "ftruncate64.c",
    614     "stdio" ++ path.sep_str ++ "lltoa.c",
    615     "stdio" ++ path.sep_str ++ "lltow.c",
    616     "stdio" ++ path.sep_str ++ "lseek64.c",
    617     "stdio" ++ path.sep_str ++ "mingw_asprintf.c",
    618     "stdio" ++ path.sep_str ++ "mingw_fprintf.c",
    619     "stdio" ++ path.sep_str ++ "mingw_fprintfw.c",
    620     "stdio" ++ path.sep_str ++ "mingw_fscanf.c",
    621     "stdio" ++ path.sep_str ++ "mingw_fwscanf.c",
    622     "stdio" ++ path.sep_str ++ "mingw_pformat.c",
    623     "stdio" ++ path.sep_str ++ "mingw_pformatw.c",
    624     "stdio" ++ path.sep_str ++ "mingw_printf.c",
    625     "stdio" ++ path.sep_str ++ "mingw_printfw.c",
    626     "stdio" ++ path.sep_str ++ "mingw_scanf.c",
    627     "stdio" ++ path.sep_str ++ "mingw_snprintf.c",
    628     "stdio" ++ path.sep_str ++ "mingw_snprintfw.c",
    629     "stdio" ++ path.sep_str ++ "mingw_sprintf.c",
    630     "stdio" ++ path.sep_str ++ "mingw_sprintfw.c",
    631     "stdio" ++ path.sep_str ++ "mingw_sscanf.c",
    632     "stdio" ++ path.sep_str ++ "mingw_swscanf.c",
    633     "stdio" ++ path.sep_str ++ "mingw_vasprintf.c",
    634     "stdio" ++ path.sep_str ++ "mingw_vfprintf.c",
    635     "stdio" ++ path.sep_str ++ "mingw_vfprintfw.c",
    636     "stdio" ++ path.sep_str ++ "mingw_vfscanf.c",
    637     "stdio" ++ path.sep_str ++ "mingw_vprintf.c",
    638     "stdio" ++ path.sep_str ++ "mingw_vprintfw.c",
    639     "stdio" ++ path.sep_str ++ "mingw_vsnprintf.c",
    640     "stdio" ++ path.sep_str ++ "mingw_vsnprintfw.c",
    641     "stdio" ++ path.sep_str ++ "mingw_vsprintf.c",
    642     "stdio" ++ path.sep_str ++ "mingw_vsprintfw.c",
    643     "stdio" ++ path.sep_str ++ "mingw_wscanf.c",
    644     "stdio" ++ path.sep_str ++ "mingw_wvfscanf.c",
    645     "stdio" ++ path.sep_str ++ "scanf2-argcount-char.c",
    646     "stdio" ++ path.sep_str ++ "scanf2-argcount-wchar.c",
    647     "stdio" ++ path.sep_str ++ "scanf.S",
    648     "stdio" ++ path.sep_str ++ "snprintf.c",
    649     "stdio" ++ path.sep_str ++ "snwprintf.c",
    650     "stdio" ++ path.sep_str ++ "strtok_r.c",
    651     "stdio" ++ path.sep_str ++ "truncate.c",
    652     "stdio" ++ path.sep_str ++ "ulltoa.c",
    653     "stdio" ++ path.sep_str ++ "ulltow.c",
    654     "stdio" ++ path.sep_str ++ "vasprintf.c",
    655     "stdio" ++ path.sep_str ++ "vfscanf.c",
    656     "stdio" ++ path.sep_str ++ "vfscanf2.S",
    657     "stdio" ++ path.sep_str ++ "vfwscanf.c",
    658     "stdio" ++ path.sep_str ++ "vfwscanf2.S",
    659     "stdio" ++ path.sep_str ++ "vscanf.c",
    660     "stdio" ++ path.sep_str ++ "vscanf2.S",
    661     "stdio" ++ path.sep_str ++ "vsnprintf.c",
    662     "stdio" ++ path.sep_str ++ "vsnwprintf.c",
    663     "stdio" ++ path.sep_str ++ "vsscanf.c",
    664     "stdio" ++ path.sep_str ++ "vsscanf2.S",
    665     "stdio" ++ path.sep_str ++ "vswscanf.c",
    666     "stdio" ++ path.sep_str ++ "vswscanf2.S",
    667     "stdio" ++ path.sep_str ++ "vwscanf.c",
    668     "stdio" ++ path.sep_str ++ "vwscanf2.S",
    669     "stdio" ++ path.sep_str ++ "wtoll.c",
    670     // ucrtbase
    671     "crt" ++ path.sep_str ++ "ucrtbase_compat.c",
    672     "math" ++ path.sep_str ++ "_huge.c",
    673     "misc" ++ path.sep_str ++ "__initenv.c",
    674     "misc" ++ path.sep_str ++ "ucrt-access.c",
    675     "stdio" ++ path.sep_str ++ "ucrt__snwprintf.c",
    676     "stdio" ++ path.sep_str ++ "ucrt__vscprintf.c",
    677     "stdio" ++ path.sep_str ++ "ucrt__vsnprintf.c",
    678     "stdio" ++ path.sep_str ++ "ucrt__vsnwprintf.c",
    679     "stdio" ++ path.sep_str ++ "ucrt_fprintf.c",
    680     "stdio" ++ path.sep_str ++ "ucrt_fscanf.c",
    681     "stdio" ++ path.sep_str ++ "ucrt_fwprintf.c",
    682     "stdio" ++ path.sep_str ++ "ucrt_printf.c",
    683     "stdio" ++ path.sep_str ++ "ucrt_scanf.c",
    684     "stdio" ++ path.sep_str ++ "ucrt_snprintf.c",
    685     "stdio" ++ path.sep_str ++ "ucrt_sprintf.c",
    686     "stdio" ++ path.sep_str ++ "ucrt_sscanf.c",
    687     "stdio" ++ path.sep_str ++ "ucrt_vfprintf.c",
    688     "stdio" ++ path.sep_str ++ "ucrt_vfscanf.c",
    689     "stdio" ++ path.sep_str ++ "ucrt_vprintf.c",
    690     "stdio" ++ path.sep_str ++ "ucrt_vscanf.c",
    691     "stdio" ++ path.sep_str ++ "ucrt_vsnprintf.c",
    692     "stdio" ++ path.sep_str ++ "ucrt_vsprintf.c",
    693     "stdio" ++ path.sep_str ++ "ucrt_vsscanf.c",
    694     // uuid
    695     "libsrc" ++ path.sep_str ++ "ativscp-uuid.c",
    696     "libsrc" ++ path.sep_str ++ "atsmedia-uuid.c",
    697     "libsrc" ++ path.sep_str ++ "bth-uuid.c",
    698     "libsrc" ++ path.sep_str ++ "cguid-uuid.c",
    699     "libsrc" ++ path.sep_str ++ "comcat-uuid.c",
    700     "libsrc" ++ path.sep_str ++ "ctxtcall-uuid.c",
    701     "libsrc" ++ path.sep_str ++ "devguid.c",
    702     "libsrc" ++ path.sep_str ++ "docobj-uuid.c",
    703     "libsrc" ++ path.sep_str ++ "dxva-uuid.c",
    704     "libsrc" ++ path.sep_str ++ "exdisp-uuid.c",
    705     "libsrc" ++ path.sep_str ++ "extras-uuid.c",
    706     "libsrc" ++ path.sep_str ++ "fwp-uuid.c",
    707     "libsrc" ++ path.sep_str ++ "guid_nul.c",
    708     "libsrc" ++ path.sep_str ++ "hlguids-uuid.c",
    709     "libsrc" ++ path.sep_str ++ "hlink-uuid.c",
    710     "libsrc" ++ path.sep_str ++ "mlang-uuid.c",
    711     "libsrc" ++ path.sep_str ++ "msctf-uuid.c",
    712     "libsrc" ++ path.sep_str ++ "mshtmhst-uuid.c",
    713     "libsrc" ++ path.sep_str ++ "mshtml-uuid.c",
    714     "libsrc" ++ path.sep_str ++ "msxml-uuid.c",
    715     "libsrc" ++ path.sep_str ++ "netcfg-uuid.c",
    716     "libsrc" ++ path.sep_str ++ "netcon-uuid.c",
    717     "libsrc" ++ path.sep_str ++ "ntddkbd-uuid.c",
    718     "libsrc" ++ path.sep_str ++ "ntddmou-uuid.c",
    719     "libsrc" ++ path.sep_str ++ "ntddpar-uuid.c",
    720     "libsrc" ++ path.sep_str ++ "ntddscsi-uuid.c",
    721     "libsrc" ++ path.sep_str ++ "ntddser-uuid.c",
    722     "libsrc" ++ path.sep_str ++ "ntddstor-uuid.c",
    723     "libsrc" ++ path.sep_str ++ "ntddvdeo-uuid.c",
    724     "libsrc" ++ path.sep_str ++ "oaidl-uuid.c",
    725     "libsrc" ++ path.sep_str ++ "objidl-uuid.c",
    726     "libsrc" ++ path.sep_str ++ "objsafe-uuid.c",
    727     "libsrc" ++ path.sep_str ++ "ocidl-uuid.c",
    728     "libsrc" ++ path.sep_str ++ "oleacc-uuid.c",
    729     "libsrc" ++ path.sep_str ++ "olectlid-uuid.c",
    730     "libsrc" ++ path.sep_str ++ "oleidl-uuid.c",
    731     "libsrc" ++ path.sep_str ++ "power-uuid.c",
    732     "libsrc" ++ path.sep_str ++ "powrprof-uuid.c",
    733     "libsrc" ++ path.sep_str ++ "uianimation-uuid.c",
    734     "libsrc" ++ path.sep_str ++ "usbcamdi-uuid.c",
    735     "libsrc" ++ path.sep_str ++ "usbiodef-uuid.c",
    736     "libsrc" ++ path.sep_str ++ "uuid.c",
    737     "libsrc" ++ path.sep_str ++ "vds-uuid.c",
    738     "libsrc" ++ path.sep_str ++ "virtdisk-uuid.c",
    739     "libsrc" ++ path.sep_str ++ "vss-uuid.c",
    740     "libsrc" ++ path.sep_str ++ "wia-uuid.c",
    741     "libsrc" ++ path.sep_str ++ "windowscodecs.c",
    742     // ws2_32
    743     "libsrc" ++ path.sep_str ++ "ws2_32.c",
    744     "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "in6_addr_equal.c",
    745     "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "in6addr_isany.c",
    746     "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "in6addr_isloopback.c",
    747     "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "in6addr_setany.c",
    748     "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "in6addr_setloopback.c",
    749     "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "in6_is_addr_linklocal.c",
    750     "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "in6_is_addr_loopback.c",
    751     "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "in6_is_addr_mc_global.c",
    752     "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "in6_is_addr_mc_linklocal.c",
    753     "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "in6_is_addr_mc_nodelocal.c",
    754     "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "in6_is_addr_mc_orglocal.c",
    755     "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "in6_is_addr_mc_sitelocal.c",
    756     "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "in6_is_addr_multicast.c",
    757     "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "in6_is_addr_sitelocal.c",
    758     "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "in6_is_addr_unspecified.c",
    759     "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "in6_is_addr_v4compat.c",
    760     "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "in6_is_addr_v4mapped.c",
    761     "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "in6_set_addr_loopback.c",
    762     "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "in6_set_addr_unspecified.c",
    763     "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "gai_strerrorA.c",
    764     "libsrc" ++ path.sep_str ++ "ws2tcpip" ++ path.sep_str ++ "gai_strerrorW.c",
    765     "libsrc" ++ path.sep_str ++ "wspiapi" ++ path.sep_str ++ "WspiapiStrdup.c",
    766     "libsrc" ++ path.sep_str ++ "wspiapi" ++ path.sep_str ++ "WspiapiParseV4Address.c",
    767     "libsrc" ++ path.sep_str ++ "wspiapi" ++ path.sep_str ++ "WspiapiNewAddrInfo.c",
    768     "libsrc" ++ path.sep_str ++ "wspiapi" ++ path.sep_str ++ "WspiapiQueryDNS.c",
    769     "libsrc" ++ path.sep_str ++ "wspiapi" ++ path.sep_str ++ "WspiapiLookupNode.c",
    770     "libsrc" ++ path.sep_str ++ "wspiapi" ++ path.sep_str ++ "WspiapiClone.c",
    771     "libsrc" ++ path.sep_str ++ "wspiapi" ++ path.sep_str ++ "WspiapiLegacyFreeAddrInfo.c",
    772     "libsrc" ++ path.sep_str ++ "wspiapi" ++ path.sep_str ++ "WspiapiLegacyGetAddrInfo.c",
    773     "libsrc" ++ path.sep_str ++ "wspiapi" ++ path.sep_str ++ "WspiapiLegacyGetNameInfo.c",
    774     "libsrc" ++ path.sep_str ++ "wspiapi" ++ path.sep_str ++ "WspiapiLoad.c",
    775     "libsrc" ++ path.sep_str ++ "wspiapi" ++ path.sep_str ++ "WspiapiGetAddrInfo.c",
    776     "libsrc" ++ path.sep_str ++ "wspiapi" ++ path.sep_str ++ "WspiapiGetNameInfo.c",
    777     "libsrc" ++ path.sep_str ++ "wspiapi" ++ path.sep_str ++ "WspiapiFreeAddrInfo.c",
    778     // dinput
    779     "libsrc" ++ path.sep_str ++ "dinput_kbd.c",
    780     "libsrc" ++ path.sep_str ++ "dinput_joy.c",
    781     "libsrc" ++ path.sep_str ++ "dinput_joy2.c",
    782     "libsrc" ++ path.sep_str ++ "dinput_mouse.c",
    783     "libsrc" ++ path.sep_str ++ "dinput_mouse2.c",
    784     // dloadhelper
    785     "libsrc" ++ path.sep_str ++ "dloadhelper.c",
    786     "misc" ++ path.sep_str ++ "delay-f.c",
    787     // misc.
    788     "libsrc" ++ path.sep_str ++ "bits.c",
    789     "libsrc" ++ path.sep_str ++ "shell32.c",
    790     "libsrc" ++ path.sep_str ++ "dmoguids.c",
    791     "libsrc" ++ path.sep_str ++ "dxerr8.c",
    792     "libsrc" ++ path.sep_str ++ "dxerr8w.c",
    793     "libsrc" ++ path.sep_str ++ "dxerr9.c",
    794     "libsrc" ++ path.sep_str ++ "dxerr9w.c",
    795     "libsrc" ++ path.sep_str ++ "mfuuid.c",
    796     "libsrc" ++ path.sep_str ++ "msxml2.c",
    797     "libsrc" ++ path.sep_str ++ "msxml6.c",
    798     "libsrc" ++ path.sep_str ++ "amstrmid.c",
    799     "libsrc" ++ path.sep_str ++ "wbemuuid.c",
    800     "libsrc" ++ path.sep_str ++ "wmcodecdspuuid.c",
    801     "libsrc" ++ path.sep_str ++ "windowscodecs.c",
    802     "libsrc" ++ path.sep_str ++ "dxguid.c",
    803     "libsrc" ++ path.sep_str ++ "ksuser.c",
    804     "libsrc" ++ path.sep_str ++ "locationapi.c",
    805     "libsrc" ++ path.sep_str ++ "sapi.c",
    806     "libsrc" ++ path.sep_str ++ "sensorsapi.c",
    807     "libsrc" ++ path.sep_str ++ "portabledeviceguids.c",
    808     "libsrc" ++ path.sep_str ++ "taskschd.c",
    809     "libsrc" ++ path.sep_str ++ "strmiids.c",
    810     "libsrc" ++ path.sep_str ++ "gdiplus.c",
    811     "libsrc" ++ path.sep_str ++ "activeds-uuid.c",
    812 };
    813 
    814 const mingwex_x86_src = [_][]const u8{
    815     // mingwex
    816     "math" ++ path.sep_str ++ "cbrtl.c",
    817     "math" ++ path.sep_str ++ "erfl.c",
    818     "math" ++ path.sep_str ++ "fdiml.c",
    819     "math" ++ path.sep_str ++ "fmal.c",
    820     "math" ++ path.sep_str ++ "fmaxl.c",
    821     "math" ++ path.sep_str ++ "fminl.c",
    822     "math" ++ path.sep_str ++ "llrintl.c",
    823     "math" ++ path.sep_str ++ "llroundl.c",
    824     "math" ++ path.sep_str ++ "lrintl.c",
    825     "math" ++ path.sep_str ++ "lroundl.c",
    826     "math" ++ path.sep_str ++ "rintl.c",
    827     "math" ++ path.sep_str ++ "roundl.c",
    828     "math" ++ path.sep_str ++ "tgammal.c",
    829     "math" ++ path.sep_str ++ "truncl.c",
    830     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "acoshl.c",
    831     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "acosl.c",
    832     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "asinhl.c",
    833     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "asinl.c",
    834     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "atan2l.c",
    835     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "atanhl.c",
    836     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "atanl.c",
    837     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "ceill.S",
    838     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "_chgsignl.S",
    839     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "copysignl.S",
    840     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "cosl.c",
    841     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "cosl_internal.S",
    842     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "cossin.c",
    843     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "exp2l.S",
    844     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "expl.c",
    845     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "expm1l.c",
    846     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "floorl.S",
    847     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "fmodl.c",
    848     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "fucom.c",
    849     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "ilogbl.S",
    850     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "internal_logl.S",
    851     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "ldexp.c",
    852     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "ldexpl.c",
    853     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "log10l.S",
    854     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "log1pl.S",
    855     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "log2l.S",
    856     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "logbl.c",
    857     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "logl.c",
    858     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "nearbyintl.S",
    859     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "powl.c",
    860     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "remainderl.S",
    861     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "remquol.S",
    862     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "scalbnf.S",
    863     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "scalbnl.S",
    864     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "scalbn.S",
    865     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "sinl.c",
    866     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "sinl_internal.S",
    867     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "tanl.S",
    868     // ucrtbase
    869     "math" ++ path.sep_str ++ "fabsf.c",
    870     "math" ++ path.sep_str ++ "nexttowardf.c",
    871 };
    872 
    873 const mingwex_x86_32_src = [_][]const u8{
    874     // ucrtbase
    875     "math" ++ path.sep_str ++ "coshf.c",
    876     "math" ++ path.sep_str ++ "expf.c",
    877     "math" ++ path.sep_str ++ "log10f.c",
    878     "math" ++ path.sep_str ++ "logf.c",
    879     "math" ++ path.sep_str ++ "modff.c",
    880     "math" ++ path.sep_str ++ "powf.c",
    881     "math" ++ path.sep_str ++ "sinhf.c",
    882     "math" ++ path.sep_str ++ "sqrtf.c",
    883     "math" ++ path.sep_str ++ "tanhf.c",
    884     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "acosf.c",
    885     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "asinf.c",
    886     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "atan2f.c",
    887     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "atanf.c",
    888     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "ceilf.S",
    889     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "cosf.c",
    890     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "floorf.S",
    891     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "fmodf.c",
    892     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "sinf.c",
    893     "math" ++ path.sep_str ++ "x86" ++ path.sep_str ++ "tanf.c",
    894 };
    895 
    896 const mingwex_arm32_src = [_][]const u8{
    897     "math" ++ path.sep_str ++ "arm-common" ++ path.sep_str ++ "ldexpl.c",
    898     "math" ++ path.sep_str ++ "arm" ++ path.sep_str ++ "_chgsignl.S",
    899     "math" ++ path.sep_str ++ "arm" ++ path.sep_str ++ "s_rint.c",
    900     "math" ++ path.sep_str ++ "arm" ++ path.sep_str ++ "s_rintf.c",
    901     "math" ++ path.sep_str ++ "arm" ++ path.sep_str ++ "sincos.S",
    902     "math" ++ path.sep_str ++ "arm" ++ path.sep_str ++ "sincosf.S",
    903 };
    904 
    905 const mingwex_arm64_src = [_][]const u8{
    906     "math" ++ path.sep_str ++ "arm-common" ++ path.sep_str ++ "ldexpl.c",
    907     "math" ++ path.sep_str ++ "arm64" ++ path.sep_str ++ "_chgsignl.S",
    908     "math" ++ path.sep_str ++ "arm64" ++ path.sep_str ++ "rint.c",
    909     "math" ++ path.sep_str ++ "arm64" ++ path.sep_str ++ "rintf.c",
    910     "math" ++ path.sep_str ++ "arm64" ++ path.sep_str ++ "sincos.S",
    911     "math" ++ path.sep_str ++ "arm64" ++ path.sep_str ++ "sincosf.S",
    912 };
    913 
    914 pub const always_link_libs = [_][]const u8{
    915     "ucrtbase",
    916     "advapi32",
    917     "kernel32",
    918     "ntdll",
    919     "shell32",
    920     "user32",
    921 };