diff options
| author | Jakub Konka <kubkon@jakubkonka.com> | 2020-12-20 11:45:48 +0100 |
|---|---|---|
| committer | Jakub Konka <kubkon@jakubkonka.com> | 2021-01-02 15:29:05 +0100 |
| commit | 91a35e1a922e865ca0e9beb43a2be2c5552fc494 (patch) | |
| tree | d12efbc864e83cff8ceaaccdd4181978078acc75 /src | |
| parent | a9c75a2b48f202d5c55097877499942ed07cc2e8 (diff) | |
| download | zig-91a35e1a922e865ca0e9beb43a2be2c5552fc494.tar.gz zig-91a35e1a922e865ca0e9beb43a2be2c5552fc494.zip | |
Detect native iframework dirs on macOS
This commit adds default search paths for system frameworks
on macOS while also adding `-isysroot` for OS versions at least BigSur.
Since BigSur (11.0.1), neither headers nor libs exist in standard
root locations (`/usr/include`, `/System/Library/Frameworks`). Instead, they
are now exclusively part of the installed developer toolchain (either
via XCode.app or CLT), and specifying `-isysroot` allows us to keep
using universal search paths such as `/System/Library/Frameworks` while
only changing the include flag from `-iframework` to
`-iframeworkwithsysroot`.
Diffstat (limited to 'src')
| -rw-r--r-- | src/Compilation.zig | 7 | ||||
| -rw-r--r-- | src/main.zig | 26 |
2 files changed, 26 insertions, 7 deletions
diff --git a/src/Compilation.zig b/src/Compilation.zig index cd3db84ec2..4fd0e54aa8 100644 --- a/src/Compilation.zig +++ b/src/Compilation.zig @@ -2079,12 +2079,6 @@ pub fn addCCArgs( try argv.append("-ffunction-sections"); } - try argv.ensureCapacity(argv.items.len + comp.bin_file.options.framework_dirs.len * 2); - for (comp.bin_file.options.framework_dirs) |framework_dir| { - argv.appendAssumeCapacity("-iframework"); - argv.appendAssumeCapacity(framework_dir); - } - if (comp.bin_file.options.link_libcpp) { const libcxx_include_path = try std.fs.path.join(arena, &[_][]const u8{ comp.zig_lib_directory.path.?, "libcxx", "include", @@ -2894,6 +2888,7 @@ fn buildOutputFromZig( .directory = null, // Put it in the cache directory. .basename = bin_basename, }; + const sub_compilation = try Compilation.create(comp.gpa, .{ .global_cache_directory = comp.global_cache_directory, .local_cache_directory = comp.global_cache_directory, diff --git a/src/main.zig b/src/main.zig index 247f8327f0..096fa86c75 100644 --- a/src/main.zig +++ b/src/main.zig @@ -1436,11 +1436,35 @@ fn buildOutputType( for (paths.warnings.items) |warning| { warn("{}", .{warning}); } + + const has_sysroot = if (comptime std.Target.current.isDarwin()) outer: { + const at_least_big_sur = target_info.target.os.getVersionRange().semver.min.major >= 11; + if (at_least_big_sur) { + const sdk_path = try std.zig.system.getSDKPath(arena); + try clang_argv.ensureCapacity(clang_argv.items.len + 2); + clang_argv.appendAssumeCapacity("-isysroot"); + clang_argv.appendAssumeCapacity(sdk_path); + break :outer true; + } + break :outer false; + } else false; + try clang_argv.ensureCapacity(clang_argv.items.len + paths.include_dirs.items.len * 2); + const isystem_flag = if (has_sysroot) "-iwithsysroot" else "-isystem"; for (paths.include_dirs.items) |include_dir| { - clang_argv.appendAssumeCapacity("-isystem"); + clang_argv.appendAssumeCapacity(isystem_flag); clang_argv.appendAssumeCapacity(include_dir); } + + try clang_argv.ensureCapacity(clang_argv.items.len + paths.framework_dirs.items.len * 2); + try framework_dirs.ensureCapacity(framework_dirs.items.len + paths.framework_dirs.items.len); + const iframework_flag = if (has_sysroot) "-iframeworkwithsysroot" else "-iframework"; + for (paths.framework_dirs.items) |framework_dir| { + clang_argv.appendAssumeCapacity(iframework_flag); + clang_argv.appendAssumeCapacity(framework_dir); + framework_dirs.appendAssumeCapacity(framework_dir); + } + for (paths.lib_dirs.items) |lib_dir| { try lib_dirs.append(lib_dir); } |
