diff --git a/lib/compiler/aro/aro/target.zig b/lib/compiler/aro/aro/target.zig index b1ffcd6e7e..d3a20ee892 100644 --- a/lib/compiler/aro/aro/target.zig +++ b/lib/compiler/aro/aro/target.zig @@ -719,7 +719,7 @@ pub fn toLLVMTriple(target: std.Target, buf: []u8) []const u8 { test "alignment functions - smoke test" { var target: std.Target = undefined; const x86 = std.Target.Cpu.Arch.x86_64; - target.os = std.Target.Os.Tag.defaultVersionRange(.linux, x86); + target.os = std.Target.Os.Tag.defaultVersionRange(.linux, x86, .none); target.cpu = std.Target.Cpu.baseline(x86, target.os); target.abi = std.Target.Abi.default(x86, target.os); @@ -732,7 +732,7 @@ test "alignment functions - smoke test" { try std.testing.expect(systemCompiler(target) == .gcc); const arm = std.Target.Cpu.Arch.arm; - target.os = std.Target.Os.Tag.defaultVersionRange(.ios, arm); + target.os = std.Target.Os.Tag.defaultVersionRange(.ios, arm, .none); target.cpu = std.Target.Cpu.baseline(arm, target.os); target.abi = std.Target.Abi.default(arm, target.os); @@ -751,7 +751,7 @@ test "target size/align tests" { const x86 = std.Target.Cpu.Arch.x86; comp.target.cpu.arch = x86; comp.target.cpu.model = &std.Target.x86.cpu.i586; - comp.target.os = std.Target.Os.Tag.defaultVersionRange(.linux, x86); + comp.target.os = std.Target.Os.Tag.defaultVersionRange(.linux, x86, .none); comp.target.abi = std.Target.Abi.gnu; const tt: Type = .{ @@ -763,7 +763,7 @@ test "target size/align tests" { const arm = std.Target.Cpu.Arch.arm; comp.target.cpu = std.Target.Cpu.Model.toCpu(&std.Target.arm.cpu.cortex_r4, arm); - comp.target.os = std.Target.Os.Tag.defaultVersionRange(.ios, arm); + comp.target.os = std.Target.Os.Tag.defaultVersionRange(.ios, arm, .none); comp.target.abi = std.Target.Abi.none; const ct: Type = .{ diff --git a/lib/std/Target.zig b/lib/std/Target.zig index 476d7a6f8d..95aef4a7c7 100644 --- a/lib/std/Target.zig +++ b/lib/std/Target.zig @@ -148,10 +148,10 @@ pub const Os = struct { return (tag == .hurd or tag == .linux) and abi.isGnu(); } - pub fn defaultVersionRange(tag: Tag, arch: Cpu.Arch) Os { + pub fn defaultVersionRange(tag: Tag, arch: Cpu.Arch, abi: Abi) Os { return .{ .tag = tag, - .version_range = VersionRange.default(tag, arch), + .version_range = .default(arch, tag, abi), }; } @@ -416,7 +416,7 @@ pub const Os = struct { /// The default `VersionRange` represents the range that the Zig Standard Library /// bases its abstractions on. - pub fn default(tag: Tag, arch: Cpu.Arch) VersionRange { + pub fn default(arch: Cpu.Arch, tag: Tag, abi: Abi) VersionRange { return switch (tag) { .freestanding, .other, @@ -475,16 +475,26 @@ pub const Os = struct { .linux => .{ .linux = .{ .range = .{ - .min = .{ .major = 4, .minor = 19, .patch = 0 }, + .min = blk: { + const default_min: std.SemanticVersion = .{ .major = 4, .minor = 19, .patch = 0 }; + + for (std.zig.target.available_libcs) |libc| { + if (libc.arch != arch or libc.os != tag or libc.abi != abi) continue; + + if (libc.os_ver) |min| { + if (min.order(default_min) == .gt) break :blk min; + } + } + + break :blk default_min; + }, .max = .{ .major = 6, .minor = 11, .patch = 5 }, }, .glibc = blk: { const default_min: std.SemanticVersion = .{ .major = 2, .minor = 28, .patch = 0 }; for (std.zig.target.available_libcs) |libc| { - // We don't know the ABI here. We can get away with not checking it - // for now, but that may not always remain true. - if (libc.os != tag or libc.arch != arch) continue; + if (libc.os != tag or libc.arch != arch or libc.abi != abi) continue; if (libc.glibc_min) |min| { if (min.order(default_min) == .gt) break :blk min; diff --git a/lib/std/zig/system.zig b/lib/std/zig/system.zig index 48b195dc3e..591e369ff7 100644 --- a/lib/std/zig/system.zig +++ b/lib/std/zig/system.zig @@ -181,8 +181,12 @@ pub const DetectError = error{ /// components by detecting the native system, and then resolves /// standard/default parts relative to that. pub fn resolveTargetQuery(query: Target.Query) DetectError!Target { + // Until https://github.com/ziglang/zig/issues/4592 is implemented (support detecting the + // native CPU architecture as being different than the current target), we use this: + const query_cpu_arch = query.cpu_arch orelse builtin.cpu.arch; const query_os_tag = query.os_tag orelse builtin.os.tag; - var os = query_os_tag.defaultVersionRange(query.cpu_arch orelse builtin.cpu.arch); + const query_abi = query.abi orelse builtin.abi; + var os = query_os_tag.defaultVersionRange(query_cpu_arch, query_abi); if (query.os_tag == null) { switch (builtin.target.os.tag) { .linux => { @@ -338,29 +342,58 @@ pub fn resolveTargetQuery(query: Target.Query) DetectError!Target { os.version_range.linux.android = android; } - // Until https://github.com/ziglang/zig/issues/4592 is implemented (support detecting the - // native CPU architecture as being different than the current target), we use this: - const cpu_arch = query.cpu_arch orelse builtin.cpu.arch; - const cpu = switch (query.cpu_model) { - .native => detectNativeCpuAndFeatures(cpu_arch, os, query), - .baseline => Target.Cpu.baseline(cpu_arch, os), + .native => detectNativeCpuAndFeatures(query_cpu_arch, os, query), + .baseline => Target.Cpu.baseline(query_cpu_arch, os), .determined_by_arch_os => if (query.cpu_arch == null) - detectNativeCpuAndFeatures(cpu_arch, os, query) + detectNativeCpuAndFeatures(query_cpu_arch, os, query) else - Target.Cpu.baseline(cpu_arch, os), - .explicit => |model| model.toCpu(cpu_arch), + Target.Cpu.baseline(query_cpu_arch, os), + .explicit => |model| model.toCpu(query_cpu_arch), } orelse backup_cpu_detection: { - break :backup_cpu_detection Target.Cpu.baseline(cpu_arch, os); + break :backup_cpu_detection Target.Cpu.baseline(query_cpu_arch, os); }; + var result = try detectAbiAndDynamicLinker(cpu, os, query); + + // It's possible that we detect the native ABI, but fail to detect the OS version or were told + // to use the default OS version range. In that case, while we can't determine the exact native + // OS version, we do at least know that some ABIs require a particular OS version (by way of + // `std.zig.target.available_libcs`). So in this case, adjust the OS version to the minimum that + // we know is required. + if (result.abi != query_abi and query.os_version_min == null) { + const result_ver_range = &result.os.version_range; + const abi_ver_range = result.os.tag.defaultVersionRange(result.cpu.arch, result.abi).version_range; + + switch (result.os.tag.versionRangeTag()) { + .none => {}, + .semver => if (result_ver_range.semver.min.order(abi_ver_range.semver.min) == .lt) { + result_ver_range.semver.min = abi_ver_range.semver.min; + }, + inline .hurd, .linux => |t| { + if (@field(result_ver_range, @tagName(t)).range.min.order(@field(abi_ver_range, @tagName(t)).range.min) == .lt) { + @field(result_ver_range, @tagName(t)).range.min = @field(abi_ver_range, @tagName(t)).range.min; + } + + if (@field(result_ver_range, @tagName(t)).glibc.order(@field(abi_ver_range, @tagName(t)).glibc) == .lt and + query.glibc_version == null) + { + @field(result_ver_range, @tagName(t)).glibc = @field(abi_ver_range, @tagName(t)).glibc; + } + }, + .windows => if (!result_ver_range.windows.min.isAtLeast(abi_ver_range.windows.min)) { + result_ver_range.windows.min = abi_ver_range.windows.min; + }, + } + } + // For x86, we need to populate some CPU feature flags depending on architecture // and mode: // * 16bit_mode => if the abi is code16 // * 32bit_mode => if the arch is x86 // However, the "mode" flags can be used as overrides, so if the user explicitly // sets one of them, that takes precedence. - switch (cpu_arch) { + switch (result.cpu.arch) { .x86 => { if (!Target.x86.featureSetHasAny(query.cpu_features_add, .{ .@"16bit_mode", .@"32bit_mode", @@ -388,12 +421,12 @@ pub fn resolveTargetQuery(query: Target.Query) DetectError!Target { } updateCpuFeatures( &result.cpu.features, - cpu_arch.allFeaturesList(), + result.cpu.arch.allFeaturesList(), query.cpu_features_add, query.cpu_features_sub, ); - if (cpu_arch == .hexagon) { + if (result.cpu.arch == .hexagon) { // Both LLVM and LLD have broken support for the small data area. Yet LLVM has the feature // on by default for all Hexagon CPUs. Clang sort of solves this by defaulting the `-gpsize` // command line parameter for the Hexagon backend to 0, so that no constants get placed in diff --git a/lib/std/zig/target.zig b/lib/std/zig/target.zig index 077e7090a8..fad198a4eb 100644 --- a/lib/std/zig/target.zig +++ b/lib/std/zig/target.zig @@ -4,80 +4,81 @@ pub const ArchOsAbi = struct { abi: std.Target.Abi, os_ver: ?std.SemanticVersion = null, - /// Minimum glibc version that provides support for the arch/os when ABI is GNU. + /// Minimum glibc version that provides support for the arch/OS when ABI is GNU. Note that Zig + /// can only target glibc 2.2.5+, so `null` means the minimum is older than that. glibc_min: ?std.SemanticVersion = null, /// Override for `glibcRuntimeTriple` when glibc has an unusual directory name for the target. glibc_triple: ?[]const u8 = null, }; pub const available_libcs = [_]ArchOsAbi{ - .{ .arch = .arc, .os = .linux, .abi = .gnu, .glibc_min = .{ .major = 2, .minor = 32, .patch = 0 } }, - .{ .arch = .arm, .os = .linux, .abi = .gnueabi }, - .{ .arch = .arm, .os = .linux, .abi = .gnueabihf }, - .{ .arch = .arm, .os = .linux, .abi = .musleabi }, - .{ .arch = .arm, .os = .linux, .abi = .musleabihf }, - .{ .arch = .armeb, .os = .linux, .abi = .gnueabi }, - .{ .arch = .armeb, .os = .linux, .abi = .gnueabihf }, - .{ .arch = .armeb, .os = .linux, .abi = .musleabi }, - .{ .arch = .armeb, .os = .linux, .abi = .musleabihf }, - .{ .arch = .thumb, .os = .linux, .abi = .musleabi }, - .{ .arch = .thumb, .os = .linux, .abi = .musleabihf }, + .{ .arch = .arc, .os = .linux, .abi = .gnu, .os_ver = .{ .major = 4, .minor = 2, .patch = 0 }, .glibc_min = .{ .major = 2, .minor = 32, .patch = 0 } }, + .{ .arch = .arm, .os = .linux, .abi = .gnueabi, .os_ver = .{ .major = 2, .minor = 1, .patch = 0 } }, + .{ .arch = .arm, .os = .linux, .abi = .gnueabihf, .os_ver = .{ .major = 2, .minor = 1, .patch = 0 } }, + .{ .arch = .arm, .os = .linux, .abi = .musleabi, .os_ver = .{ .major = 2, .minor = 1, .patch = 0 } }, + .{ .arch = .arm, .os = .linux, .abi = .musleabihf, .os_ver = .{ .major = 2, .minor = 1, .patch = 0 } }, + .{ .arch = .armeb, .os = .linux, .abi = .gnueabi, .os_ver = .{ .major = 2, .minor = 6, .patch = 0 } }, + .{ .arch = .armeb, .os = .linux, .abi = .gnueabihf, .os_ver = .{ .major = 2, .minor = 6, .patch = 0 } }, + .{ .arch = .armeb, .os = .linux, .abi = .musleabi, .os_ver = .{ .major = 2, .minor = 6, .patch = 0 } }, + .{ .arch = .armeb, .os = .linux, .abi = .musleabihf, .os_ver = .{ .major = 2, .minor = 6, .patch = 0 } }, + .{ .arch = .thumb, .os = .linux, .abi = .musleabi, .os_ver = .{ .major = 2, .minor = 1, .patch = 0 } }, + .{ .arch = .thumb, .os = .linux, .abi = .musleabihf, .os_ver = .{ .major = 2, .minor = 1, .patch = 0 } }, .{ .arch = .thumb, .os = .windows, .abi = .gnu }, - .{ .arch = .thumbeb, .os = .linux, .abi = .musleabi }, - .{ .arch = .thumbeb, .os = .linux, .abi = .musleabihf }, - .{ .arch = .aarch64, .os = .linux, .abi = .gnu, .glibc_min = .{ .major = 2, .minor = 17, .patch = 0 } }, - .{ .arch = .aarch64, .os = .linux, .abi = .musl }, + .{ .arch = .thumbeb, .os = .linux, .abi = .musleabi, .os_ver = .{ .major = 2, .minor = 6, .patch = 0 } }, + .{ .arch = .thumbeb, .os = .linux, .abi = .musleabihf, .os_ver = .{ .major = 2, .minor = 6, .patch = 0 } }, + .{ .arch = .aarch64, .os = .linux, .abi = .gnu, .os_ver = .{ .major = 3, .minor = 7, .patch = 0 }, .glibc_min = .{ .major = 2, .minor = 17, .patch = 0 } }, + .{ .arch = .aarch64, .os = .linux, .abi = .musl, .os_ver = .{ .major = 3, .minor = 7, .patch = 0 } }, .{ .arch = .aarch64, .os = .macos, .abi = .none, .os_ver = .{ .major = 11, .minor = 0, .patch = 0 } }, .{ .arch = .aarch64, .os = .windows, .abi = .gnu }, - .{ .arch = .aarch64_be, .os = .linux, .abi = .gnu, .glibc_min = .{ .major = 2, .minor = 17, .patch = 0 } }, - .{ .arch = .aarch64_be, .os = .linux, .abi = .musl }, - .{ .arch = .csky, .os = .linux, .abi = .gnueabi, .glibc_min = .{ .major = 2, .minor = 29, .patch = 0 }, .glibc_triple = "csky-linux-gnuabiv2-soft" }, - .{ .arch = .csky, .os = .linux, .abi = .gnueabihf, .glibc_min = .{ .major = 2, .minor = 29, .patch = 0 }, .glibc_triple = "csky-linux-gnuabiv2" }, - .{ .arch = .loongarch64, .os = .linux, .abi = .gnu, .glibc_min = .{ .major = 2, .minor = 36, .patch = 0 }, .glibc_triple = "loongarch64-linux-gnu-lp64d" }, - .{ .arch = .loongarch64, .os = .linux, .abi = .gnusf, .glibc_min = .{ .major = 2, .minor = 36, .patch = 0 }, .glibc_triple = "loongarch64-linux-gnu-lp64s" }, - .{ .arch = .loongarch64, .os = .linux, .abi = .musl }, - .{ .arch = .m68k, .os = .linux, .abi = .gnu }, - .{ .arch = .m68k, .os = .linux, .abi = .musl }, - .{ .arch = .mips, .os = .linux, .abi = .gnueabi, .glibc_triple = "mips-linux-gnu-soft" }, - .{ .arch = .mips, .os = .linux, .abi = .gnueabihf, .glibc_triple = "mips-linux-gnu" }, - .{ .arch = .mips, .os = .linux, .abi = .musleabi }, - .{ .arch = .mips, .os = .linux, .abi = .musleabihf }, - .{ .arch = .mipsel, .os = .linux, .abi = .gnueabi, .glibc_triple = "mipsel-linux-gnu-soft" }, - .{ .arch = .mipsel, .os = .linux, .abi = .gnueabihf, .glibc_triple = "mipsel-linux-gnu" }, - .{ .arch = .mipsel, .os = .linux, .abi = .musleabi }, - .{ .arch = .mipsel, .os = .linux, .abi = .musleabihf }, - .{ .arch = .mips64, .os = .linux, .abi = .gnuabi64, .glibc_triple = "mips64-linux-gnu-n64" }, - .{ .arch = .mips64, .os = .linux, .abi = .gnuabin32, .glibc_triple = "mips64-linux-gnu-n32" }, - .{ .arch = .mips64, .os = .linux, .abi = .muslabi64 }, - .{ .arch = .mips64, .os = .linux, .abi = .muslabin32 }, - .{ .arch = .mips64el, .os = .linux, .abi = .gnuabi64, .glibc_triple = "mips64el-linux-gnu-n64" }, - .{ .arch = .mips64el, .os = .linux, .abi = .gnuabin32, .glibc_triple = "mips64el-linux-gnu-n32" }, - .{ .arch = .mips64el, .os = .linux, .abi = .muslabi64 }, - .{ .arch = .mips64el, .os = .linux, .abi = .muslabin32 }, - .{ .arch = .powerpc, .os = .linux, .abi = .gnueabi, .glibc_triple = "powerpc-linux-gnu-soft" }, - .{ .arch = .powerpc, .os = .linux, .abi = .gnueabihf, .glibc_triple = "powerpc-linux-gnu" }, - .{ .arch = .powerpc, .os = .linux, .abi = .musleabi }, - .{ .arch = .powerpc, .os = .linux, .abi = .musleabihf }, - .{ .arch = .powerpc64, .os = .linux, .abi = .gnu }, - .{ .arch = .powerpc64, .os = .linux, .abi = .musl }, - .{ .arch = .powerpc64le, .os = .linux, .abi = .gnu, .glibc_min = .{ .major = 2, .minor = 19, .patch = 0 } }, - .{ .arch = .powerpc64le, .os = .linux, .abi = .musl }, - .{ .arch = .riscv32, .os = .linux, .abi = .gnu, .glibc_min = .{ .major = 2, .minor = 33, .patch = 0 }, .glibc_triple = "riscv32-linux-gnu-rv32imafdc-ilp32d" }, - .{ .arch = .riscv32, .os = .linux, .abi = .musl }, - .{ .arch = .riscv64, .os = .linux, .abi = .gnu, .glibc_min = .{ .major = 2, .minor = 27, .patch = 0 }, .glibc_triple = "riscv64-linux-gnu-rv64imafdc-lp64d" }, - .{ .arch = .riscv64, .os = .linux, .abi = .musl }, - .{ .arch = .s390x, .os = .linux, .abi = .gnu }, - .{ .arch = .s390x, .os = .linux, .abi = .musl }, - .{ .arch = .sparc, .os = .linux, .abi = .gnu, .glibc_triple = "sparcv9-linux-gnu" }, - .{ .arch = .sparc64, .os = .linux, .abi = .gnu }, + .{ .arch = .aarch64_be, .os = .linux, .abi = .gnu, .os_ver = .{ .major = 3, .minor = 13, .patch = 0 }, .glibc_min = .{ .major = 2, .minor = 17, .patch = 0 } }, + .{ .arch = .aarch64_be, .os = .linux, .abi = .musl, .os_ver = .{ .major = 3, .minor = 13, .patch = 0 } }, + .{ .arch = .csky, .os = .linux, .abi = .gnueabi, .os_ver = .{ .major = 4, .minor = 20, .patch = 0 }, .glibc_min = .{ .major = 2, .minor = 29, .patch = 0 }, .glibc_triple = "csky-linux-gnuabiv2-soft" }, + .{ .arch = .csky, .os = .linux, .abi = .gnueabihf, .os_ver = .{ .major = 4, .minor = 20, .patch = 0 }, .glibc_min = .{ .major = 2, .minor = 29, .patch = 0 }, .glibc_triple = "csky-linux-gnuabiv2" }, + .{ .arch = .loongarch64, .os = .linux, .abi = .gnu, .os_ver = .{ .major = 5, .minor = 19, .patch = 0 }, .glibc_min = .{ .major = 2, .minor = 36, .patch = 0 }, .glibc_triple = "loongarch64-linux-gnu-lp64d" }, + .{ .arch = .loongarch64, .os = .linux, .abi = .gnusf, .os_ver = .{ .major = 5, .minor = 19, .patch = 0 }, .glibc_min = .{ .major = 2, .minor = 36, .patch = 0 }, .glibc_triple = "loongarch64-linux-gnu-lp64s" }, + .{ .arch = .loongarch64, .os = .linux, .abi = .musl, .os_ver = .{ .major = 5, .minor = 19, .patch = 0 } }, + .{ .arch = .m68k, .os = .linux, .abi = .gnu, .os_ver = .{ .major = 1, .minor = 3, .patch = 94 } }, + .{ .arch = .m68k, .os = .linux, .abi = .musl, .os_ver = .{ .major = 1, .minor = 3, .patch = 94 } }, + .{ .arch = .mips, .os = .linux, .abi = .gnueabi, .os_ver = .{ .major = 1, .minor = 1, .patch = 82 }, .glibc_triple = "mips-linux-gnu-soft" }, + .{ .arch = .mips, .os = .linux, .abi = .gnueabihf, .os_ver = .{ .major = 1, .minor = 1, .patch = 82 }, .glibc_triple = "mips-linux-gnu" }, + .{ .arch = .mips, .os = .linux, .abi = .musleabi, .os_ver = .{ .major = 1, .minor = 1, .patch = 82 } }, + .{ .arch = .mips, .os = .linux, .abi = .musleabihf, .os_ver = .{ .major = 1, .minor = 1, .patch = 82 } }, + .{ .arch = .mipsel, .os = .linux, .abi = .gnueabi, .os_ver = .{ .major = 1, .minor = 1, .patch = 82 }, .glibc_triple = "mipsel-linux-gnu-soft" }, + .{ .arch = .mipsel, .os = .linux, .abi = .gnueabihf, .os_ver = .{ .major = 1, .minor = 1, .patch = 82 }, .glibc_triple = "mipsel-linux-gnu" }, + .{ .arch = .mipsel, .os = .linux, .abi = .musleabi, .os_ver = .{ .major = 1, .minor = 1, .patch = 82 } }, + .{ .arch = .mipsel, .os = .linux, .abi = .musleabihf, .os_ver = .{ .major = 1, .minor = 1, .patch = 82 } }, + .{ .arch = .mips64, .os = .linux, .abi = .gnuabi64, .os_ver = .{ .major = 2, .minor = 3, .patch = 48 }, .glibc_triple = "mips64-linux-gnu-n64" }, + .{ .arch = .mips64, .os = .linux, .abi = .gnuabin32, .os_ver = .{ .major = 2, .minor = 6, .patch = 0 }, .glibc_triple = "mips64-linux-gnu-n32" }, + .{ .arch = .mips64, .os = .linux, .abi = .muslabi64, .os_ver = .{ .major = 2, .minor = 3, .patch = 48 } }, + .{ .arch = .mips64, .os = .linux, .abi = .muslabin32, .os_ver = .{ .major = 2, .minor = 6, .patch = 0 } }, + .{ .arch = .mips64el, .os = .linux, .abi = .gnuabi64, .os_ver = .{ .major = 2, .minor = 3, .patch = 48 }, .glibc_triple = "mips64el-linux-gnu-n64" }, + .{ .arch = .mips64el, .os = .linux, .abi = .gnuabin32, .os_ver = .{ .major = 2, .minor = 6, .patch = 0 }, .glibc_triple = "mips64el-linux-gnu-n32" }, + .{ .arch = .mips64el, .os = .linux, .abi = .muslabi64, .os_ver = .{ .major = 2, .minor = 3, .patch = 48 } }, + .{ .arch = .mips64el, .os = .linux, .abi = .muslabin32, .os_ver = .{ .major = 2, .minor = 6, .patch = 0 } }, + .{ .arch = .powerpc, .os = .linux, .abi = .gnueabi, .os_ver = .{ .major = 1, .minor = 3, .patch = 45 }, .glibc_triple = "powerpc-linux-gnu-soft" }, + .{ .arch = .powerpc, .os = .linux, .abi = .gnueabihf, .os_ver = .{ .major = 1, .minor = 3, .patch = 45 }, .glibc_triple = "powerpc-linux-gnu" }, + .{ .arch = .powerpc, .os = .linux, .abi = .musleabi, .os_ver = .{ .major = 1, .minor = 3, .patch = 45 } }, + .{ .arch = .powerpc, .os = .linux, .abi = .musleabihf, .os_ver = .{ .major = 1, .minor = 3, .patch = 45 } }, + .{ .arch = .powerpc64, .os = .linux, .abi = .gnu, .os_ver = .{ .major = 2, .minor = 6, .patch = 0 } }, + .{ .arch = .powerpc64, .os = .linux, .abi = .musl, .os_ver = .{ .major = 2, .minor = 6, .patch = 0 } }, + .{ .arch = .powerpc64le, .os = .linux, .abi = .gnu, .os_ver = .{ .major = 3, .minor = 14, .patch = 0 }, .glibc_min = .{ .major = 2, .minor = 19, .patch = 0 } }, + .{ .arch = .powerpc64le, .os = .linux, .abi = .musl, .os_ver = .{ .major = 3, .minor = 14, .patch = 0 } }, + .{ .arch = .riscv32, .os = .linux, .abi = .gnu, .os_ver = .{ .major = 4, .minor = 15, .patch = 0 }, .glibc_min = .{ .major = 2, .minor = 33, .patch = 0 }, .glibc_triple = "riscv32-linux-gnu-rv32imafdc-ilp32d" }, + .{ .arch = .riscv32, .os = .linux, .abi = .musl, .os_ver = .{ .major = 4, .minor = 15, .patch = 0 } }, + .{ .arch = .riscv64, .os = .linux, .abi = .gnu, .os_ver = .{ .major = 4, .minor = 15, .patch = 0 }, .glibc_min = .{ .major = 2, .minor = 27, .patch = 0 }, .glibc_triple = "riscv64-linux-gnu-rv64imafdc-lp64d" }, + .{ .arch = .riscv64, .os = .linux, .abi = .musl, .os_ver = .{ .major = 4, .minor = 15, .patch = 0 } }, + .{ .arch = .s390x, .os = .linux, .abi = .gnu, .os_ver = .{ .major = 2, .minor = 4, .patch = 2 } }, + .{ .arch = .s390x, .os = .linux, .abi = .musl, .os_ver = .{ .major = 2, .minor = 4, .patch = 2 } }, + .{ .arch = .sparc, .os = .linux, .abi = .gnu, .os_ver = .{ .major = 2, .minor = 1, .patch = 19 }, .glibc_triple = "sparcv9-linux-gnu" }, + .{ .arch = .sparc64, .os = .linux, .abi = .gnu, .os_ver = .{ .major = 2, .minor = 1, .patch = 19 } }, .{ .arch = .wasm32, .os = .wasi, .abi = .musl }, .{ .arch = .x86, .os = .linux, .abi = .gnu }, .{ .arch = .x86, .os = .linux, .abi = .musl }, .{ .arch = .x86, .os = .windows, .abi = .gnu }, - .{ .arch = .x86_64, .os = .linux, .abi = .gnu }, - .{ .arch = .x86_64, .os = .linux, .abi = .gnux32, .glibc_triple = "x86_64-linux-gnu-x32" }, - .{ .arch = .x86_64, .os = .linux, .abi = .musl }, - .{ .arch = .x86_64, .os = .linux, .abi = .muslx32 }, + .{ .arch = .x86_64, .os = .linux, .abi = .gnu, .os_ver = .{ .major = 2, .minor = 6, .patch = 4 } }, + .{ .arch = .x86_64, .os = .linux, .abi = .gnux32, .os_ver = .{ .major = 3, .minor = 4, .patch = 0 }, .glibc_triple = "x86_64-linux-gnu-x32" }, + .{ .arch = .x86_64, .os = .linux, .abi = .musl, .os_ver = .{ .major = 2, .minor = 6, .patch = 4 } }, + .{ .arch = .x86_64, .os = .linux, .abi = .muslx32, .os_ver = .{ .major = 3, .minor = 4, .patch = 0 } }, .{ .arch = .x86_64, .os = .macos, .abi = .none, .os_ver = .{ .major = 10, .minor = 7, .patch = 0 } }, .{ .arch = .x86_64, .os = .windows, .abi = .gnu }, }; @@ -85,15 +86,17 @@ pub const available_libcs = [_]ArchOsAbi{ pub fn canBuildLibC(target: std.Target) bool { for (available_libcs) |libc| { if (target.cpu.arch == libc.arch and target.os.tag == libc.os and target.abi == libc.abi) { - if (target.os.tag == .macos) { - const ver = target.os.version_range.semver; - return ver.min.order(libc.os_ver.?) != .lt; + if (libc.os_ver) |libc_os_ver| { + if (switch (target.os.versionRange()) { + .semver => |v| v, + .linux => |v| v.range, + else => null, + }) |ver| { + if (ver.min.order(libc_os_ver) == .lt) return false; + } } - // Ensure glibc (aka *-(linux,hurd)-gnu) version is supported - if (target.isGnuLibC()) { - const min_glibc_ver = libc.glibc_min orelse return true; - const target_glibc_ver = target.os.versionRange().gnuLibCVersion().?; - return target_glibc_ver.order(min_glibc_ver) != .lt; + if (libc.glibc_min) |glibc_min| { + if (target.os.versionRange().gnuLibCVersion().?.order(glibc_min) == .lt) return false; } return true; } diff --git a/src/main.zig b/src/main.zig index 44b222293e..36c2ccdad7 100644 --- a/src/main.zig +++ b/src/main.zig @@ -3549,21 +3549,28 @@ fn buildOutputType( for (std.zig.target.available_libcs) |t| { if (t.arch == target.cpu.arch and t.os == target.os.tag) { - if (t.os_ver) |os_ver| { - std.log.info("zig can provide libc for related target {s}-{s}.{d}-{s}", .{ - @tagName(t.arch), @tagName(t.os), os_ver.major, @tagName(t.abi), - }); - } else if (t.glibc_min) |glibc_min| { - std.log.info("zig can provide libc for related target {s}-{s}-{s}.{d}.{d}", .{ + // If there's a `glibc_min`, there's also an `os_ver`. + if (t.glibc_min) |glibc_min| { + std.log.info("zig can provide libc for related target {s}-{s}.{}-{s}.{d}.{d}", .{ @tagName(t.arch), @tagName(t.os), + t.os_ver.?, @tagName(t.abi), glibc_min.major, glibc_min.minor, }); + } else if (t.os_ver) |os_ver| { + std.log.info("zig can provide libc for related target {s}-{s}.{}-{s}", .{ + @tagName(t.arch), + @tagName(t.os), + os_ver, + @tagName(t.abi), + }); } else { std.log.info("zig can provide libc for related target {s}-{s}-{s}", .{ - @tagName(t.arch), @tagName(t.os), @tagName(t.abi), + @tagName(t.arch), + @tagName(t.os), + @tagName(t.abi), }); } }