commit fcdb7027e9f606cf0f4415daee73cb717affe69e (tree)
parent 0c83fa2fd03fec86c4e36075978646f202deec32
Author: Jacob Young <jacobly0@users.noreply.github.com>
Date: Sun, 7 Apr 2024 21:19:12 -0400
haiku: fix linking issues
Diffstat:
4 files changed, 22 insertions(+), 2 deletions(-)
diff --git a/build.zig b/build.zig
@@ -747,6 +747,9 @@ fn addCmakeCfgOptionsToExe(
try addCxxKnownPath(b, cfg, exe, b.fmt("libstdc++.{s}", .{lib_suffix}), null, need_cpp_includes);
try addCxxKnownPath(b, cfg, exe, b.fmt("libgcc_eh.{s}", .{lib_suffix}), null, need_cpp_includes);
},
+ .haiku => {
+ try addCxxKnownPath(b, cfg, exe, b.fmt("libstdc++.{s}", .{lib_suffix}), null, need_cpp_includes);
+ },
else => {},
}
}
diff --git a/lib/std/Target.zig b/lib/std/Target.zig
@@ -2740,6 +2740,13 @@ pub fn is_libc_lib_name(target: std.Target, name: []const u8) bool {
return true;
}
+ if (target.os.tag == .haiku) {
+ if (eqlIgnoreCase(ignore_case, name, "root"))
+ return true;
+ if (eqlIgnoreCase(ignore_case, name, "network"))
+ return true;
+ }
+
return false;
}
diff --git a/lib/std/zig/system/NativePaths.zig b/lib/std/zig/system/NativePaths.zig
@@ -105,6 +105,13 @@ pub fn detect(arena: Allocator, native_target: std.Target) !NativePaths {
return self;
}
+ if (builtin.os.tag == .haiku) {
+ try self.addLibDir("/system/non-packaged/lib");
+ try self.addLibDir("/system/develop/lib");
+ try self.addLibDir("/system/lib");
+ return self;
+ }
+
if (builtin.os.tag != .windows and builtin.os.tag != .wasi) {
const triple = try native_target.linuxTriple(arena);
diff --git a/src/link/Elf.zig b/src/link/Elf.zig
@@ -1517,7 +1517,7 @@ fn dumpArgv(self: *Elf, comp: *Compilation) !void {
if (self.base.isStatic()) {
try argv.append("-static");
- } else if (self.base.isDynLib()) {
+ } else if (self.base.isDynLib() or (target.os.tag == .haiku and self.base.isExe())) {
try argv.append("-shared");
}
@@ -2469,7 +2469,10 @@ fn linkWithLLD(self: *Elf, arena: Allocator, prog_node: *std.Progress.Node) !voi
} else {
try argv.append("-static");
}
- } else if (is_dyn_lib) {
+ } else if (switch (target.os.tag) {
+ else => is_dyn_lib,
+ .haiku => is_exe_or_dyn_lib,
+ }) {
try argv.append("-shared");
}