From fcdb7027e9f606cf0f4415daee73cb717affe69e Mon Sep 17 00:00:00 2001 From: Jacob Young Date: Sun, 7 Apr 2024 21:19:12 -0400 Subject: [PATCH] haiku: fix linking issues --- build.zig | 3 +++ lib/std/Target.zig | 7 +++++++ lib/std/zig/system/NativePaths.zig | 7 +++++++ src/link/Elf.zig | 7 +++++-- 4 files changed, 22 insertions(+), 2 deletions(-) diff --git a/build.zig b/build.zig index 11d716a17f..21059abd3c 100644 --- 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 index 842442e37b..55cde46308 100644 --- 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 index 9d9ab22812..2a50e27b0c 100644 --- 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 index c20a4b6afa..72937cd628 100644 --- 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"); }