@@ -4,8 +4,10 @@ pub const ArchOsAbi = struct {
4
4
abi : std.Target.Abi ,
5
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
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
13
pub const available_libcs = [_ ]ArchOsAbi {
@@ -29,52 +31,52 @@ pub const available_libcs = [_]ArchOsAbi{
29
31
.{ .arch = .aarch64 , .os = .windows , .abi = .gnu },
30
32
.{ .arch = .aarch64_be , .os = .linux , .abi = .gnu , .glibc_min = .{ .major = 2 , .minor = 17 , .patch = 0 } },
31
33
.{ .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" },
36
38
.{ .arch = .loongarch64 , .os = .linux , .abi = .musl },
37
39
.{ .arch = .m68k , .os = .linux , .abi = .gnu },
38
40
.{ .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" },
41
43
.{ .arch = .mips , .os = .linux , .abi = .musleabi },
42
44
.{ .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" },
45
47
.{ .arch = .mipsel , .os = .linux , .abi = .musleabi },
46
48
.{ .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" },
49
51
.{ .arch = .mips64 , .os = .linux , .abi = .muslabi64 },
50
52
.{ .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" },
53
55
.{ .arch = .mips64el , .os = .linux , .abi = .muslabi64 },
54
56
.{ .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" },
57
59
.{ .arch = .powerpc , .os = .linux , .abi = .musleabi },
58
60
.{ .arch = .powerpc , .os = .linux , .abi = .musleabihf },
59
61
.{ .arch = .powerpc64 , .os = .linux , .abi = .gnu },
60
62
.{ .arch = .powerpc64 , .os = .linux , .abi = .musl },
61
63
.{ .arch = .powerpc64le , .os = .linux , .abi = .gnu , .glibc_min = .{ .major = 2 , .minor = 19 , .patch = 0 } },
62
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
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
68
.{ .arch = .riscv64 , .os = .linux , .abi = .musl },
67
69
.{ .arch = .s390x , .os = .linux , .abi = .gnu },
68
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
72
.{ .arch = .sparc64 , .os = .linux , .abi = .gnu },
71
73
.{ .arch = .wasm32 , .os = .freestanding , .abi = .musl },
72
74
.{ .arch = .wasm32 , .os = .wasi , .abi = .musl },
73
75
.{ .arch = .x86 , .os = .linux , .abi = .gnu },
74
76
.{ .arch = .x86 , .os = .linux , .abi = .musl },
75
77
.{ .arch = .x86 , .os = .windows , .abi = .gnu },
76
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
80
.{ .arch = .x86_64 , .os = .linux , .abi = .musl },
79
81
.{ .arch = .x86_64 , .os = .linux , .abi = .muslx32 },
80
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
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
130
pub fn muslArchName (arch : std.Target.Cpu.Arch , abi : std.Target.Abi ) [:0 ]const u8 {
104
131
return switch (abi ) {
105
132
.muslabin32 = > "mipsn32" ,
@@ -275,3 +302,5 @@ fn eqlIgnoreCase(ignore_case: bool, a: []const u8, b: []const u8) bool {
275
302
}
276
303
277
304
const std = @import ("std" );
305
+ const assert = std .debug .assert ;
306
+ const Allocator = std .mem .Allocator ;
0 commit comments