Skip to content

Commit 80ac911

Browse files
committed
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 parent f02659d commit 80ac911

File tree

1 file changed

+48
-19
lines changed

1 file changed

+48
-19
lines changed

lib/std/zig/target.zig

Lines changed: 48 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ pub const ArchOsAbi = struct {
44
abi: std.Target.Abi,
55
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.
88
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,
911
};
1012

1113
pub const available_libcs = [_]ArchOsAbi{
@@ -29,52 +31,52 @@ pub const available_libcs = [_]ArchOsAbi{
2931
.{ .arch = .aarch64, .os = .windows, .abi = .gnu },
3032
.{ .arch = .aarch64_be, .os = .linux, .abi = .gnu, .glibc_min = .{ .major = 2, .minor = 17, .patch = 0 } },
3133
.{ .arch = .aarch64_be, .os = .linux, .abi = .musl },
32-
.{ .arch = .csky, .os = .linux, .abi = .gnueabi, .glibc_min = .{ .major = 2, .minor = 29, .patch = 0 } },
33-
.{ .arch = .csky, .os = .linux, .abi = .gnueabihf, .glibc_min = .{ .major = 2, .minor = 29, .patch = 0 } },
34-
.{ .arch = .loongarch64, .os = .linux, .abi = .gnu, .glibc_min = .{ .major = 2, .minor = 36, .patch = 0 } },
35-
.{ .arch = .loongarch64, .os = .linux, .abi = .gnusf, .glibc_min = .{ .major = 2, .minor = 36, .patch = 0 } },
34+
.{ .arch = .csky, .os = .linux, .abi = .gnueabi, .glibc_min = .{ .major = 2, .minor = 29, .patch = 0 }, .glibc_triple = "csky-linux-gnuabiv2-soft" },
35+
.{ .arch = .csky, .os = .linux, .abi = .gnueabihf, .glibc_min = .{ .major = 2, .minor = 29, .patch = 0 }, .glibc_triple = "csky-linux-gnuabiv2" },
36+
.{ .arch = .loongarch64, .os = .linux, .abi = .gnu, .glibc_min = .{ .major = 2, .minor = 36, .patch = 0 }, .glibc_triple = "loongarch64-linux-gnu-lp64d" },
37+
.{ .arch = .loongarch64, .os = .linux, .abi = .gnusf, .glibc_min = .{ .major = 2, .minor = 36, .patch = 0 }, .glibc_triple = "loongarch64-linux-gnu-lp64s" },
3638
.{ .arch = .loongarch64, .os = .linux, .abi = .musl },
3739
.{ .arch = .m68k, .os = .linux, .abi = .gnu },
3840
.{ .arch = .m68k, .os = .linux, .abi = .musl },
39-
.{ .arch = .mips, .os = .linux, .abi = .gnueabi },
40-
.{ .arch = .mips, .os = .linux, .abi = .gnueabihf },
41+
.{ .arch = .mips, .os = .linux, .abi = .gnueabi, .glibc_triple = "mips-linux-gnu-soft" },
42+
.{ .arch = .mips, .os = .linux, .abi = .gnueabihf, .glibc_triple = "mips-linux-gnu" },
4143
.{ .arch = .mips, .os = .linux, .abi = .musleabi },
4244
.{ .arch = .mips, .os = .linux, .abi = .musleabihf },
43-
.{ .arch = .mipsel, .os = .linux, .abi = .gnueabi },
44-
.{ .arch = .mipsel, .os = .linux, .abi = .gnueabihf },
45+
.{ .arch = .mipsel, .os = .linux, .abi = .gnueabi, .glibc_triple = "mipsel-linux-gnu-soft" },
46+
.{ .arch = .mipsel, .os = .linux, .abi = .gnueabihf, .glibc_triple = "mipsel-linux-gnu" },
4547
.{ .arch = .mipsel, .os = .linux, .abi = .musleabi },
4648
.{ .arch = .mipsel, .os = .linux, .abi = .musleabihf },
47-
.{ .arch = .mips64, .os = .linux, .abi = .gnuabi64 },
48-
.{ .arch = .mips64, .os = .linux, .abi = .gnuabin32 },
49+
.{ .arch = .mips64, .os = .linux, .abi = .gnuabi64, .glibc_triple = "mips64-linux-gnu-n64" },
50+
.{ .arch = .mips64, .os = .linux, .abi = .gnuabin32, .glibc_triple = "mips64-linux-gnu-n32" },
4951
.{ .arch = .mips64, .os = .linux, .abi = .muslabi64 },
5052
.{ .arch = .mips64, .os = .linux, .abi = .muslabin32 },
51-
.{ .arch = .mips64el, .os = .linux, .abi = .gnuabi64 },
52-
.{ .arch = .mips64el, .os = .linux, .abi = .gnuabin32 },
53+
.{ .arch = .mips64el, .os = .linux, .abi = .gnuabi64, .glibc_triple = "mips64el-linux-gnu-n64" },
54+
.{ .arch = .mips64el, .os = .linux, .abi = .gnuabin32, .glibc_triple = "mips64el-linux-gnu-n32" },
5355
.{ .arch = .mips64el, .os = .linux, .abi = .muslabi64 },
5456
.{ .arch = .mips64el, .os = .linux, .abi = .muslabin32 },
55-
.{ .arch = .powerpc, .os = .linux, .abi = .gnueabi },
56-
.{ .arch = .powerpc, .os = .linux, .abi = .gnueabihf },
57+
.{ .arch = .powerpc, .os = .linux, .abi = .gnueabi, .glibc_triple = "powerpc-linux-gnu-soft" },
58+
.{ .arch = .powerpc, .os = .linux, .abi = .gnueabihf, .glibc_triple = "powerpc-linux-gnu" },
5759
.{ .arch = .powerpc, .os = .linux, .abi = .musleabi },
5860
.{ .arch = .powerpc, .os = .linux, .abi = .musleabihf },
5961
.{ .arch = .powerpc64, .os = .linux, .abi = .gnu },
6062
.{ .arch = .powerpc64, .os = .linux, .abi = .musl },
6163
.{ .arch = .powerpc64le, .os = .linux, .abi = .gnu, .glibc_min = .{ .major = 2, .minor = 19, .patch = 0 } },
6264
.{ .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" },
6466
.{ .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" },
6668
.{ .arch = .riscv64, .os = .linux, .abi = .musl },
6769
.{ .arch = .s390x, .os = .linux, .abi = .gnu },
6870
.{ .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" },
7072
.{ .arch = .sparc64, .os = .linux, .abi = .gnu },
7173
.{ .arch = .wasm32, .os = .freestanding, .abi = .musl },
7274
.{ .arch = .wasm32, .os = .wasi, .abi = .musl },
7375
.{ .arch = .x86, .os = .linux, .abi = .gnu },
7476
.{ .arch = .x86, .os = .linux, .abi = .musl },
7577
.{ .arch = .x86, .os = .windows, .abi = .gnu },
7678
.{ .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" },
7880
.{ .arch = .x86_64, .os = .linux, .abi = .musl },
7981
.{ .arch = .x86_64, .os = .linux, .abi = .muslx32 },
8082
.{ .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 {
100102
return false;
101103
}
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()`.
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+
103130
pub fn muslArchName(arch: std.Target.Cpu.Arch, abi: std.Target.Abi) [:0]const u8 {
104131
return switch (abi) {
105132
.muslabin32 => "mipsn32",
@@ -275,3 +302,5 @@ fn eqlIgnoreCase(ignore_case: bool, a: []const u8, b: []const u8) bool {
275302
}
276303

277304
const std = @import("std");
305+
const assert = std.debug.assert;
306+
const Allocator = std.mem.Allocator;

0 commit comments

Comments
 (0)