authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2021-11-24 16:14:52+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2021-11-25 12:19:16+01:00
log42a351e099dd41fe96dab4f6dadd277884188f3f
tree7958c3e2e7a1505dd1c2b547e61f1f228641c031
parent2dcfa486feecc964a1aab6b843ab85c2be1d7a9b

infer and match macos sdk version for libc headers


3 files changed, 92 insertions(+), 49 deletions(-)

lib/std/target.zig+1-1
...@@ -269,7 +269,7 @@ pub const Target = struct {...@@ -269,7 +269,7 @@ pub const Target = struct {
269 .macos => return .{269 .macos => return .{
270 .semver = .{270 .semver = .{
271 .min = .{ .major = 10, .minor = 13 },271 .min = .{ .major = 10, .minor = 13 },
272 .max = .{ .major = 11, .minor = 2 },272 .max = .{ .major = 12, .minor = 0 },
273 },273 },
274 },274 },
275 .ios => return .{275 .ios => return .{
src/Compilation.zig+81-46
...@@ -3798,53 +3798,88 @@ fn detectLibCIncludeDirs(...@@ -3798,53 +3798,88 @@ fn detectLibCIncludeDirs(
3798 // If not linking system libraries, build and provide our own libc by3798 // If not linking system libraries, build and provide our own libc by
3799 // default if possible.3799 // default if possible.
3800 if (target_util.canBuildLibC(target)) {3800 if (target_util.canBuildLibC(target)) {
3801 const generic_name = target_util.libCGenericName(target);3801 switch (target.os.tag) {
3802 // Some architectures are handled by the same set of headers.3802 .macos => {
3803 const arch_name = if (target.abi.isMusl())3803 const arch_name = @tagName(target.cpu.arch);
3804 musl.archName(target.cpu.arch)3804 const os_name = try std.fmt.allocPrint(arena, "{s}.{d}", .{
3805 else if (target.cpu.arch.isThumb())3805 @tagName(target.os.tag),
3806 // ARM headers are valid for Thumb too.3806 target.os.version_range.semver.min.major,
3807 switch (target.cpu.arch) {3807 });
3808 .thumb => "arm",3808 const s = std.fs.path.sep_str;
3809 .thumbeb => "armeb",3809 const list = try arena.alloc([]const u8, 3);
3810 else => unreachable,
3811 }
3812 else
3813 @tagName(target.cpu.arch);
3814 const os_name = @tagName(target.os.tag);
3815 // Musl's headers are ABI-agnostic and so they all have the "musl" ABI name.
3816 const abi_name = if (target.abi.isMusl()) "musl" else @tagName(target.abi);
3817 const s = std.fs.path.sep_str;
3818 const arch_include_dir = try std.fmt.allocPrint(
3819 arena,
3820 "{s}" ++ s ++ "libc" ++ s ++ "include" ++ s ++ "{s}-{s}-{s}",
3821 .{ zig_lib_dir, arch_name, os_name, abi_name },
3822 );
3823 const generic_include_dir = try std.fmt.allocPrint(
3824 arena,
3825 "{s}" ++ s ++ "libc" ++ s ++ "include" ++ s ++ "generic-{s}",
3826 .{ zig_lib_dir, generic_name },
3827 );
3828 const arch_os_include_dir = try std.fmt.allocPrint(
3829 arena,
3830 "{s}" ++ s ++ "libc" ++ s ++ "include" ++ s ++ "{s}-{s}-any",
3831 .{ zig_lib_dir, @tagName(target.cpu.arch), os_name },
3832 );
3833 const generic_os_include_dir = try std.fmt.allocPrint(
3834 arena,
3835 "{s}" ++ s ++ "libc" ++ s ++ "include" ++ s ++ "any-{s}-any",
3836 .{ zig_lib_dir, os_name },
3837 );
38383810
3839 const list = try arena.alloc([]const u8, 4);3811 list[0] = try std.fmt.allocPrint(
3840 list[0] = arch_include_dir;3812 arena,
3841 list[1] = generic_include_dir;3813 "{s}" ++ s ++ "libc" ++ s ++ "include" ++ s ++ "{s}-{s}-gnu",
3842 list[2] = arch_os_include_dir;3814 .{ zig_lib_dir, arch_name, os_name },
3843 list[3] = generic_os_include_dir;3815 );
3844 return LibCDirs{3816 list[1] = try std.fmt.allocPrint(
3845 .libc_include_dir_list = list,3817 arena,
3846 .libc_installation = null,3818 "{s}" ++ s ++ "libc" ++ s ++ "include" ++ s ++ "any-{s}-any",
3847 };3819 .{ zig_lib_dir, os_name },
3820 );
3821 list[2] = try std.fmt.allocPrint(
3822 arena,
3823 "{s}" ++ s ++ "libc" ++ s ++ "include" ++ s ++ "any-macos-any",
3824 .{zig_lib_dir},
3825 );
3826
3827 return LibCDirs{
3828 .libc_include_dir_list = list,
3829 .libc_installation = null,
3830 };
3831 },
3832 else => {
3833 const generic_name = target_util.libCGenericName(target);
3834 // Some architectures are handled by the same set of headers.
3835 const arch_name = if (target.abi.isMusl())
3836 musl.archName(target.cpu.arch)
3837 else if (target.cpu.arch.isThumb())
3838 // ARM headers are valid for Thumb too.
3839 switch (target.cpu.arch) {
3840 .thumb => "arm",
3841 .thumbeb => "armeb",
3842 else => unreachable,
3843 }
3844 else
3845 @tagName(target.cpu.arch);
3846 const os_name = @tagName(target.os.tag);
3847 // Musl's headers are ABI-agnostic and so they all have the "musl" ABI name.
3848 const abi_name = if (target.abi.isMusl()) "musl" else @tagName(target.abi);
3849 const s = std.fs.path.sep_str;
3850 const arch_include_dir = try std.fmt.allocPrint(
3851 arena,
3852 "{s}" ++ s ++ "libc" ++ s ++ "include" ++ s ++ "{s}-{s}-{s}",
3853 .{ zig_lib_dir, arch_name, os_name, abi_name },
3854 );
3855 const generic_include_dir = try std.fmt.allocPrint(
3856 arena,
3857 "{s}" ++ s ++ "libc" ++ s ++ "include" ++ s ++ "generic-{s}",
3858 .{ zig_lib_dir, generic_name },
3859 );
3860 const arch_os_include_dir = try std.fmt.allocPrint(
3861 arena,
3862 "{s}" ++ s ++ "libc" ++ s ++ "include" ++ s ++ "{s}-{s}-any",
3863 .{ zig_lib_dir, @tagName(target.cpu.arch), os_name },
3864 );
3865 const generic_os_include_dir = try std.fmt.allocPrint(
3866 arena,
3867 "{s}" ++ s ++ "libc" ++ s ++ "include" ++ s ++ "any-{s}-any",
3868 .{ zig_lib_dir, os_name },
3869 );
3870
3871 const list = try arena.alloc([]const u8, 4);
3872 list[0] = arch_include_dir;
3873 list[1] = generic_include_dir;
3874 list[2] = arch_os_include_dir;
3875 list[3] = generic_os_include_dir;
3876
3877 return LibCDirs{
3878 .libc_include_dir_list = list,
3879 .libc_installation = null,
3880 };
3881 },
3882 }
3848 }3883 }
38493884
3850 // If zig can't build the libc for the target and we are targeting the3885 // If zig can't build the libc for the target and we are targeting the
src/target.zig+10-2
...@@ -5,6 +5,7 @@ pub const ArchOsAbi = struct {...@@ -5,6 +5,7 @@ pub const ArchOsAbi = struct {
5 arch: std.Target.Cpu.Arch,5 arch: std.Target.Cpu.Arch,
6 os: std.Target.Os.Tag,6 os: std.Target.Os.Tag,
7 abi: std.Target.Abi,7 abi: std.Target.Abi,
8 os_ver: ?std.builtin.Version = null,
8};9};
910
10pub const available_libcs = [_]ArchOsAbi{11pub const available_libcs = [_]ArchOsAbi{
...@@ -14,7 +15,8 @@ pub const available_libcs = [_]ArchOsAbi{...@@ -14,7 +15,8 @@ pub const available_libcs = [_]ArchOsAbi{
14 .{ .arch = .aarch64, .os = .linux, .abi = .gnu },15 .{ .arch = .aarch64, .os = .linux, .abi = .gnu },
15 .{ .arch = .aarch64, .os = .linux, .abi = .musl },16 .{ .arch = .aarch64, .os = .linux, .abi = .musl },
16 .{ .arch = .aarch64, .os = .windows, .abi = .gnu },17 .{ .arch = .aarch64, .os = .windows, .abi = .gnu },
17 .{ .arch = .aarch64, .os = .macos, .abi = .gnu },18 .{ .arch = .aarch64, .os = .macos, .abi = .gnu, .os_ver = .{ .major = 11, .minor = 0 } },
19 .{ .arch = .aarch64, .os = .macos, .abi = .gnu, .os_ver = .{ .major = 12, .minor = 0 } },
18 .{ .arch = .armeb, .os = .linux, .abi = .gnueabi },20 .{ .arch = .armeb, .os = .linux, .abi = .gnueabi },
19 .{ .arch = .armeb, .os = .linux, .abi = .gnueabihf },21 .{ .arch = .armeb, .os = .linux, .abi = .gnueabihf },
20 .{ .arch = .armeb, .os = .linux, .abi = .musleabi },22 .{ .arch = .armeb, .os = .linux, .abi = .musleabi },
...@@ -64,7 +66,9 @@ pub const available_libcs = [_]ArchOsAbi{...@@ -64,7 +66,9 @@ pub const available_libcs = [_]ArchOsAbi{
64 .{ .arch = .x86_64, .os = .linux, .abi = .gnux32 },66 .{ .arch = .x86_64, .os = .linux, .abi = .gnux32 },
65 .{ .arch = .x86_64, .os = .linux, .abi = .musl },67 .{ .arch = .x86_64, .os = .linux, .abi = .musl },
66 .{ .arch = .x86_64, .os = .windows, .abi = .gnu },68 .{ .arch = .x86_64, .os = .windows, .abi = .gnu },
67 .{ .arch = .x86_64, .os = .macos, .abi = .gnu },69 .{ .arch = .x86_64, .os = .macos, .abi = .gnu, .os_ver = .{ .major = 10, .minor = 0 } },
70 .{ .arch = .x86_64, .os = .macos, .abi = .gnu, .os_ver = .{ .major = 11, .minor = 0 } },
71 .{ .arch = .x86_64, .os = .macos, .abi = .gnu, .os_ver = .{ .major = 12, .minor = 0 } },
68};72};
6973
70pub fn libCGenericName(target: std.Target) [:0]const u8 {74pub fn libCGenericName(target: std.Target) [:0]const u8 {
...@@ -105,6 +109,10 @@ pub fn libCGenericName(target: std.Target) [:0]const u8 {...@@ -105,6 +109,10 @@ pub fn libCGenericName(target: std.Target) [:0]const u8 {
105pub fn canBuildLibC(target: std.Target) bool {109pub fn canBuildLibC(target: std.Target) bool {
106 for (available_libcs) |libc| {110 for (available_libcs) |libc| {
107 if (target.cpu.arch == libc.arch and target.os.tag == libc.os and target.abi == libc.abi) {111 if (target.cpu.arch == libc.arch and target.os.tag == libc.os and target.abi == libc.abi) {
112 if (target.os.tag == .macos) {
113 const ver = target.os.version_range.semver;
114 if (ver.min.major != libc.os_ver.?.major) continue; // no match, keep going
115 }
108 return true;116 return true;
109 }117 }
110 }118 }