Commit 4ce6208750

Jakub Konka <kubkon@jakubkonka.com>
2021-12-12 13:49:24
macho: if lib or framework not found, wait until syms resolved
This way, we will inform the user that there are unresolved symbols in addition to missing library/framework as requested on the linker line. If all symbols were resolved on the other hand, we still flag up that the library/framework cannot be found. Example behaviour: ``` $ zig cc hello.c -framework MyFoundation --verbose warning(link): framework not found for '-framework MyFoundation' warning(link): Framework search paths: warning(link): /Library/Frameworks warning(link): /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks thread 1079397 panic: attempt to unwrap error: FrameworkNotFound ...stack trace... ``` and ``` ❯ zig cc hello.c -lWAT --verbose warning(link): library not found for '-lWAT' warning(link): Library search paths: warning(link): /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/lib warning(link): /usr/local/lib thread 1079824 panic: attempt to unwrap error: LibraryNotFound ...stack trace... ```
1 parent 1abae06
Changed files (1)
src
src/link/MachO.zig
@@ -572,6 +572,9 @@ pub fn flushModule(self: *MachO, comp: *Compilation) !void {
             try self.populateMissingMetadata();
         }
 
+        var lib_not_found = false;
+        var framework_not_found = false;
+
         if (needs_full_relink) {
             for (self.objects.items) |*object| {
                 object.free(self.base.allocator, self);
@@ -688,7 +691,6 @@ pub fn flushModule(self: *MachO, comp: *Compilation) !void {
             }
 
             var libs = std.ArrayList([]const u8).init(arena);
-            var lib_not_found = false;
             for (search_lib_names.items) |lib_name| {
                 // Assume ld64 default: -search_paths_first
                 // Look in each directory for a dylib (stub first), and then for archive
@@ -760,13 +762,14 @@ pub fn flushModule(self: *MachO, comp: *Compilation) !void {
                     }
                 } else {
                     log.warn("framework not found for '-framework {s}'", .{framework});
-                    log.warn("Framework search paths:", .{});
-                    for (framework_dirs.items) |dir| {
-                        log.warn("  {s}", .{dir});
-                    } else {
-                        log.warn("  <empty>. Consider specifying --sysroot", .{});
-                    }
-                    return error.FrameworkNotFound;
+                    framework_not_found = true;
+                }
+            }
+
+            if (framework_not_found) {
+                log.warn("Framework search paths:", .{});
+                for (framework_dirs.items) |dir| {
+                    log.warn("  {s}", .{dir});
                 }
             }
 
@@ -926,6 +929,12 @@ pub fn flushModule(self: *MachO, comp: *Compilation) !void {
         if (self.unresolved.count() > 0) {
             return error.UndefinedSymbolReference;
         }
+        if (lib_not_found) {
+            return error.LibraryNotFound;
+        }
+        if (framework_not_found) {
+            return error.FrameworkNotFound;
+        }
 
         try self.createTentativeDefAtoms();
         try self.parseObjectsIntoAtoms();