aboutsummaryrefslogtreecommitdiff
path: root/lib/std
diff options
context:
space:
mode:
authorAlex Rønne Petersen <alex@alexrp.com>2024-10-17 02:49:34 +0200
committerGitHub <noreply@github.com>2024-10-17 02:49:34 +0200
commitd38ed893c6ece24e52b2e0a1f8d75f6a912686d7 (patch)
treedd79b7c06c3482c47d62305e1b53278fe995cc1b /lib/std
parent4a2a0f50caac5e6f7f17e5abe17dd53e9bdc1731 (diff)
parent549a7eba40aebaad2ede0fef3a574f52315c36cf (diff)
downloadzig-d38ed893c6ece24e52b2e0a1f8d75f6a912686d7.tar.gz
zig-d38ed893c6ece24e52b2e0a1f8d75f6a912686d7.zip
Merge pull request #21726 from alexrp/target-api
`std.Target`: Some miscellaneous API improvements
Diffstat (limited to 'lib/std')
-rw-r--r--lib/std/Build/Module.zig4
-rw-r--r--lib/std/Build/Step/Compile.zig6
-rw-r--r--lib/std/Target.zig153
-rw-r--r--lib/std/Target/Query.zig4
-rw-r--r--lib/std/zig/target.zig135
5 files changed, 149 insertions, 153 deletions
diff --git a/lib/std/Build/Module.zig b/lib/std/Build/Module.zig
index 253945b3d7..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.is_libc_lib_name(name)) {
+ if (std.zig.target.isLibCLibName(target, name)) {
m.link_libc = true;
return;
}
- if (target.is_libcpp_lib_name(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 a977dc3056..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().is_libc_lib_name(name)) {
+ const target = compile.rootModuleTarget();
+
+ if (std.zig.target.isLibCLibName(target, name)) {
return is_linking_libc;
}
- if (compile.rootModuleTarget().is_libcpp_lib_name(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 0958ce589e..ffe6173825 100644
--- a/lib/std/Target.zig
+++ b/lib/std/Target.zig
@@ -157,7 +157,7 @@ pub const Os = struct {
};
}
- pub inline fn getVersionRangeTag(tag: Tag) @typeInfo(TaggedVersionRange).@"union".tag_type.? {
+ pub inline fn versionRangeTag(tag: Tag) @typeInfo(TaggedVersionRange).@"union".tag_type.? {
return switch (tag) {
.freestanding,
.fuchsia,
@@ -545,8 +545,8 @@ pub const Os = struct {
/// Provides a tagged union. `Target` does not store the tag because it is
/// redundant with the OS tag; this function abstracts that part away.
- pub inline fn getVersionRange(os: Os) TaggedVersionRange {
- return switch (os.tag.getVersionRangeTag()) {
+ pub inline fn versionRange(os: Os) TaggedVersionRange {
+ return switch (os.tag.versionRangeTag()) {
.none => .{ .none = {} },
.semver => .{ .semver = os.version_range.semver },
.linux => .{ .linux = os.version_range.linux },
@@ -556,12 +556,12 @@ pub const Os = struct {
/// Checks if system is guaranteed to be at least `version` or older than `version`.
/// Returns `null` if a runtime check is required.
- pub inline fn isAtLeast(os: Os, comptime tag: Tag, ver: switch (tag.getVersionRangeTag()) {
+ pub inline fn isAtLeast(os: Os, comptime tag: Tag, ver: switch (tag.versionRangeTag()) {
.none => void,
.semver, .linux => std.SemanticVersion,
.windows => WindowsVersion,
}) ?bool {
- return if (os.tag != tag) false else switch (tag.getVersionRangeTag()) {
+ return if (os.tag != tag) false else switch (tag.versionRangeTag()) {
.none => true,
inline .semver,
.linux,
@@ -925,8 +925,6 @@ pub const ObjectFormat = enum {
};
pub fn toElfMachine(target: Target) std.elf.EM {
- if (target.os.tag == .elfiamcu) return .IAMCU;
-
return switch (target.cpu.arch) {
.amdgcn => .AMDGPU,
.arc => .ARC_COMPACT,
@@ -950,7 +948,7 @@ pub fn toElfMachine(target: Target) std.elf.EM {
.sparc64 => .SPARCV9,
.spu_2 => .SPU_2,
.ve => .VE,
- .x86 => .@"386",
+ .x86 => if (target.os.tag == .elfiamcu) .IAMCU else .@"386",
.x86_64 => .X86_64,
.xcore => .XCORE,
.xtensa => .XTENSA,
@@ -1756,10 +1754,6 @@ pub inline fn isBSD(target: Target) bool {
return target.os.tag.isBSD();
}
-pub inline fn isBpfFreestanding(target: Target) bool {
- return target.cpu.arch.isBpf() and target.os.tag == .freestanding;
-}
-
pub inline fn isGnuLibC(target: Target) bool {
return target.os.tag.isGnuLibC(target.abi);
}
@@ -2870,141 +2864,6 @@ pub fn cTypePreferredAlignment(target: Target, c_type: CType) u16 {
);
}
-pub fn is_libc_lib_name(target: std.Target, name: []const u8) bool {
- const ignore_case = target.os.tag == .macos 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, "xnet"))
- 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 (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 is_libcpp_lib_name(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/Target/Query.zig b/lib/std/Target/Query.zig
index 7fa8c9e9c8..26001f1408 100644
--- a/lib/std/Target/Query.zig
+++ b/lib/std/Target/Query.zig
@@ -124,7 +124,7 @@ pub fn fromTarget(target: Target) Query {
}
fn updateOsVersionRange(self: *Query, os: Target.Os) void {
- self.os_version_min, self.os_version_max = switch (os.tag.getVersionRangeTag()) {
+ self.os_version_min, self.os_version_max = switch (os.tag.versionRangeTag()) {
.none => .{ .{ .none = {} }, .{ .none = {} } },
.semver => .{
.{ .semver = os.version_range.semver.min },
@@ -523,7 +523,7 @@ fn parseOs(result: *Query, diags: *ParseOptions.Diagnostics, text: []const u8) !
diags.os_tag = tag;
const version_text = it.rest();
- if (version_text.len > 0) switch (tag.getVersionRangeTag()) {
+ if (version_text.len > 0) switch (tag.versionRangeTag()) {
.none => return error.InvalidOperatingSystemVersion,
.semver, .linux => range: {
var range_it = mem.splitSequence(u8, version_text, "...");
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");