authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-11-28 17:09:18+01:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-11-28 17:18:00+01:00
log80ac91172f36be763222b2089c9dc4fee8e351eb
tree8860f31325160010bc340365cd46a69aec24e683
parentf02659d93c1e825c6b40f675efb9e8c05c7dcafd
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

std.zig.target: Add glibcRuntimeTriple() function.

This lets us centralize the logic for constructing a target triple that matches the format used by glibc's build-many-glibcs.py script.

1 files changed, 48 insertions(+), 19 deletions(-)

lib/std/zig/target.zig+48-19
...@@ -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,
66
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};
1012
11pub const available_libcs = [_]ArchOsAbi{13pub 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}
102104
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()`.
109pub 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
103pub fn muslArchName(arch: std.Target.Cpu.Arch, abi: std.Target.Abi) [:0]const u8 {130pub 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}
276303
277const std = @import("std");304const std = @import("std");
305const assert = std.debug.assert;
306const Allocator = std.mem.Allocator;