| ... | ... | @@ -11,10 +11,16 @@ pub const ArchOsAbi = struct { |
| 11 | 11 | os: std.Target.Os.Tag, |
| 12 | 12 | abi: std.Target.Abi, |
| 13 | 13 | os_ver: ?std.SemanticVersion = null, |
| 14 | |
| 15 | // Minimum glibc version that provides support for the arch/os (for |
| 16 | // .abi = .gnu). For most entries, the .glibc_min is null, |
| 17 | // meaning the Zig minimum required by the standard library (see |
| 18 | // glibc_min_version) is sufficient. |
| 19 | glibc_min: ?std.SemanticVersion = null, |
| 14 | 20 | }; |
| 15 | 21 | |
| 16 | 22 | pub const available_libcs = [_]ArchOsAbi{ |
| 17 | | .{ .arch = .aarch64_be, .os = .linux, .abi = .gnu }, |
| 23 | .{ .arch = .aarch64_be, .os = .linux, .abi = .gnu, .glibc_min = .{ .major = 2, .minor = 17, .patch = 0 } }, |
| 18 | 24 | .{ .arch = .aarch64_be, .os = .linux, .abi = .musl }, |
| 19 | 25 | .{ .arch = .aarch64_be, .os = .windows, .abi = .gnu }, |
| 20 | 26 | .{ .arch = .aarch64, .os = .linux, .abi = .gnu }, |
| ... | ... | @@ -54,14 +60,14 @@ pub const available_libcs = [_]ArchOsAbi{ |
| 54 | 60 | .{ .arch = .mips, .os = .linux, .abi = .gnueabi }, |
| 55 | 61 | .{ .arch = .mips, .os = .linux, .abi = .gnueabihf }, |
| 56 | 62 | .{ .arch = .mips, .os = .linux, .abi = .musl }, |
| 57 | | .{ .arch = .powerpc64le, .os = .linux, .abi = .gnu }, |
| 63 | .{ .arch = .powerpc64le, .os = .linux, .abi = .gnu, .glibc_min = .{ .major = 2, .minor = 19, .patch = 0 } }, |
| 58 | 64 | .{ .arch = .powerpc64le, .os = .linux, .abi = .musl }, |
| 59 | 65 | .{ .arch = .powerpc64, .os = .linux, .abi = .gnu }, |
| 60 | 66 | .{ .arch = .powerpc64, .os = .linux, .abi = .musl }, |
| 61 | 67 | .{ .arch = .powerpc, .os = .linux, .abi = .gnueabi }, |
| 62 | 68 | .{ .arch = .powerpc, .os = .linux, .abi = .gnueabihf }, |
| 63 | 69 | .{ .arch = .powerpc, .os = .linux, .abi = .musl }, |
| 64 | | .{ .arch = .riscv64, .os = .linux, .abi = .gnu }, |
| 70 | .{ .arch = .riscv64, .os = .linux, .abi = .gnu, .glibc_min = .{ .major = 2, .minor = 27, .patch = 0 } }, |
| 65 | 71 | .{ .arch = .riscv64, .os = .linux, .abi = .musl }, |
| 66 | 72 | .{ .arch = .s390x, .os = .linux, .abi = .gnu }, |
| 67 | 73 | .{ .arch = .s390x, .os = .linux, .abi = .musl }, |
| ... | ... | @@ -76,6 +82,9 @@ pub const available_libcs = [_]ArchOsAbi{ |
| 76 | 82 | .{ .arch = .x86_64, .os = .macos, .abi = .none, .os_ver = .{ .major = 10, .minor = 7, .patch = 0 } }, |
| 77 | 83 | }; |
| 78 | 84 | |
| 85 | /// Minimum glibc version, due to dependencies from the Zig standard library on glibc symbols |
| 86 | pub const glibc_min_version: std.SemanticVersion = .{ .major = 2, .minor = 17, .patch = 0 }; |
| 87 | |
| 79 | 88 | pub fn libCGenericName(target: std.Target) [:0]const u8 { |
| 80 | 89 | switch (target.os.tag) { |
| 81 | 90 | .windows => return "mingw", |
| ... | ... | @@ -154,6 +163,12 @@ pub fn canBuildLibC(target: std.Target) bool { |
| 154 | 163 | const ver = target.os.version_range.semver; |
| 155 | 164 | return ver.min.order(libc.os_ver.?) != .lt; |
| 156 | 165 | } |
| 166 | // Ensure glibc (aka *-linux-gnu) version is supported |
| 167 | if ((target.os.tag == .linux) and target.abi.isGnu()) { |
| 168 | const min_glibc_ver = libc.glibc_min orelse glibc_min_version; |
| 169 | const target_glibc_ver = target.os.version_range.linux.glibc; |
| 170 | return target_glibc_ver.order(min_glibc_ver) != .lt; |
| 171 | } |
| 157 | 172 | return true; |
| 158 | 173 | } |
| 159 | 174 | } |