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 };