| ... | @@ -11,10 +11,16 @@ pub const ArchOsAbi = struct { | ... | @@ -11,10 +11,16 @@ pub const ArchOsAbi = struct { |
| 11 | os: std.Target.Os.Tag, | 11 | os: std.Target.Os.Tag, |
| 12 | abi: std.Target.Abi, | 12 | abi: std.Target.Abi, |
| 13 | os_ver: ?std.SemanticVersion = null, | 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 | pub const available_libcs = [_]ArchOsAbi{ | 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 | .{ .arch = .aarch64_be, .os = .linux, .abi = .musl }, | 24 | .{ .arch = .aarch64_be, .os = .linux, .abi = .musl }, |
| 19 | .{ .arch = .aarch64_be, .os = .windows, .abi = .gnu }, | 25 | .{ .arch = .aarch64_be, .os = .windows, .abi = .gnu }, |
| 20 | .{ .arch = .aarch64, .os = .linux, .abi = .gnu }, | 26 | .{ .arch = .aarch64, .os = .linux, .abi = .gnu }, |
| ... | @@ -54,14 +60,14 @@ pub const available_libcs = [_]ArchOsAbi{ | ... | @@ -54,14 +60,14 @@ pub const available_libcs = [_]ArchOsAbi{ |
| 54 | .{ .arch = .mips, .os = .linux, .abi = .gnueabi }, | 60 | .{ .arch = .mips, .os = .linux, .abi = .gnueabi }, |
| 55 | .{ .arch = .mips, .os = .linux, .abi = .gnueabihf }, | 61 | .{ .arch = .mips, .os = .linux, .abi = .gnueabihf }, |
| 56 | .{ .arch = .mips, .os = .linux, .abi = .musl }, | 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 | .{ .arch = .powerpc64le, .os = .linux, .abi = .musl }, | 64 | .{ .arch = .powerpc64le, .os = .linux, .abi = .musl }, |
| 59 | .{ .arch = .powerpc64, .os = .linux, .abi = .gnu }, | 65 | .{ .arch = .powerpc64, .os = .linux, .abi = .gnu }, |
| 60 | .{ .arch = .powerpc64, .os = .linux, .abi = .musl }, | 66 | .{ .arch = .powerpc64, .os = .linux, .abi = .musl }, |
| 61 | .{ .arch = .powerpc, .os = .linux, .abi = .gnueabi }, | 67 | .{ .arch = .powerpc, .os = .linux, .abi = .gnueabi }, |
| 62 | .{ .arch = .powerpc, .os = .linux, .abi = .gnueabihf }, | 68 | .{ .arch = .powerpc, .os = .linux, .abi = .gnueabihf }, |
| 63 | .{ .arch = .powerpc, .os = .linux, .abi = .musl }, | 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 | .{ .arch = .riscv64, .os = .linux, .abi = .musl }, | 71 | .{ .arch = .riscv64, .os = .linux, .abi = .musl }, |
| 66 | .{ .arch = .s390x, .os = .linux, .abi = .gnu }, | 72 | .{ .arch = .s390x, .os = .linux, .abi = .gnu }, |
| 67 | .{ .arch = .s390x, .os = .linux, .abi = .musl }, | 73 | .{ .arch = .s390x, .os = .linux, .abi = .musl }, |
| ... | @@ -76,6 +82,9 @@ pub const available_libcs = [_]ArchOsAbi{ | ... | @@ -76,6 +82,9 @@ pub const available_libcs = [_]ArchOsAbi{ |
| 76 | .{ .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 } }, |
| 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 | pub fn libCGenericName(target: std.Target) [:0]const u8 { | 88 | pub fn libCGenericName(target: std.Target) [:0]const u8 { |
| 80 | switch (target.os.tag) { | 89 | switch (target.os.tag) { |
| 81 | .windows => return "mingw", | 90 | .windows => return "mingw", |
| ... | @@ -154,6 +163,12 @@ pub fn canBuildLibC(target: std.Target) bool { | ... | @@ -154,6 +163,12 @@ pub fn canBuildLibC(target: std.Target) bool { |
| 154 | const ver = target.os.version_range.semver; | 163 | const ver = target.os.version_range.semver; |
| 155 | return ver.min.order(libc.os_ver.?) != .lt; | 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 | return true; | 172 | return true; |
| 158 | } | 173 | } |
| 159 | } | 174 | } |