diff --git a/lib/std/build.zig b/lib/std/build.zig index 17cad016e8..efb305d4a3 100644 --- a/lib/std/build.zig +++ b/lib/std/build.zig @@ -2672,7 +2672,11 @@ pub const LibExeObjStep = struct { try zig_args.append(self.builder.pathFromRoot(include_path)); }, .raw_path_system => |include_path| { - try zig_args.append("-isystem"); + if (builder.sysroot != null) { + try zig_args.append("-iwithsysroot"); + } else { + try zig_args.append("-isystem"); + } try zig_args.append(self.builder.pathFromRoot(include_path)); }, .other_step => |other| if (other.emit_h) { @@ -2700,6 +2704,12 @@ pub const LibExeObjStep = struct { if (self.target.isDarwin()) { for (self.framework_dirs.items) |dir| { + if (builder.sysroot != null) { + try zig_args.append("-iframeworkwithsysroot"); + } else { + try zig_args.append("-iframework"); + } + try zig_args.append(dir); try zig_args.append("-F"); try zig_args.append(dir); } diff --git a/src/link/MachO.zig b/src/link/MachO.zig index 5d9b0e6fe1..6b0710129f 100644 --- a/src/link/MachO.zig +++ b/src/link/MachO.zig @@ -794,15 +794,14 @@ fn linkWithZld(self: *MachO, comp: *Compilation) !void { } } - // If we're compiling native and we can find libSystem.B.{dylib, tbd}, - // we link against that instead of embedded libSystem.B.tbd file. - var native_libsystem_available = false; - if (self.base.options.is_native_os) blk: { + // If we were given the sysroot, try to look there first for libSystem.B.{dylib, tbd}. + var libsystem_available = false; + if (self.base.options.sysroot != null) blk: { // Try stub file first. If we hit it, then we're done as the stub file // re-exports every single symbol definition. if (try resolveLib(arena, lib_dirs.items, "System", ".tbd")) |full_path| { try libs.append(full_path); - native_libsystem_available = true; + libsystem_available = true; break :blk; } // If we didn't hit the stub file, try .dylib next. However, libSystem.dylib @@ -811,12 +810,12 @@ fn linkWithZld(self: *MachO, comp: *Compilation) !void { if (try resolveLib(arena, lib_dirs.items, "c", ".dylib")) |libc_path| { try libs.append(libsystem_path); try libs.append(libc_path); - native_libsystem_available = true; + libsystem_available = true; break :blk; } } } - if (!native_libsystem_available) { + if (!libsystem_available) { const full_path = try comp.zig_lib_directory.join(arena, &[_][]const u8{ "libc", "darwin", "libSystem.B.tbd", }); @@ -841,7 +840,7 @@ fn linkWithZld(self: *MachO, comp: *Compilation) !void { break; } } else { - log.warn("framework not found for '-f{s}'", .{framework}); + log.warn("framework not found for '-framework {s}'", .{framework}); framework_not_found = true; } } @@ -901,10 +900,8 @@ fn linkWithZld(self: *MachO, comp: *Compilation) !void { try argv.append("-o"); try argv.append(full_out_path); - if (native_libsystem_available) { - try argv.append("-lSystem"); - try argv.append("-lc"); - } + try argv.append("-lSystem"); + try argv.append("-lc"); for (search_lib_names.items) |l_name| { try argv.append(try std.fmt.allocPrint(arena, "-l{s}", .{l_name})); @@ -914,6 +911,14 @@ fn linkWithZld(self: *MachO, comp: *Compilation) !void { try argv.append(try std.fmt.allocPrint(arena, "-L{s}", .{lib_dir})); } + for (self.base.options.frameworks) |framework| { + try argv.append(try std.fmt.allocPrint(arena, "-framework {s}", .{framework})); + } + + for (self.base.options.framework_dirs) |framework_dir| { + try argv.append(try std.fmt.allocPrint(arena, "-F{s}", .{framework_dir})); + } + Compilation.dump_argv(argv.items); } diff --git a/src/main.zig b/src/main.zig index 0987a46989..73c4560ddf 100644 --- a/src/main.zig +++ b/src/main.zig @@ -830,7 +830,10 @@ fn buildOutputType( } else if (mem.eql(u8, arg, "-D") or mem.eql(u8, arg, "-isystem") or mem.eql(u8, arg, "-I") or - mem.eql(u8, arg, "-dirafter")) + mem.eql(u8, arg, "-dirafter") or + mem.eql(u8, arg, "-iwithsysroot") or + mem.eql(u8, arg, "-iframework") or + mem.eql(u8, arg, "-iframeworkwithsysroot")) { if (i + 1 >= args.len) fatal("expected parameter after {s}", .{arg}); i += 1; @@ -873,6 +876,8 @@ fn buildOutputType( if (i + 1 >= args.len) fatal("expected parameter after {s}", .{arg}); i += 1; sysroot = args[i]; + try clang_argv.append("-isysroot"); + try clang_argv.append(args[i]); } else if (mem.eql(u8, arg, "--libc")) { if (i + 1 >= args.len) fatal("expected parameter after {s}", .{arg}); i += 1;