macos: detect SDK path and version, then pass to the linker

Since we are already detecting the path to the native SDK,
if available, also fetch SDK's version and route that to the linker.
The linker can then use it to correctly populate LC_BUILD_VERSION
load command.
This commit is contained in:
Jakub Konka
2021-11-26 16:08:44 +01:00
parent 02d8ca71f9
commit 8317dbd1cb
5 changed files with 88 additions and 35 deletions

View File

@@ -773,8 +773,8 @@ pub const InitOptions = struct {
wasi_exec_model: ?std.builtin.WasiExecModel = null,
/// (Zig compiler development) Enable dumping linker's state as JSON.
enable_link_snapshots: bool = false,
/// (Darwin). Path to native macOS SDK if detected.
native_macos_sdk_path: ?[]const u8 = null,
/// (Darwin) Path and version of the native SDK if detected.
native_darwin_sdk: ?std.zig.system.darwin.DarwinSDK = null,
};
fn addPackageTableToCacheHash(
@@ -967,8 +967,8 @@ pub fn create(gpa: *Allocator, options: InitOptions) !*Compilation {
const sysroot = blk: {
if (options.sysroot) |sysroot| {
break :blk sysroot;
} else if (options.native_macos_sdk_path) |sdk_path| {
break :blk sdk_path;
} else if (options.native_darwin_sdk) |sdk| {
break :blk sdk.path;
} else {
break :blk null;
}
@@ -1055,7 +1055,7 @@ pub fn create(gpa: *Allocator, options: InitOptions) !*Compilation {
link_libc,
options.system_lib_names.len != 0 or options.frameworks.len != 0,
options.libc_installation,
options.native_macos_sdk_path != null,
options.native_darwin_sdk != null,
);
const must_pie = target_util.requiresPIE(options.target);
@@ -1492,6 +1492,7 @@ pub fn create(gpa: *Allocator, options: InitOptions) !*Compilation {
.wasi_exec_model = wasi_exec_model,
.use_stage1 = use_stage1,
.enable_link_snapshots = options.enable_link_snapshots,
.native_darwin_sdk = options.native_darwin_sdk,
});
errdefer bin_file.destroy();
comp.* = .{
@@ -3829,7 +3830,7 @@ fn detectLibCIncludeDirs(
if (link_system_libs and is_native_abi and !target.isMinGW()) {
if (target.isDarwin()) {
return if (has_macos_sdk)
// For Darwin/macOS, we are all set with getSDKPath found earlier.
// For Darwin/macOS, we are all set with getDarwinSDK found earlier.
LibCDirs{
.libc_include_dir_list = &[0][]u8{},
.libc_installation = null,
@@ -3846,7 +3847,14 @@ fn detectLibCIncludeDirs(
// default if possible.
if (target_util.canBuildLibC(target)) {
switch (target.os.tag) {
.macos => return getZigShippedLibCIncludeDirsDarwin(arena, zig_lib_dir, target),
.macos => return if (has_macos_sdk)
// For Darwin/macOS, we are all set with getDarwinSDK found earlier.
LibCDirs{
.libc_include_dir_list = &[0][]u8{},
.libc_installation = null,
}
else
getZigShippedLibCIncludeDirsDarwin(arena, zig_lib_dir, target),
else => {
const generic_name = target_util.libCGenericName(target);
// Some architectures are handled by the same set of headers.