authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-12-23 19:42:53+01:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2024-12-23 19:42:53+01:00
logf06ca14cb53d2b2f1956390813d35f82d0a36834
tree7cbb40d222d7f948c77f23252bd8fcf293ab5b87
parentd41052b6dcb227ac91efebfe7207490297e62ff6
parent130310972d41eed50d7f033bb2a71c3eb2467439
signaturebadge-check Signed by PGP key B5690EEEBB952194

Merge pull request #22225 from alexrp/libc-linux-os-version

Attach minimum Linux versions to provided libcs + incorporate ABI in `VersionRange.default()`

5 files changed, 154 insertions(+), 101 deletions(-)

lib/compiler/aro/aro/target.zig+4-4
...@@ -719,7 +719,7 @@ pub fn toLLVMTriple(target: std.Target, buf: []u8) []const u8 {...@@ -719,7 +719,7 @@ pub fn toLLVMTriple(target: std.Target, buf: []u8) []const u8 {
719test "alignment functions - smoke test" {719test "alignment functions - smoke test" {
720 var target: std.Target = undefined;720 var target: std.Target = undefined;
721 const x86 = std.Target.Cpu.Arch.x86_64;721 const x86 = std.Target.Cpu.Arch.x86_64;
722 target.os = std.Target.Os.Tag.defaultVersionRange(.linux, x86);722 target.os = std.Target.Os.Tag.defaultVersionRange(.linux, x86, .none);
723 target.cpu = std.Target.Cpu.baseline(x86, target.os);723 target.cpu = std.Target.Cpu.baseline(x86, target.os);
724 target.abi = std.Target.Abi.default(x86, target.os);724 target.abi = std.Target.Abi.default(x86, target.os);
725725
...@@ -732,7 +732,7 @@ test "alignment functions - smoke test" {...@@ -732,7 +732,7 @@ test "alignment functions - smoke test" {
732 try std.testing.expect(systemCompiler(target) == .gcc);732 try std.testing.expect(systemCompiler(target) == .gcc);
733733
734 const arm = std.Target.Cpu.Arch.arm;734 const arm = std.Target.Cpu.Arch.arm;
735 target.os = std.Target.Os.Tag.defaultVersionRange(.ios, arm);735 target.os = std.Target.Os.Tag.defaultVersionRange(.ios, arm, .none);
736 target.cpu = std.Target.Cpu.baseline(arm, target.os);736 target.cpu = std.Target.Cpu.baseline(arm, target.os);
737 target.abi = std.Target.Abi.default(arm, target.os);737 target.abi = std.Target.Abi.default(arm, target.os);
738738
...@@ -751,7 +751,7 @@ test "target size/align tests" {...@@ -751,7 +751,7 @@ test "target size/align tests" {
751 const x86 = std.Target.Cpu.Arch.x86;751 const x86 = std.Target.Cpu.Arch.x86;
752 comp.target.cpu.arch = x86;752 comp.target.cpu.arch = x86;
753 comp.target.cpu.model = &std.Target.x86.cpu.i586;753 comp.target.cpu.model = &std.Target.x86.cpu.i586;
754 comp.target.os = std.Target.Os.Tag.defaultVersionRange(.linux, x86);754 comp.target.os = std.Target.Os.Tag.defaultVersionRange(.linux, x86, .none);
755 comp.target.abi = std.Target.Abi.gnu;755 comp.target.abi = std.Target.Abi.gnu;
756756
757 const tt: Type = .{757 const tt: Type = .{
...@@ -763,7 +763,7 @@ test "target size/align tests" {...@@ -763,7 +763,7 @@ test "target size/align tests" {
763763
764 const arm = std.Target.Cpu.Arch.arm;764 const arm = std.Target.Cpu.Arch.arm;
765 comp.target.cpu = std.Target.Cpu.Model.toCpu(&std.Target.arm.cpu.cortex_r4, arm);765 comp.target.cpu = std.Target.Cpu.Model.toCpu(&std.Target.arm.cpu.cortex_r4, arm);
766 comp.target.os = std.Target.Os.Tag.defaultVersionRange(.ios, arm);766 comp.target.os = std.Target.Os.Tag.defaultVersionRange(.ios, arm, .none);
767 comp.target.abi = std.Target.Abi.none;767 comp.target.abi = std.Target.Abi.none;
768768
769 const ct: Type = .{769 const ct: Type = .{
lib/std/Target.zig+17-7
...@@ -148,10 +148,10 @@ pub const Os = struct {...@@ -148,10 +148,10 @@ pub const Os = struct {
148 return (tag == .hurd or tag == .linux) and abi.isGnu();148 return (tag == .hurd or tag == .linux) and abi.isGnu();
149 }149 }
150150
151 pub fn defaultVersionRange(tag: Tag, arch: Cpu.Arch) Os {151 pub fn defaultVersionRange(tag: Tag, arch: Cpu.Arch, abi: Abi) Os {
152 return .{152 return .{
153 .tag = tag,153 .tag = tag,
154 .version_range = VersionRange.default(tag, arch),154 .version_range = .default(arch, tag, abi),
155 };155 };
156 }156 }
157157
...@@ -416,7 +416,7 @@ pub const Os = struct {...@@ -416,7 +416,7 @@ pub const Os = struct {
416416
417 /// The default `VersionRange` represents the range that the Zig Standard Library417 /// The default `VersionRange` represents the range that the Zig Standard Library
418 /// bases its abstractions on.418 /// bases its abstractions on.
419 pub fn default(tag: Tag, arch: Cpu.Arch) VersionRange {419 pub fn default(arch: Cpu.Arch, tag: Tag, abi: Abi) VersionRange {
420 return switch (tag) {420 return switch (tag) {
421 .freestanding,421 .freestanding,
422 .other,422 .other,
...@@ -475,16 +475,26 @@ pub const Os = struct {...@@ -475,16 +475,26 @@ pub const Os = struct {
475 .linux => .{475 .linux => .{
476 .linux = .{476 .linux = .{
477 .range = .{477 .range = .{
478 .min = .{ .major = 4, .minor = 19, .patch = 0 },478 .min = blk: {
479 const default_min: std.SemanticVersion = .{ .major = 4, .minor = 19, .patch = 0 };
480
481 for (std.zig.target.available_libcs) |libc| {
482 if (libc.arch != arch or libc.os != tag or libc.abi != abi) continue;
483
484 if (libc.os_ver) |min| {
485 if (min.order(default_min) == .gt) break :blk min;
486 }
487 }
488
489 break :blk default_min;
490 },
479 .max = .{ .major = 6, .minor = 11, .patch = 5 },491 .max = .{ .major = 6, .minor = 11, .patch = 5 },
480 },492 },
481 .glibc = blk: {493 .glibc = blk: {
482 const default_min: std.SemanticVersion = .{ .major = 2, .minor = 28, .patch = 0 };494 const default_min: std.SemanticVersion = .{ .major = 2, .minor = 28, .patch = 0 };
483495
484 for (std.zig.target.available_libcs) |libc| {496 for (std.zig.target.available_libcs) |libc| {
485 // We don't know the ABI here. We can get away with not checking it497 if (libc.os != tag or libc.arch != arch or libc.abi != abi) continue;
486 // for now, but that may not always remain true.
487 if (libc.os != tag or libc.arch != arch) continue;
488498
489 if (libc.glibc_min) |min| {499 if (libc.glibc_min) |min| {
490 if (min.order(default_min) == .gt) break :blk min;500 if (min.order(default_min) == .gt) break :blk min;
lib/std/zig/system.zig+47-14
...@@ -181,8 +181,12 @@ pub const DetectError = error{...@@ -181,8 +181,12 @@ pub const DetectError = error{
181/// components by detecting the native system, and then resolves181/// components by detecting the native system, and then resolves
182/// standard/default parts relative to that.182/// standard/default parts relative to that.
183pub fn resolveTargetQuery(query: Target.Query) DetectError!Target {183pub fn resolveTargetQuery(query: Target.Query) DetectError!Target {
184 // Until https://github.com/ziglang/zig/issues/4592 is implemented (support detecting the
185 // native CPU architecture as being different than the current target), we use this:
186 const query_cpu_arch = query.cpu_arch orelse builtin.cpu.arch;
184 const query_os_tag = query.os_tag orelse builtin.os.tag;187 const query_os_tag = query.os_tag orelse builtin.os.tag;
185 var os = query_os_tag.defaultVersionRange(query.cpu_arch orelse builtin.cpu.arch);188 const query_abi = query.abi orelse builtin.abi;
189 var os = query_os_tag.defaultVersionRange(query_cpu_arch, query_abi);
186 if (query.os_tag == null) {190 if (query.os_tag == null) {
187 switch (builtin.target.os.tag) {191 switch (builtin.target.os.tag) {
188 .linux => {192 .linux => {
...@@ -338,29 +342,58 @@ pub fn resolveTargetQuery(query: Target.Query) DetectError!Target {...@@ -338,29 +342,58 @@ pub fn resolveTargetQuery(query: Target.Query) DetectError!Target {
338 os.version_range.linux.android = android;342 os.version_range.linux.android = android;
339 }343 }
340344
341 // Until https://github.com/ziglang/zig/issues/4592 is implemented (support detecting the
342 // native CPU architecture as being different than the current target), we use this:
343 const cpu_arch = query.cpu_arch orelse builtin.cpu.arch;
344
345 const cpu = switch (query.cpu_model) {345 const cpu = switch (query.cpu_model) {
346 .native => detectNativeCpuAndFeatures(cpu_arch, os, query),346 .native => detectNativeCpuAndFeatures(query_cpu_arch, os, query),
347 .baseline => Target.Cpu.baseline(cpu_arch, os),347 .baseline => Target.Cpu.baseline(query_cpu_arch, os),
348 .determined_by_arch_os => if (query.cpu_arch == null)348 .determined_by_arch_os => if (query.cpu_arch == null)
349 detectNativeCpuAndFeatures(cpu_arch, os, query)349 detectNativeCpuAndFeatures(query_cpu_arch, os, query)
350 else350 else
351 Target.Cpu.baseline(cpu_arch, os),351 Target.Cpu.baseline(query_cpu_arch, os),
352 .explicit => |model| model.toCpu(cpu_arch),352 .explicit => |model| model.toCpu(query_cpu_arch),
353 } orelse backup_cpu_detection: {353 } orelse backup_cpu_detection: {
354 break :backup_cpu_detection Target.Cpu.baseline(cpu_arch, os);354 break :backup_cpu_detection Target.Cpu.baseline(query_cpu_arch, os);
355 };355 };
356
356 var result = try detectAbiAndDynamicLinker(cpu, os, query);357 var result = try detectAbiAndDynamicLinker(cpu, os, query);
358
359 // It's possible that we detect the native ABI, but fail to detect the OS version or were told
360 // to use the default OS version range. In that case, while we can't determine the exact native
361 // OS version, we do at least know that some ABIs require a particular OS version (by way of
362 // `std.zig.target.available_libcs`). So in this case, adjust the OS version to the minimum that
363 // we know is required.
364 if (result.abi != query_abi and query.os_version_min == null) {
365 const result_ver_range = &result.os.version_range;
366 const abi_ver_range = result.os.tag.defaultVersionRange(result.cpu.arch, result.abi).version_range;
367
368 switch (result.os.tag.versionRangeTag()) {
369 .none => {},
370 .semver => if (result_ver_range.semver.min.order(abi_ver_range.semver.min) == .lt) {
371 result_ver_range.semver.min = abi_ver_range.semver.min;
372 },
373 inline .hurd, .linux => |t| {
374 if (@field(result_ver_range, @tagName(t)).range.min.order(@field(abi_ver_range, @tagName(t)).range.min) == .lt) {
375 @field(result_ver_range, @tagName(t)).range.min = @field(abi_ver_range, @tagName(t)).range.min;
376 }
377
378 if (@field(result_ver_range, @tagName(t)).glibc.order(@field(abi_ver_range, @tagName(t)).glibc) == .lt and
379 query.glibc_version == null)
380 {
381 @field(result_ver_range, @tagName(t)).glibc = @field(abi_ver_range, @tagName(t)).glibc;
382 }
383 },
384 .windows => if (!result_ver_range.windows.min.isAtLeast(abi_ver_range.windows.min)) {
385 result_ver_range.windows.min = abi_ver_range.windows.min;
386 },
387 }
388 }
389
357 // For x86, we need to populate some CPU feature flags depending on architecture390 // For x86, we need to populate some CPU feature flags depending on architecture
358 // and mode:391 // and mode:
359 // * 16bit_mode => if the abi is code16392 // * 16bit_mode => if the abi is code16
360 // * 32bit_mode => if the arch is x86393 // * 32bit_mode => if the arch is x86
361 // However, the "mode" flags can be used as overrides, so if the user explicitly394 // However, the "mode" flags can be used as overrides, so if the user explicitly
362 // sets one of them, that takes precedence.395 // sets one of them, that takes precedence.
363 switch (cpu_arch) {396 switch (result.cpu.arch) {
364 .x86 => {397 .x86 => {
365 if (!Target.x86.featureSetHasAny(query.cpu_features_add, .{398 if (!Target.x86.featureSetHasAny(query.cpu_features_add, .{
366 .@"16bit_mode", .@"32bit_mode",399 .@"16bit_mode", .@"32bit_mode",
...@@ -388,12 +421,12 @@ pub fn resolveTargetQuery(query: Target.Query) DetectError!Target {...@@ -388,12 +421,12 @@ pub fn resolveTargetQuery(query: Target.Query) DetectError!Target {
388 }421 }
389 updateCpuFeatures(422 updateCpuFeatures(
390 &result.cpu.features,423 &result.cpu.features,
391 cpu_arch.allFeaturesList(),424 result.cpu.arch.allFeaturesList(),
392 query.cpu_features_add,425 query.cpu_features_add,
393 query.cpu_features_sub,426 query.cpu_features_sub,
394 );427 );
395428
396 if (cpu_arch == .hexagon) {429 if (result.cpu.arch == .hexagon) {
397 // Both LLVM and LLD have broken support for the small data area. Yet LLVM has the feature430 // Both LLVM and LLD have broken support for the small data area. Yet LLVM has the feature
398 // on by default for all Hexagon CPUs. Clang sort of solves this by defaulting the `-gpsize`431 // on by default for all Hexagon CPUs. Clang sort of solves this by defaulting the `-gpsize`
399 // command line parameter for the Hexagon backend to 0, so that no constants get placed in432 // command line parameter for the Hexagon backend to 0, so that no constants get placed in
lib/std/zig/target.zig+72-69
...@@ -4,80 +4,81 @@ pub const ArchOsAbi = struct {...@@ -4,80 +4,81 @@ pub const ArchOsAbi = struct {
4 abi: std.Target.Abi,4 abi: std.Target.Abi,
5 os_ver: ?std.SemanticVersion = null,5 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. Note that Zig
8 /// can only target glibc 2.2.5+, so `null` means the minimum is older than that.
8 glibc_min: ?std.SemanticVersion = null,9 glibc_min: ?std.SemanticVersion = null,
9 /// Override for `glibcRuntimeTriple` when glibc has an unusual directory name for the target.10 /// Override for `glibcRuntimeTriple` when glibc has an unusual directory name for the target.
10 glibc_triple: ?[]const u8 = null,11 glibc_triple: ?[]const u8 = null,
11};12};
1213
13pub const available_libcs = [_]ArchOsAbi{14pub const available_libcs = [_]ArchOsAbi{
14 .{ .arch = .arc, .os = .linux, .abi = .gnu, .glibc_min = .{ .major = 2, .minor = 32, .patch = 0 } },15 .{ .arch = .arc, .os = .linux, .abi = .gnu, .os_ver = .{ .major = 4, .minor = 2, .patch = 0 }, .glibc_min = .{ .major = 2, .minor = 32, .patch = 0 } },
15 .{ .arch = .arm, .os = .linux, .abi = .gnueabi },16 .{ .arch = .arm, .os = .linux, .abi = .gnueabi, .os_ver = .{ .major = 2, .minor = 1, .patch = 0 } },
16 .{ .arch = .arm, .os = .linux, .abi = .gnueabihf },17 .{ .arch = .arm, .os = .linux, .abi = .gnueabihf, .os_ver = .{ .major = 2, .minor = 1, .patch = 0 } },
17 .{ .arch = .arm, .os = .linux, .abi = .musleabi },18 .{ .arch = .arm, .os = .linux, .abi = .musleabi, .os_ver = .{ .major = 2, .minor = 1, .patch = 0 } },
18 .{ .arch = .arm, .os = .linux, .abi = .musleabihf },19 .{ .arch = .arm, .os = .linux, .abi = .musleabihf, .os_ver = .{ .major = 2, .minor = 1, .patch = 0 } },
19 .{ .arch = .armeb, .os = .linux, .abi = .gnueabi },20 .{ .arch = .armeb, .os = .linux, .abi = .gnueabi, .os_ver = .{ .major = 2, .minor = 6, .patch = 0 } },
20 .{ .arch = .armeb, .os = .linux, .abi = .gnueabihf },21 .{ .arch = .armeb, .os = .linux, .abi = .gnueabihf, .os_ver = .{ .major = 2, .minor = 6, .patch = 0 } },
21 .{ .arch = .armeb, .os = .linux, .abi = .musleabi },22 .{ .arch = .armeb, .os = .linux, .abi = .musleabi, .os_ver = .{ .major = 2, .minor = 6, .patch = 0 } },
22 .{ .arch = .armeb, .os = .linux, .abi = .musleabihf },23 .{ .arch = .armeb, .os = .linux, .abi = .musleabihf, .os_ver = .{ .major = 2, .minor = 6, .patch = 0 } },
23 .{ .arch = .thumb, .os = .linux, .abi = .musleabi },24 .{ .arch = .thumb, .os = .linux, .abi = .musleabi, .os_ver = .{ .major = 2, .minor = 1, .patch = 0 } },
24 .{ .arch = .thumb, .os = .linux, .abi = .musleabihf },25 .{ .arch = .thumb, .os = .linux, .abi = .musleabihf, .os_ver = .{ .major = 2, .minor = 1, .patch = 0 } },
25 .{ .arch = .thumb, .os = .windows, .abi = .gnu },26 .{ .arch = .thumb, .os = .windows, .abi = .gnu },
26 .{ .arch = .thumbeb, .os = .linux, .abi = .musleabi },27 .{ .arch = .thumbeb, .os = .linux, .abi = .musleabi, .os_ver = .{ .major = 2, .minor = 6, .patch = 0 } },
27 .{ .arch = .thumbeb, .os = .linux, .abi = .musleabihf },28 .{ .arch = .thumbeb, .os = .linux, .abi = .musleabihf, .os_ver = .{ .major = 2, .minor = 6, .patch = 0 } },
28 .{ .arch = .aarch64, .os = .linux, .abi = .gnu, .glibc_min = .{ .major = 2, .minor = 17, .patch = 0 } },29 .{ .arch = .aarch64, .os = .linux, .abi = .gnu, .os_ver = .{ .major = 3, .minor = 7, .patch = 0 }, .glibc_min = .{ .major = 2, .minor = 17, .patch = 0 } },
29 .{ .arch = .aarch64, .os = .linux, .abi = .musl },30 .{ .arch = .aarch64, .os = .linux, .abi = .musl, .os_ver = .{ .major = 3, .minor = 7, .patch = 0 } },
30 .{ .arch = .aarch64, .os = .macos, .abi = .none, .os_ver = .{ .major = 11, .minor = 0, .patch = 0 } },31 .{ .arch = .aarch64, .os = .macos, .abi = .none, .os_ver = .{ .major = 11, .minor = 0, .patch = 0 } },
31 .{ .arch = .aarch64, .os = .windows, .abi = .gnu },32 .{ .arch = .aarch64, .os = .windows, .abi = .gnu },
32 .{ .arch = .aarch64_be, .os = .linux, .abi = .gnu, .glibc_min = .{ .major = 2, .minor = 17, .patch = 0 } },33 .{ .arch = .aarch64_be, .os = .linux, .abi = .gnu, .os_ver = .{ .major = 3, .minor = 13, .patch = 0 }, .glibc_min = .{ .major = 2, .minor = 17, .patch = 0 } },
33 .{ .arch = .aarch64_be, .os = .linux, .abi = .musl },34 .{ .arch = .aarch64_be, .os = .linux, .abi = .musl, .os_ver = .{ .major = 3, .minor = 13, .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 = .gnueabi, .os_ver = .{ .major = 4, .minor = 20, .patch = 0 }, .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 = .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" },
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 = .gnu, .os_ver = .{ .major = 5, .minor = 19, .patch = 0 }, .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" },38 .{ .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" },
38 .{ .arch = .loongarch64, .os = .linux, .abi = .musl },39 .{ .arch = .loongarch64, .os = .linux, .abi = .musl, .os_ver = .{ .major = 5, .minor = 19, .patch = 0 } },
39 .{ .arch = .m68k, .os = .linux, .abi = .gnu },40 .{ .arch = .m68k, .os = .linux, .abi = .gnu, .os_ver = .{ .major = 1, .minor = 3, .patch = 94 } },
40 .{ .arch = .m68k, .os = .linux, .abi = .musl },41 .{ .arch = .m68k, .os = .linux, .abi = .musl, .os_ver = .{ .major = 1, .minor = 3, .patch = 94 } },
41 .{ .arch = .mips, .os = .linux, .abi = .gnueabi, .glibc_triple = "mips-linux-gnu-soft" },42 .{ .arch = .mips, .os = .linux, .abi = .gnueabi, .os_ver = .{ .major = 1, .minor = 1, .patch = 82 }, .glibc_triple = "mips-linux-gnu-soft" },
42 .{ .arch = .mips, .os = .linux, .abi = .gnueabihf, .glibc_triple = "mips-linux-gnu" },43 .{ .arch = .mips, .os = .linux, .abi = .gnueabihf, .os_ver = .{ .major = 1, .minor = 1, .patch = 82 }, .glibc_triple = "mips-linux-gnu" },
43 .{ .arch = .mips, .os = .linux, .abi = .musleabi },44 .{ .arch = .mips, .os = .linux, .abi = .musleabi, .os_ver = .{ .major = 1, .minor = 1, .patch = 82 } },
44 .{ .arch = .mips, .os = .linux, .abi = .musleabihf },45 .{ .arch = .mips, .os = .linux, .abi = .musleabihf, .os_ver = .{ .major = 1, .minor = 1, .patch = 82 } },
45 .{ .arch = .mipsel, .os = .linux, .abi = .gnueabi, .glibc_triple = "mipsel-linux-gnu-soft" },46 .{ .arch = .mipsel, .os = .linux, .abi = .gnueabi, .os_ver = .{ .major = 1, .minor = 1, .patch = 82 }, .glibc_triple = "mipsel-linux-gnu-soft" },
46 .{ .arch = .mipsel, .os = .linux, .abi = .gnueabihf, .glibc_triple = "mipsel-linux-gnu" },47 .{ .arch = .mipsel, .os = .linux, .abi = .gnueabihf, .os_ver = .{ .major = 1, .minor = 1, .patch = 82 }, .glibc_triple = "mipsel-linux-gnu" },
47 .{ .arch = .mipsel, .os = .linux, .abi = .musleabi },48 .{ .arch = .mipsel, .os = .linux, .abi = .musleabi, .os_ver = .{ .major = 1, .minor = 1, .patch = 82 } },
48 .{ .arch = .mipsel, .os = .linux, .abi = .musleabihf },49 .{ .arch = .mipsel, .os = .linux, .abi = .musleabihf, .os_ver = .{ .major = 1, .minor = 1, .patch = 82 } },
49 .{ .arch = .mips64, .os = .linux, .abi = .gnuabi64, .glibc_triple = "mips64-linux-gnu-n64" },50 .{ .arch = .mips64, .os = .linux, .abi = .gnuabi64, .os_ver = .{ .major = 2, .minor = 3, .patch = 48 }, .glibc_triple = "mips64-linux-gnu-n64" },
50 .{ .arch = .mips64, .os = .linux, .abi = .gnuabin32, .glibc_triple = "mips64-linux-gnu-n32" },51 .{ .arch = .mips64, .os = .linux, .abi = .gnuabin32, .os_ver = .{ .major = 2, .minor = 6, .patch = 0 }, .glibc_triple = "mips64-linux-gnu-n32" },
51 .{ .arch = .mips64, .os = .linux, .abi = .muslabi64 },52 .{ .arch = .mips64, .os = .linux, .abi = .muslabi64, .os_ver = .{ .major = 2, .minor = 3, .patch = 48 } },
52 .{ .arch = .mips64, .os = .linux, .abi = .muslabin32 },53 .{ .arch = .mips64, .os = .linux, .abi = .muslabin32, .os_ver = .{ .major = 2, .minor = 6, .patch = 0 } },
53 .{ .arch = .mips64el, .os = .linux, .abi = .gnuabi64, .glibc_triple = "mips64el-linux-gnu-n64" },54 .{ .arch = .mips64el, .os = .linux, .abi = .gnuabi64, .os_ver = .{ .major = 2, .minor = 3, .patch = 48 }, .glibc_triple = "mips64el-linux-gnu-n64" },
54 .{ .arch = .mips64el, .os = .linux, .abi = .gnuabin32, .glibc_triple = "mips64el-linux-gnu-n32" },55 .{ .arch = .mips64el, .os = .linux, .abi = .gnuabin32, .os_ver = .{ .major = 2, .minor = 6, .patch = 0 }, .glibc_triple = "mips64el-linux-gnu-n32" },
55 .{ .arch = .mips64el, .os = .linux, .abi = .muslabi64 },56 .{ .arch = .mips64el, .os = .linux, .abi = .muslabi64, .os_ver = .{ .major = 2, .minor = 3, .patch = 48 } },
56 .{ .arch = .mips64el, .os = .linux, .abi = .muslabin32 },57 .{ .arch = .mips64el, .os = .linux, .abi = .muslabin32, .os_ver = .{ .major = 2, .minor = 6, .patch = 0 } },
57 .{ .arch = .powerpc, .os = .linux, .abi = .gnueabi, .glibc_triple = "powerpc-linux-gnu-soft" },58 .{ .arch = .powerpc, .os = .linux, .abi = .gnueabi, .os_ver = .{ .major = 1, .minor = 3, .patch = 45 }, .glibc_triple = "powerpc-linux-gnu-soft" },
58 .{ .arch = .powerpc, .os = .linux, .abi = .gnueabihf, .glibc_triple = "powerpc-linux-gnu" },59 .{ .arch = .powerpc, .os = .linux, .abi = .gnueabihf, .os_ver = .{ .major = 1, .minor = 3, .patch = 45 }, .glibc_triple = "powerpc-linux-gnu" },
59 .{ .arch = .powerpc, .os = .linux, .abi = .musleabi },60 .{ .arch = .powerpc, .os = .linux, .abi = .musleabi, .os_ver = .{ .major = 1, .minor = 3, .patch = 45 } },
60 .{ .arch = .powerpc, .os = .linux, .abi = .musleabihf },61 .{ .arch = .powerpc, .os = .linux, .abi = .musleabihf, .os_ver = .{ .major = 1, .minor = 3, .patch = 45 } },
61 .{ .arch = .powerpc64, .os = .linux, .abi = .gnu },62 .{ .arch = .powerpc64, .os = .linux, .abi = .gnu, .os_ver = .{ .major = 2, .minor = 6, .patch = 0 } },
62 .{ .arch = .powerpc64, .os = .linux, .abi = .musl },63 .{ .arch = .powerpc64, .os = .linux, .abi = .musl, .os_ver = .{ .major = 2, .minor = 6, .patch = 0 } },
63 .{ .arch = .powerpc64le, .os = .linux, .abi = .gnu, .glibc_min = .{ .major = 2, .minor = 19, .patch = 0 } },64 .{ .arch = .powerpc64le, .os = .linux, .abi = .gnu, .os_ver = .{ .major = 3, .minor = 14, .patch = 0 }, .glibc_min = .{ .major = 2, .minor = 19, .patch = 0 } },
64 .{ .arch = .powerpc64le, .os = .linux, .abi = .musl },65 .{ .arch = .powerpc64le, .os = .linux, .abi = .musl, .os_ver = .{ .major = 3, .minor = 14, .patch = 0 } },
65 .{ .arch = .riscv32, .os = .linux, .abi = .gnu, .glibc_min = .{ .major = 2, .minor = 33, .patch = 0 }, .glibc_triple = "riscv32-linux-gnu-rv32imafdc-ilp32d" },66 .{ .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" },
66 .{ .arch = .riscv32, .os = .linux, .abi = .musl },67 .{ .arch = .riscv32, .os = .linux, .abi = .musl, .os_ver = .{ .major = 4, .minor = 15, .patch = 0 } },
67 .{ .arch = .riscv64, .os = .linux, .abi = .gnu, .glibc_min = .{ .major = 2, .minor = 27, .patch = 0 }, .glibc_triple = "riscv64-linux-gnu-rv64imafdc-lp64d" },68 .{ .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" },
68 .{ .arch = .riscv64, .os = .linux, .abi = .musl },69 .{ .arch = .riscv64, .os = .linux, .abi = .musl, .os_ver = .{ .major = 4, .minor = 15, .patch = 0 } },
69 .{ .arch = .s390x, .os = .linux, .abi = .gnu },70 .{ .arch = .s390x, .os = .linux, .abi = .gnu, .os_ver = .{ .major = 2, .minor = 4, .patch = 2 } },
70 .{ .arch = .s390x, .os = .linux, .abi = .musl },71 .{ .arch = .s390x, .os = .linux, .abi = .musl, .os_ver = .{ .major = 2, .minor = 4, .patch = 2 } },
71 .{ .arch = .sparc, .os = .linux, .abi = .gnu, .glibc_triple = "sparcv9-linux-gnu" },72 .{ .arch = .sparc, .os = .linux, .abi = .gnu, .os_ver = .{ .major = 2, .minor = 1, .patch = 19 }, .glibc_triple = "sparcv9-linux-gnu" },
72 .{ .arch = .sparc64, .os = .linux, .abi = .gnu },73 .{ .arch = .sparc64, .os = .linux, .abi = .gnu, .os_ver = .{ .major = 2, .minor = 1, .patch = 19 } },
73 .{ .arch = .wasm32, .os = .wasi, .abi = .musl },74 .{ .arch = .wasm32, .os = .wasi, .abi = .musl },
74 .{ .arch = .x86, .os = .linux, .abi = .gnu },75 .{ .arch = .x86, .os = .linux, .abi = .gnu },
75 .{ .arch = .x86, .os = .linux, .abi = .musl },76 .{ .arch = .x86, .os = .linux, .abi = .musl },
76 .{ .arch = .x86, .os = .windows, .abi = .gnu },77 .{ .arch = .x86, .os = .windows, .abi = .gnu },
77 .{ .arch = .x86_64, .os = .linux, .abi = .gnu },78 .{ .arch = .x86_64, .os = .linux, .abi = .gnu, .os_ver = .{ .major = 2, .minor = 6, .patch = 4 } },
78 .{ .arch = .x86_64, .os = .linux, .abi = .gnux32, .glibc_triple = "x86_64-linux-gnu-x32" },79 .{ .arch = .x86_64, .os = .linux, .abi = .gnux32, .os_ver = .{ .major = 3, .minor = 4, .patch = 0 }, .glibc_triple = "x86_64-linux-gnu-x32" },
79 .{ .arch = .x86_64, .os = .linux, .abi = .musl },80 .{ .arch = .x86_64, .os = .linux, .abi = .musl, .os_ver = .{ .major = 2, .minor = 6, .patch = 4 } },
80 .{ .arch = .x86_64, .os = .linux, .abi = .muslx32 },81 .{ .arch = .x86_64, .os = .linux, .abi = .muslx32, .os_ver = .{ .major = 3, .minor = 4, .patch = 0 } },
81 .{ .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 } },
82 .{ .arch = .x86_64, .os = .windows, .abi = .gnu },83 .{ .arch = .x86_64, .os = .windows, .abi = .gnu },
83};84};
...@@ -85,15 +86,17 @@ pub const available_libcs = [_]ArchOsAbi{...@@ -85,15 +86,17 @@ pub const available_libcs = [_]ArchOsAbi{
85pub fn canBuildLibC(target: std.Target) bool {86pub fn canBuildLibC(target: std.Target) bool {
86 for (available_libcs) |libc| {87 for (available_libcs) |libc| {
87 if (target.cpu.arch == libc.arch and target.os.tag == libc.os and target.abi == libc.abi) {88 if (target.cpu.arch == libc.arch and target.os.tag == libc.os and target.abi == libc.abi) {
88 if (target.os.tag == .macos) {89 if (libc.os_ver) |libc_os_ver| {
89 const ver = target.os.version_range.semver;90 if (switch (target.os.versionRange()) {
90 return ver.min.order(libc.os_ver.?) != .lt;91 .semver => |v| v,
92 .linux => |v| v.range,
93 else => null,
94 }) |ver| {
95 if (ver.min.order(libc_os_ver) == .lt) return false;
96 }
91 }97 }
92 // Ensure glibc (aka *-(linux,hurd)-gnu) version is supported98 if (libc.glibc_min) |glibc_min| {
93 if (target.isGnuLibC()) {99 if (target.os.versionRange().gnuLibCVersion().?.order(glibc_min) == .lt) return false;
94 const min_glibc_ver = libc.glibc_min orelse return true;
95 const target_glibc_ver = target.os.versionRange().gnuLibCVersion().?;
96 return target_glibc_ver.order(min_glibc_ver) != .lt;
97 }100 }
98 return true;101 return true;
99 }102 }
src/main.zig+14-7
...@@ -3549,21 +3549,28 @@ fn buildOutputType(...@@ -3549,21 +3549,28 @@ fn buildOutputType(
35493549
3550 for (std.zig.target.available_libcs) |t| {3550 for (std.zig.target.available_libcs) |t| {
3551 if (t.arch == target.cpu.arch and t.os == target.os.tag) {3551 if (t.arch == target.cpu.arch and t.os == target.os.tag) {
3552 if (t.os_ver) |os_ver| {3552 // If there's a `glibc_min`, there's also an `os_ver`.
3553 std.log.info("zig can provide libc for related target {s}-{s}.{d}-{s}", .{3553 if (t.glibc_min) |glibc_min| {
3554 @tagName(t.arch), @tagName(t.os), os_ver.major, @tagName(t.abi),3554 std.log.info("zig can provide libc for related target {s}-{s}.{}-{s}.{d}.{d}", .{
3555 });
3556 } else if (t.glibc_min) |glibc_min| {
3557 std.log.info("zig can provide libc for related target {s}-{s}-{s}.{d}.{d}", .{
3558 @tagName(t.arch),3555 @tagName(t.arch),
3559 @tagName(t.os),3556 @tagName(t.os),
3557 t.os_ver.?,
3560 @tagName(t.abi),3558 @tagName(t.abi),
3561 glibc_min.major,3559 glibc_min.major,
3562 glibc_min.minor,3560 glibc_min.minor,
3563 });3561 });
3562 } else if (t.os_ver) |os_ver| {
3563 std.log.info("zig can provide libc for related target {s}-{s}.{}-{s}", .{
3564 @tagName(t.arch),
3565 @tagName(t.os),
3566 os_ver,
3567 @tagName(t.abi),
3568 });
3564 } else {3569 } else {
3565 std.log.info("zig can provide libc for related target {s}-{s}-{s}", .{3570 std.log.info("zig can provide libc for related target {s}-{s}-{s}", .{
3566 @tagName(t.arch), @tagName(t.os), @tagName(t.abi),3571 @tagName(t.arch),
3572 @tagName(t.os),
3573 @tagName(t.abi),
3567 });3574 });
3568 }3575 }
3569 }3576 }