| author | |
| committer | |
| log | a0ad2dee6a0b3bb7fd04032f6113206f7b4e73eb |
| tree | 3af35b3737044d92a507541684e240be9f86d64d |
| parent | 5c49a137d5948310d8abbf9d6f1fb899e7122239 |
This will enable code to perform version checks and make it easier to
support multiple versions of Zig.
Within the SemVer implementation, an intermediate value needed to be
coerced to a slice to workaround a comptime bug.
Closes #64662 files changed, 16 insertions(+), 1 deletions(-)
lib/std/SemanticVersion.zig+10-1| ... | ... | @@ -102,7 +102,7 @@ pub fn parse(text: []const u8) !Version { |
| 102 | 102 | if (extra_index == null) return ver; |
| 103 | 103 | |
| 104 | 104 | // Slice optional pre-release or build metadata components. |
| 105 | const extra = text[extra_index.?..text.len]; | |
| 105 | const extra: []const u8 = text[extra_index.?..text.len]; | |
| 106 | 106 | if (extra[0] == '-') { |
| 107 | 107 | const build_index = std.mem.indexOfScalar(u8, extra, '+'); |
| 108 | 108 | ver.pre = extra[1..(build_index orelse extra.len)]; |
| ... | ... | @@ -293,3 +293,12 @@ fn testFmt(expected: []const u8, comptime template: []const u8, args: anytype) ! |
| 293 | 293 | std.debug.warn("\n======================================\n", .{}); |
| 294 | 294 | return error.TestFailed; |
| 295 | 295 | } |
| 296 | ||
| 297 | test "zig_version" { | |
| 298 | // An approximate Zig build that predates this test. | |
| 299 | const older_version = .{ .major = 0, .minor = 8, .patch = 0, .pre = "dev.874" }; | |
| 300 | ||
| 301 | // Simulated compatibility check using Zig version. | |
| 302 | const compatible = comptime @import("builtin").zig_version.order(older_version) == .gt; | |
| 303 | if (!compatible) @compileError("zig_version test failed"); | |
| 304 | } |
src/Compilation.zig+6| ... | ... | @@ -2703,6 +2703,11 @@ pub fn generateBuiltinZigSource(comp: *Compilation, allocator: *Allocator) ![]u8 |
| 2703 | 2703 | \\pub const arch = Target.current.cpu.arch; |
| 2704 | 2704 | \\/// Deprecated |
| 2705 | 2705 | \\pub const endian = Target.current.cpu.arch.endian(); |
| 2706 | \\ | |
| 2707 | \\/// Zig version. When writing code that supports multiple versions of Zig, prefer | |
| 2708 | \\/// feature detection (i.e. with `@hasDecl` or `@hasField`) over version checks. | |
| 2709 | \\pub const zig_version = try @import("std").SemanticVersion.parse("{s}"); | |
| 2710 | \\ | |
| 2706 | 2711 | \\pub const output_mode = OutputMode.{}; |
| 2707 | 2712 | \\pub const link_mode = LinkMode.{}; |
| 2708 | 2713 | \\pub const is_test = {}; |
| ... | ... | @@ -2714,6 +2719,7 @@ pub fn generateBuiltinZigSource(comp: *Compilation, allocator: *Allocator) ![]u8 |
| 2714 | 2719 | \\ .features = Target.{}.featureSet(&[_]Target.{}.Feature{{ |
| 2715 | 2720 | \\ |
| 2716 | 2721 | , .{ |
| 2722 | build_options.version, | |
| 2717 | 2723 | std.zig.fmtId(@tagName(comp.bin_file.options.output_mode)), |
| 2718 | 2724 | std.zig.fmtId(@tagName(comp.bin_file.options.link_mode)), |
| 2719 | 2725 | comp.bin_file.options.is_test, |