| ... | @@ -4,8 +4,10 @@ pub const ArchOsAbi = struct { | ... | @@ -4,8 +4,10 @@ pub const ArchOsAbi = struct { |
| 4 | abi: std.Target.Abi, | 4 | abi: std.Target.Abi, |
| 5 | os_ver: ?std.SemanticVersion = null, | 5 | os_ver: ?std.SemanticVersion = null, |
| 6 | | 6 | |
| 7 | // Minimum glibc version that provides support for the arch/os when ABI is GNU. | 7 | /// Minimum glibc version that provides support for the arch/os when ABI is GNU. |
| 8 | glibc_min: ?std.SemanticVersion = null, | 8 | glibc_min: ?std.SemanticVersion = null, |
| | 9 | /// Override for `glibcRuntimeTriple` when glibc has an unusual directory name for the target. |
| | 10 | glibc_triple: ?[]const u8 = null, |
| 9 | }; | 11 | }; |
| 10 | | 12 | |
| 11 | pub const available_libcs = [_]ArchOsAbi{ | 13 | pub const available_libcs = [_]ArchOsAbi{ |
| ... | @@ -29,44 +31,44 @@ pub const available_libcs = [_]ArchOsAbi{ | ... | @@ -29,44 +31,44 @@ pub const available_libcs = [_]ArchOsAbi{ |
| 29 | .{ .arch = .aarch64, .os = .windows, .abi = .gnu }, | 31 | .{ .arch = .aarch64, .os = .windows, .abi = .gnu }, |
| 30 | .{ .arch = .aarch64_be, .os = .linux, .abi = .gnu, .glibc_min = .{ .major = 2, .minor = 17, .patch = 0 } }, | 32 | .{ .arch = .aarch64_be, .os = .linux, .abi = .gnu, .glibc_min = .{ .major = 2, .minor = 17, .patch = 0 } }, |
| 31 | .{ .arch = .aarch64_be, .os = .linux, .abi = .musl }, | 33 | .{ .arch = .aarch64_be, .os = .linux, .abi = .musl }, |
| 32 | .{ .arch = .csky, .os = .linux, .abi = .gnueabi, .glibc_min = .{ .major = 2, .minor = 29, .patch = 0 } }, | 34 | .{ .arch = .csky, .os = .linux, .abi = .gnueabi, .glibc_min = .{ .major = 2, .minor = 29, .patch = 0 }, .glibc_triple = "csky-linux-gnuabiv2-soft" }, |
| 33 | .{ .arch = .csky, .os = .linux, .abi = .gnueabihf, .glibc_min = .{ .major = 2, .minor = 29, .patch = 0 } }, | 35 | .{ .arch = .csky, .os = .linux, .abi = .gnueabihf, .glibc_min = .{ .major = 2, .minor = 29, .patch = 0 }, .glibc_triple = "csky-linux-gnuabiv2" }, |
| 34 | .{ .arch = .loongarch64, .os = .linux, .abi = .gnu, .glibc_min = .{ .major = 2, .minor = 36, .patch = 0 } }, | 36 | .{ .arch = .loongarch64, .os = .linux, .abi = .gnu, .glibc_min = .{ .major = 2, .minor = 36, .patch = 0 }, .glibc_triple = "loongarch64-linux-gnu-lp64d" }, |
| 35 | .{ .arch = .loongarch64, .os = .linux, .abi = .gnusf, .glibc_min = .{ .major = 2, .minor = 36, .patch = 0 } }, | 37 | .{ .arch = .loongarch64, .os = .linux, .abi = .gnusf, .glibc_min = .{ .major = 2, .minor = 36, .patch = 0 }, .glibc_triple = "loongarch64-linux-gnu-lp64s" }, |
| 36 | .{ .arch = .loongarch64, .os = .linux, .abi = .musl }, | 38 | .{ .arch = .loongarch64, .os = .linux, .abi = .musl }, |
| 37 | .{ .arch = .m68k, .os = .linux, .abi = .gnu }, | 39 | .{ .arch = .m68k, .os = .linux, .abi = .gnu }, |
| 38 | .{ .arch = .m68k, .os = .linux, .abi = .musl }, | 40 | .{ .arch = .m68k, .os = .linux, .abi = .musl }, |
| 39 | .{ .arch = .mips, .os = .linux, .abi = .gnueabi }, | 41 | .{ .arch = .mips, .os = .linux, .abi = .gnueabi, .glibc_triple = "mips-linux-gnu-soft" }, |
| 40 | .{ .arch = .mips, .os = .linux, .abi = .gnueabihf }, | 42 | .{ .arch = .mips, .os = .linux, .abi = .gnueabihf, .glibc_triple = "mips-linux-gnu" }, |
| 41 | .{ .arch = .mips, .os = .linux, .abi = .musleabi }, | 43 | .{ .arch = .mips, .os = .linux, .abi = .musleabi }, |
| 42 | .{ .arch = .mips, .os = .linux, .abi = .musleabihf }, | 44 | .{ .arch = .mips, .os = .linux, .abi = .musleabihf }, |
| 43 | .{ .arch = .mipsel, .os = .linux, .abi = .gnueabi }, | 45 | .{ .arch = .mipsel, .os = .linux, .abi = .gnueabi, .glibc_triple = "mipsel-linux-gnu-soft" }, |
| 44 | .{ .arch = .mipsel, .os = .linux, .abi = .gnueabihf }, | 46 | .{ .arch = .mipsel, .os = .linux, .abi = .gnueabihf, .glibc_triple = "mipsel-linux-gnu" }, |
| 45 | .{ .arch = .mipsel, .os = .linux, .abi = .musleabi }, | 47 | .{ .arch = .mipsel, .os = .linux, .abi = .musleabi }, |
| 46 | .{ .arch = .mipsel, .os = .linux, .abi = .musleabihf }, | 48 | .{ .arch = .mipsel, .os = .linux, .abi = .musleabihf }, |
| 47 | .{ .arch = .mips64, .os = .linux, .abi = .gnuabi64 }, | 49 | .{ .arch = .mips64, .os = .linux, .abi = .gnuabi64, .glibc_triple = "mips64-linux-gnu-n64" }, |
| 48 | .{ .arch = .mips64, .os = .linux, .abi = .gnuabin32 }, | 50 | .{ .arch = .mips64, .os = .linux, .abi = .gnuabin32, .glibc_triple = "mips64-linux-gnu-n32" }, |
| 49 | .{ .arch = .mips64, .os = .linux, .abi = .muslabi64 }, | 51 | .{ .arch = .mips64, .os = .linux, .abi = .muslabi64 }, |
| 50 | .{ .arch = .mips64, .os = .linux, .abi = .muslabin32 }, | 52 | .{ .arch = .mips64, .os = .linux, .abi = .muslabin32 }, |
| 51 | .{ .arch = .mips64el, .os = .linux, .abi = .gnuabi64 }, | 53 | .{ .arch = .mips64el, .os = .linux, .abi = .gnuabi64, .glibc_triple = "mips64el-linux-gnu-n64" }, |
| 52 | .{ .arch = .mips64el, .os = .linux, .abi = .gnuabin32 }, | 54 | .{ .arch = .mips64el, .os = .linux, .abi = .gnuabin32, .glibc_triple = "mips64el-linux-gnu-n32" }, |
| 53 | .{ .arch = .mips64el, .os = .linux, .abi = .muslabi64 }, | 55 | .{ .arch = .mips64el, .os = .linux, .abi = .muslabi64 }, |
| 54 | .{ .arch = .mips64el, .os = .linux, .abi = .muslabin32 }, | 56 | .{ .arch = .mips64el, .os = .linux, .abi = .muslabin32 }, |
| 55 | .{ .arch = .powerpc, .os = .linux, .abi = .gnueabi }, | 57 | .{ .arch = .powerpc, .os = .linux, .abi = .gnueabi, .glibc_triple = "powerpc-linux-gnu-soft" }, |
| 56 | .{ .arch = .powerpc, .os = .linux, .abi = .gnueabihf }, | 58 | .{ .arch = .powerpc, .os = .linux, .abi = .gnueabihf, .glibc_triple = "powerpc-linux-gnu" }, |
| 57 | .{ .arch = .powerpc, .os = .linux, .abi = .musleabi }, | 59 | .{ .arch = .powerpc, .os = .linux, .abi = .musleabi }, |
| 58 | .{ .arch = .powerpc, .os = .linux, .abi = .musleabihf }, | 60 | .{ .arch = .powerpc, .os = .linux, .abi = .musleabihf }, |
| 59 | .{ .arch = .powerpc64, .os = .linux, .abi = .gnu }, | 61 | .{ .arch = .powerpc64, .os = .linux, .abi = .gnu }, |
| 60 | .{ .arch = .powerpc64, .os = .linux, .abi = .musl }, | 62 | .{ .arch = .powerpc64, .os = .linux, .abi = .musl }, |
| 61 | .{ .arch = .powerpc64le, .os = .linux, .abi = .gnu, .glibc_min = .{ .major = 2, .minor = 19, .patch = 0 } }, | 63 | .{ .arch = .powerpc64le, .os = .linux, .abi = .gnu, .glibc_min = .{ .major = 2, .minor = 19, .patch = 0 } }, |
| 62 | .{ .arch = .powerpc64le, .os = .linux, .abi = .musl }, | 64 | .{ .arch = .powerpc64le, .os = .linux, .abi = .musl }, |
| 63 | .{ .arch = .riscv32, .os = .linux, .abi = .gnu, .glibc_min = .{ .major = 2, .minor = 33, .patch = 0 } }, | 65 | .{ .arch = .riscv32, .os = .linux, .abi = .gnu, .glibc_min = .{ .major = 2, .minor = 33, .patch = 0 }, .glibc_triple = "riscv32-linux-gnu-rv32imafdc-ilp32d" }, |
| 64 | .{ .arch = .riscv32, .os = .linux, .abi = .musl }, | 66 | .{ .arch = .riscv32, .os = .linux, .abi = .musl }, |
| 65 | .{ .arch = .riscv64, .os = .linux, .abi = .gnu, .glibc_min = .{ .major = 2, .minor = 27, .patch = 0 } }, | 67 | .{ .arch = .riscv64, .os = .linux, .abi = .gnu, .glibc_min = .{ .major = 2, .minor = 27, .patch = 0 }, .glibc_triple = "riscv64-linux-gnu-rv64imafdc-lp64d" }, |
| 66 | .{ .arch = .riscv64, .os = .linux, .abi = .musl }, | 68 | .{ .arch = .riscv64, .os = .linux, .abi = .musl }, |
| 67 | .{ .arch = .s390x, .os = .linux, .abi = .gnu }, | 69 | .{ .arch = .s390x, .os = .linux, .abi = .gnu }, |
| 68 | .{ .arch = .s390x, .os = .linux, .abi = .musl }, | 70 | .{ .arch = .s390x, .os = .linux, .abi = .musl }, |
| 69 | .{ .arch = .sparc, .os = .linux, .abi = .gnu }, | 71 | .{ .arch = .sparc, .os = .linux, .abi = .gnu, .glibc_triple = "sparcv9-linux-gnu" }, |
| 70 | .{ .arch = .sparc64, .os = .linux, .abi = .gnu }, | 72 | .{ .arch = .sparc64, .os = .linux, .abi = .gnu }, |
| 71 | .{ .arch = .wasm32, .os = .freestanding, .abi = .musl }, | 73 | .{ .arch = .wasm32, .os = .freestanding, .abi = .musl }, |
| 72 | .{ .arch = .wasm32, .os = .wasi, .abi = .musl }, | 74 | .{ .arch = .wasm32, .os = .wasi, .abi = .musl }, |
| ... | @@ -74,7 +76,7 @@ pub const available_libcs = [_]ArchOsAbi{ | ... | @@ -74,7 +76,7 @@ pub const available_libcs = [_]ArchOsAbi{ |
| 74 | .{ .arch = .x86, .os = .linux, .abi = .musl }, | 76 | .{ .arch = .x86, .os = .linux, .abi = .musl }, |
| 75 | .{ .arch = .x86, .os = .windows, .abi = .gnu }, | 77 | .{ .arch = .x86, .os = .windows, .abi = .gnu }, |
| 76 | .{ .arch = .x86_64, .os = .linux, .abi = .gnu }, | 78 | .{ .arch = .x86_64, .os = .linux, .abi = .gnu }, |
| 77 | .{ .arch = .x86_64, .os = .linux, .abi = .gnux32 }, | 79 | .{ .arch = .x86_64, .os = .linux, .abi = .gnux32, .glibc_triple = "x86_64-linux-gnu-x32" }, |
| 78 | .{ .arch = .x86_64, .os = .linux, .abi = .musl }, | 80 | .{ .arch = .x86_64, .os = .linux, .abi = .musl }, |
| 79 | .{ .arch = .x86_64, .os = .linux, .abi = .muslx32 }, | 81 | .{ .arch = .x86_64, .os = .linux, .abi = .muslx32 }, |
| 80 | .{ .arch = .x86_64, .os = .macos, .abi = .none, .os_ver = .{ .major = 10, .minor = 7, .patch = 0 } }, | 82 | .{ .arch = .x86_64, .os = .macos, .abi = .none, .os_ver = .{ .major = 10, .minor = 7, .patch = 0 } }, |
| ... | @@ -100,6 +102,31 @@ pub fn canBuildLibC(target: std.Target) bool { | ... | @@ -100,6 +102,31 @@ pub fn canBuildLibC(target: std.Target) bool { |
| 100 | return false; | 102 | return false; |
| 101 | } | 103 | } |
| 102 | | 104 | |
| | 105 | /// Returns the subdirectory triple to be used to find the correct glibc for the given `arch`, `os`, |
| | 106 | /// and `abi` in an installation directory created by glibc's `build-many-glibcs.py` script. |
| | 107 | /// |
| | 108 | /// `os` must be `.linux` or `.hurd`. `abi` must be a GNU ABI, i.e. `.isGnu()`. |
| | 109 | pub fn glibcRuntimeTriple( |
| | 110 | allocator: Allocator, |
| | 111 | arch: std.Target.Cpu.Arch, |
| | 112 | os: std.Target.Os.Tag, |
| | 113 | abi: std.Target.Abi, |
| | 114 | ) Allocator.Error![]const u8 { |
| | 115 | assert(abi.isGnu()); |
| | 116 | |
| | 117 | for (available_libcs) |libc| { |
| | 118 | if (libc.arch == arch and libc.os == os and libc.abi == abi) { |
| | 119 | if (libc.glibc_triple) |triple| return allocator.dupe(u8, triple); |
| | 120 | } |
| | 121 | } |
| | 122 | |
| | 123 | return switch (os) { |
| | 124 | .hurd => std.Target.hurdTupleSimple(allocator, arch, abi), |
| | 125 | .linux => std.Target.linuxTripleSimple(allocator, arch, os, abi), |
| | 126 | else => unreachable, |
| | 127 | }; |
| | 128 | } |
| | 129 | |
| 103 | pub fn muslArchName(arch: std.Target.Cpu.Arch, abi: std.Target.Abi) [:0]const u8 { | 130 | pub fn muslArchName(arch: std.Target.Cpu.Arch, abi: std.Target.Abi) [:0]const u8 { |
| 104 | return switch (abi) { | 131 | return switch (abi) { |
| 105 | .muslabin32 => "mipsn32", | 132 | .muslabin32 => "mipsn32", |
| ... | @@ -275,3 +302,5 @@ fn eqlIgnoreCase(ignore_case: bool, a: []const u8, b: []const u8) bool { | ... | @@ -275,3 +302,5 @@ fn eqlIgnoreCase(ignore_case: bool, a: []const u8, b: []const u8) bool { |
| 275 | } | 302 | } |
| 276 | | 303 | |
| 277 | const std = @import("std"); | 304 | const std = @import("std"); |
| | 305 | const assert = std.debug.assert; |
| | 306 | const Allocator = std.mem.Allocator; |