diff --git a/lib/std/Build/Module.zig b/lib/std/Build/Module.zig index 76d1bf8816..347695a4c0 100644 --- a/lib/std/Build/Module.zig +++ b/lib/std/Build/Module.zig @@ -492,11 +492,11 @@ pub fn linkSystemLibrary( const b = m.owner; const target = m.requireKnownTarget(); - if (target.isLibCLibName(name)) { + if (std.zig.target.isLibCLibName(target, name)) { m.link_libc = true; return; } - if (target.isLibCxxLibName(name)) { + if (std.zig.target.isLibCxxLibName(target, name)) { m.link_libcpp = true; return; } diff --git a/lib/std/Build/Step/Compile.zig b/lib/std/Build/Step/Compile.zig index 6a9ed48a9d..469fbdf74a 100644 --- a/lib/std/Build/Step/Compile.zig +++ b/lib/std/Build/Step/Compile.zig @@ -611,11 +611,13 @@ pub fn dependsOnSystemLibrary(compile: *const Compile, name: []const u8) bool { is_linking_libcpp = is_linking_libcpp or module.link_libcpp == true; } - if (compile.rootModuleTarget().isLibCLibName(name)) { + const target = compile.rootModuleTarget(); + + if (std.zig.target.isLibCLibName(target, name)) { return is_linking_libc; } - if (compile.rootModuleTarget().isLibCxxLibName(name)) { + if (std.zig.target.isLibCxxLibName(target, name)) { return is_linking_libcpp; } diff --git a/lib/std/Target.zig b/lib/std/Target.zig index 14776e8b24..9cd7efed92 100644 --- a/lib/std/Target.zig +++ b/lib/std/Target.zig @@ -2868,141 +2868,6 @@ pub fn cTypePreferredAlignment(target: Target, c_type: CType) u16 { ); } -pub fn isLibCLibName(target: std.Target, name: []const u8) bool { - const ignore_case = target.os.tag.isDarwin() or target.os.tag == .windows; - - if (eqlIgnoreCase(ignore_case, name, "c")) - return true; - - if (target.isMinGW()) { - if (eqlIgnoreCase(ignore_case, name, "m")) - return true; - if (eqlIgnoreCase(ignore_case, name, "mingw32")) - return true; - if (eqlIgnoreCase(ignore_case, name, "msvcrt-os")) - return true; - if (eqlIgnoreCase(ignore_case, name, "mingwex")) - return true; - if (eqlIgnoreCase(ignore_case, name, "uuid")) - return true; - if (eqlIgnoreCase(ignore_case, name, "bits")) - return true; - if (eqlIgnoreCase(ignore_case, name, "dmoguids")) - return true; - if (eqlIgnoreCase(ignore_case, name, "dxerr8")) - return true; - if (eqlIgnoreCase(ignore_case, name, "dxerr9")) - return true; - if (eqlIgnoreCase(ignore_case, name, "mfuuid")) - return true; - if (eqlIgnoreCase(ignore_case, name, "msxml2")) - return true; - if (eqlIgnoreCase(ignore_case, name, "msxml6")) - return true; - if (eqlIgnoreCase(ignore_case, name, "amstrmid")) - return true; - if (eqlIgnoreCase(ignore_case, name, "wbemuuid")) - return true; - if (eqlIgnoreCase(ignore_case, name, "wmcodecdspuuid")) - return true; - if (eqlIgnoreCase(ignore_case, name, "dxguid")) - return true; - if (eqlIgnoreCase(ignore_case, name, "ksguid")) - return true; - if (eqlIgnoreCase(ignore_case, name, "locationapi")) - return true; - if (eqlIgnoreCase(ignore_case, name, "portabledeviceguids")) - return true; - if (eqlIgnoreCase(ignore_case, name, "mfuuid")) - return true; - if (eqlIgnoreCase(ignore_case, name, "dloadhelper")) - return true; - if (eqlIgnoreCase(ignore_case, name, "strmiids")) - return true; - if (eqlIgnoreCase(ignore_case, name, "mfuuid")) - return true; - if (eqlIgnoreCase(ignore_case, name, "adsiid")) - return true; - - return false; - } - - if (target.abi.isGnu() or target.abi.isMusl()) { - if (eqlIgnoreCase(ignore_case, name, "m")) - return true; - if (eqlIgnoreCase(ignore_case, name, "rt")) - return true; - if (eqlIgnoreCase(ignore_case, name, "pthread")) - return true; - if (eqlIgnoreCase(ignore_case, name, "util")) - return true; - if (eqlIgnoreCase(ignore_case, name, "resolv")) - return true; - if (eqlIgnoreCase(ignore_case, name, "dl")) - return true; - } - - if (target.abi.isMusl()) { - if (eqlIgnoreCase(ignore_case, name, "crypt")) - return true; - if (eqlIgnoreCase(ignore_case, name, "xnet")) - return true; - } - - if (target.os.tag.isDarwin()) { - if (eqlIgnoreCase(ignore_case, name, "System")) - return true; - if (eqlIgnoreCase(ignore_case, name, "c")) - return true; - if (eqlIgnoreCase(ignore_case, name, "dbm")) - return true; - if (eqlIgnoreCase(ignore_case, name, "dl")) - return true; - if (eqlIgnoreCase(ignore_case, name, "info")) - return true; - if (eqlIgnoreCase(ignore_case, name, "m")) - return true; - if (eqlIgnoreCase(ignore_case, name, "poll")) - return true; - if (eqlIgnoreCase(ignore_case, name, "proc")) - return true; - if (eqlIgnoreCase(ignore_case, name, "pthread")) - return true; - if (eqlIgnoreCase(ignore_case, name, "rpcsvc")) - return true; - } - - if (target.os.isAtLeast(.macos, .{ .major = 10, .minor = 8, .patch = 0 }) orelse false) { - if (eqlIgnoreCase(ignore_case, name, "mx")) - 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; -} - -pub fn isLibCxxLibName(target: std.Target, name: []const u8) bool { - const ignore_case = target.os.tag.isDarwin() or target.os.tag == .windows; - - return eqlIgnoreCase(ignore_case, name, "c++") or - eqlIgnoreCase(ignore_case, name, "stdc++") or - eqlIgnoreCase(ignore_case, name, "c++abi"); -} - -fn eqlIgnoreCase(ignore_case: bool, a: []const u8, b: []const u8) bool { - if (ignore_case) { - return std.ascii.eqlIgnoreCase(a, b); - } else { - return std.mem.eql(u8, a, b); - } -} - pub fn osArchName(target: std.Target) [:0]const u8 { return target.os.tag.archName(target.cpu.arch); } diff --git a/lib/std/zig/target.zig b/lib/std/zig/target.zig index 2e73c2de12..6db17c1f71 100644 --- a/lib/std/zig/target.zig +++ b/lib/std/zig/target.zig @@ -124,4 +124,139 @@ pub fn muslArchName(arch: std.Target.Cpu.Arch) [:0]const u8 { } } +pub fn isLibCLibName(target: std.Target, name: []const u8) bool { + const ignore_case = target.os.tag.isDarwin() or target.os.tag == .windows; + + if (eqlIgnoreCase(ignore_case, name, "c")) + return true; + + if (target.isMinGW()) { + if (eqlIgnoreCase(ignore_case, name, "m")) + return true; + if (eqlIgnoreCase(ignore_case, name, "mingw32")) + return true; + if (eqlIgnoreCase(ignore_case, name, "msvcrt-os")) + return true; + if (eqlIgnoreCase(ignore_case, name, "mingwex")) + return true; + if (eqlIgnoreCase(ignore_case, name, "uuid")) + return true; + if (eqlIgnoreCase(ignore_case, name, "bits")) + return true; + if (eqlIgnoreCase(ignore_case, name, "dmoguids")) + return true; + if (eqlIgnoreCase(ignore_case, name, "dxerr8")) + return true; + if (eqlIgnoreCase(ignore_case, name, "dxerr9")) + return true; + if (eqlIgnoreCase(ignore_case, name, "mfuuid")) + return true; + if (eqlIgnoreCase(ignore_case, name, "msxml2")) + return true; + if (eqlIgnoreCase(ignore_case, name, "msxml6")) + return true; + if (eqlIgnoreCase(ignore_case, name, "amstrmid")) + return true; + if (eqlIgnoreCase(ignore_case, name, "wbemuuid")) + return true; + if (eqlIgnoreCase(ignore_case, name, "wmcodecdspuuid")) + return true; + if (eqlIgnoreCase(ignore_case, name, "dxguid")) + return true; + if (eqlIgnoreCase(ignore_case, name, "ksguid")) + return true; + if (eqlIgnoreCase(ignore_case, name, "locationapi")) + return true; + if (eqlIgnoreCase(ignore_case, name, "portabledeviceguids")) + return true; + if (eqlIgnoreCase(ignore_case, name, "mfuuid")) + return true; + if (eqlIgnoreCase(ignore_case, name, "dloadhelper")) + return true; + if (eqlIgnoreCase(ignore_case, name, "strmiids")) + return true; + if (eqlIgnoreCase(ignore_case, name, "mfuuid")) + return true; + if (eqlIgnoreCase(ignore_case, name, "adsiid")) + return true; + + return false; + } + + if (target.abi.isGnu() or target.abi.isMusl()) { + if (eqlIgnoreCase(ignore_case, name, "m")) + return true; + if (eqlIgnoreCase(ignore_case, name, "rt")) + return true; + if (eqlIgnoreCase(ignore_case, name, "pthread")) + return true; + if (eqlIgnoreCase(ignore_case, name, "util")) + return true; + if (eqlIgnoreCase(ignore_case, name, "resolv")) + return true; + if (eqlIgnoreCase(ignore_case, name, "dl")) + return true; + } + + if (target.abi.isMusl()) { + if (eqlIgnoreCase(ignore_case, name, "crypt")) + return true; + if (eqlIgnoreCase(ignore_case, name, "xnet")) + return true; + } + + if (target.os.tag.isDarwin()) { + if (eqlIgnoreCase(ignore_case, name, "System")) + return true; + if (eqlIgnoreCase(ignore_case, name, "c")) + return true; + if (eqlIgnoreCase(ignore_case, name, "dbm")) + return true; + if (eqlIgnoreCase(ignore_case, name, "dl")) + return true; + if (eqlIgnoreCase(ignore_case, name, "info")) + return true; + if (eqlIgnoreCase(ignore_case, name, "m")) + return true; + if (eqlIgnoreCase(ignore_case, name, "poll")) + return true; + if (eqlIgnoreCase(ignore_case, name, "proc")) + return true; + if (eqlIgnoreCase(ignore_case, name, "pthread")) + return true; + if (eqlIgnoreCase(ignore_case, name, "rpcsvc")) + return true; + } + + if (target.os.isAtLeast(.macos, .{ .major = 10, .minor = 8, .patch = 0 }) orelse false) { + if (eqlIgnoreCase(ignore_case, name, "mx")) + 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; +} + +pub fn isLibCxxLibName(target: std.Target, name: []const u8) bool { + const ignore_case = target.os.tag.isDarwin() or target.os.tag == .windows; + + return eqlIgnoreCase(ignore_case, name, "c++") or + eqlIgnoreCase(ignore_case, name, "stdc++") or + eqlIgnoreCase(ignore_case, name, "c++abi"); +} + +fn eqlIgnoreCase(ignore_case: bool, a: []const u8, b: []const u8) bool { + if (ignore_case) { + return std.ascii.eqlIgnoreCase(a, b); + } else { + return std.mem.eql(u8, a, b); + } +} + const std = @import("std"); diff --git a/src/Sema.zig b/src/Sema.zig index f18648a27b..b8f35c5067 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -9606,7 +9606,7 @@ fn handleExternLibName( const comp = zcu.comp; const target = zcu.getTarget(); log.debug("extern fn symbol expected in lib '{s}'", .{lib_name}); - if (target.isLibCLibName(lib_name)) { + if (std.zig.target.isLibCLibName(target, lib_name)) { if (!comp.config.link_libc) { return sema.fail( block, @@ -9617,7 +9617,7 @@ fn handleExternLibName( } break :blk; } - if (target.isLibCxxLibName(lib_name)) { + if (std.zig.target.isLibCxxLibName(target, lib_name)) { if (!comp.config.link_libcpp) return sema.fail( block, src_loc, diff --git a/src/main.zig b/src/main.zig index 05e7c01229..058de72442 100644 --- a/src/main.zig +++ b/src/main.zig @@ -3765,11 +3765,11 @@ fn createModule( info: SystemLib, }) = .{}; for (create_module.system_libs.keys(), create_module.system_libs.values()) |lib_name, info| { - if (target.isLibCLibName(lib_name)) { + if (std.zig.target.isLibCLibName(target, lib_name)) { create_module.opts.link_libc = true; continue; } - if (target.isLibCxxLibName(lib_name)) { + if (std.zig.target.isLibCxxLibName(target, lib_name)) { create_module.opts.link_libcpp = true; continue; }