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 {
269269 .macos => return .{
270270 .semver = .{
271271 .min = .{ .major = 10, .minor = 13 },
272 .max = .{ .major = 11, .minor = 2 },
272 .max = .{ .major = 12, .minor = 0 },
273273 },
274274 },
275275 .ios => return .{
src/Compilation.zig+81-46
......@@ -3798,53 +3798,88 @@ fn detectLibCIncludeDirs(
37983798 // If not linking system libraries, build and provide our own libc by
37993799 // default if possible.
38003800 if (target_util.canBuildLibC(target)) {
3801 const generic_name = target_util.libCGenericName(target);
3802 // Some architectures are handled by the same set of headers.
3803 const arch_name = if (target.abi.isMusl())
3804 musl.archName(target.cpu.arch)
3805 else if (target.cpu.arch.isThumb())
3806 // ARM headers are valid for Thumb too.
3807 switch (target.cpu.arch) {
3808 .thumb => "arm",
3809 .thumbeb => "armeb",
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 );
3801 switch (target.os.tag) {
3802 .macos => {
3803 const arch_name = @tagName(target.cpu.arch);
3804 const os_name = try std.fmt.allocPrint(arena, "{s}.{d}", .{
3805 @tagName(target.os.tag),
3806 target.os.version_range.semver.min.major,
3807 });
3808 const s = std.fs.path.sep_str;
3809 const list = try arena.alloc([]const u8, 3);
38383810
3839 const list = try arena.alloc([]const u8, 4);
3840 list[0] = arch_include_dir;
3841 list[1] = generic_include_dir;
3842 list[2] = arch_os_include_dir;
3843 list[3] = generic_os_include_dir;
3844 return LibCDirs{
3845 .libc_include_dir_list = list,
3846 .libc_installation = null,
3847 };
3811 list[0] = try std.fmt.allocPrint(
3812 arena,
3813 "{s}" ++ s ++ "libc" ++ s ++ "include" ++ s ++ "{s}-{s}-gnu",
3814 .{ zig_lib_dir, arch_name, os_name },
3815 );
3816 list[1] = try std.fmt.allocPrint(
3817 arena,
3818 "{s}" ++ s ++ "libc" ++ s ++ "include" ++ s ++ "any-{s}-any",
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 }
38483883 }
38493884
38503885 // 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 {
55 arch: std.Target.Cpu.Arch,
66 os: std.Target.Os.Tag,
77 abi: std.Target.Abi,
8 os_ver: ?std.builtin.Version = null,
89};
910
1011pub const available_libcs = [_]ArchOsAbi{
......@@ -14,7 +15,8 @@ pub const available_libcs = [_]ArchOsAbi{
1415 .{ .arch = .aarch64, .os = .linux, .abi = .gnu },
1516 .{ .arch = .aarch64, .os = .linux, .abi = .musl },
1617 .{ .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 } },
1820 .{ .arch = .armeb, .os = .linux, .abi = .gnueabi },
1921 .{ .arch = .armeb, .os = .linux, .abi = .gnueabihf },
2022 .{ .arch = .armeb, .os = .linux, .abi = .musleabi },
......@@ -64,7 +66,9 @@ pub const available_libcs = [_]ArchOsAbi{
6466 .{ .arch = .x86_64, .os = .linux, .abi = .gnux32 },
6567 .{ .arch = .x86_64, .os = .linux, .abi = .musl },
6668 .{ .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 } },
6872};
6973
7074pub fn libCGenericName(target: std.Target) [:0]const u8 {
......@@ -105,6 +109,10 @@ pub fn libCGenericName(target: std.Target) [:0]const u8 {
105109pub fn canBuildLibC(target: std.Target) bool {
106110 for (available_libcs) |libc| {
107111 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 }
108116 return true;
109117 }
110118 }