mirror of
https://codeberg.org/ziglang/zig.git
synced 2025-12-06 05:44:20 +00:00
std.Target: Move isLib{C,Cxx}LibName() to std.zig.target.
These are really answering questions about the Zig compiler's capacity to provide a libc/libc++ implementation. As such, std.zig.target seems like a more fitting place for these.
This commit is contained in:
parent
bdb00b393e
commit
140fb615a6
6 changed files with 145 additions and 143 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue