Skip to content

Commit

Permalink
zig cc: support -Bdynamic and -Bstatic parameters
Browse files Browse the repository at this point in the history
Related: #10050
  • Loading branch information
andrewrk committed Nov 26, 2021
1 parent b196dd1 commit eec825c
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 2 deletions.
2 changes: 1 addition & 1 deletion src/link/Elf.zig
Original file line number Diff line number Diff line change
Expand Up @@ -1553,7 +1553,7 @@ fn linkWithLLD(self: *Elf, comp: *Compilation) !void {
defer test_path.deinit();
for (self.base.options.lib_dirs) |lib_dir_path| {
for (self.base.options.system_libs.keys()) |link_lib| {
test_path.shrinkRetainingCapacity(0);
test_path.clearRetainingCapacity();
const sep = fs.path.sep_str;
try test_path.writer().print("{s}" ++ sep ++ "lib{s}.so", .{
lib_dir_path, link_lib,
Expand Down
63 changes: 62 additions & 1 deletion src/main.zig
Original file line number Diff line number Diff line change
Expand Up @@ -668,6 +668,9 @@ fn buildOutputType(
var system_libs = std.StringArrayHashMap(Compilation.SystemLib).init(gpa);
defer system_libs.deinit();

var static_libs = std.ArrayList([]const u8).init(gpa);
defer static_libs.deinit();

var wasi_emulated_libs = std.ArrayList(wasi_libc.CRTFile).init(gpa);
defer wasi_emulated_libs.deinit();

Expand Down Expand Up @@ -1253,6 +1256,7 @@ fn buildOutputType(
var it = ClangArgIterator.init(arena, all_args);
var emit_llvm = false;
var needed = false;
var force_static_libs = false;
while (it.has_next) {
it.next() catch |err| {
fatal("unable to parse command line parameters: {s}", .{@errorName(err)});
Expand Down Expand Up @@ -1287,7 +1291,11 @@ fn buildOutputType(
// -l
// We don't know whether this library is part of libc or libc++ until
// we resolve the target, so we simply append to the list for now.
try system_libs.put(it.only_arg, .{ .needed = needed });
if (force_static_libs) {
try static_libs.append(it.only_arg);
} else {
try system_libs.put(it.only_arg, .{ .needed = needed });
}
},
.ignore => {},
.driver_punt => {
Expand Down Expand Up @@ -1333,6 +1341,17 @@ fn buildOutputType(
needed = false;
} else if (mem.eql(u8, linker_arg, "--no-as-needed")) {
needed = true;
} else if (mem.eql(u8, linker_arg, "-Bdynamic") or
mem.eql(u8, linker_arg, "-dy") or
mem.eql(u8, linker_arg, "-call_shared"))
{
force_static_libs = false;
} else if (mem.eql(u8, linker_arg, "-Bstatic") or
mem.eql(u8, linker_arg, "-dn") or
mem.eql(u8, linker_arg, "-non_shared") or
mem.eql(u8, linker_arg, "-static"))
{
force_static_libs = true;
} else {
try linker_args.append(linker_arg);
}
Expand Down Expand Up @@ -1893,6 +1912,48 @@ fn buildOutputType(
}
}

{
// Resolve static libraries into full paths.
const sep = fs.path.sep_str;

var test_path = std.ArrayList(u8).init(gpa);
defer test_path.deinit();

for (static_libs.items) |static_lib| {
for (lib_dirs.items) |lib_dir_path| {
test_path.clearRetainingCapacity();
try test_path.writer().print("{s}" ++ sep ++ "{s}{s}{s}", .{
lib_dir_path,
target_info.target.libPrefix(),
static_lib,
target_info.target.staticLibSuffix(),
});
fs.cwd().access(test_path.items, .{}) catch |err| switch (err) {
error.FileNotFound => continue,
else => |e| fatal("unable to search for static library '{s}': {s}", .{
test_path.items, @errorName(e),
}),
};
try link_objects.append(try arena.dupe(u8, test_path.items));
break;
} else {
var search_paths = std.ArrayList(u8).init(arena);
for (lib_dirs.items) |lib_dir_path| {
try search_paths.writer().print("\n {s}" ++ sep ++ "{s}{s}{s}", .{
lib_dir_path,
target_info.target.libPrefix(),
static_lib,
target_info.target.staticLibSuffix(),
});
}
try search_paths.appendSlice("\n suggestion: use full paths to static libraries on the command line rather than using -l and -L arguments");
fatal("static library '{s}' not found. search paths: {s}", .{
static_lib, search_paths.items,
});
}
}
}

const object_format: std.Target.ObjectFormat = blk: {
const ofmt = target_ofmt orelse break :blk target_info.target.getObjectFormat();
if (mem.eql(u8, ofmt, "elf")) {
Expand Down

0 comments on commit eec825c

Please sign in to comment.