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...
```
This commit is contained in:
Jakub Konka 2021-12-12 13:49:24 +01:00
parent 1abae06432
commit 4ce6208750

View File

@ -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();