diff --git a/lib/std/build.zig b/lib/std/build.zig index 9169bcf3d0ba..f53dcc36328b 100644 --- a/lib/std/build.zig +++ b/lib/std/build.zig @@ -531,7 +531,7 @@ pub const Builder = struct { options.appendAssumeCapacity(field.name); } - break :blk options.toOwnedSlice(); + break :blk options.toOwnedSlice() catch unreachable; } else null; const available_option = AvailableOption{ .name = name, diff --git a/test/standalone.zig b/test/standalone.zig index da28fda86a84..8605c2ad7df0 100644 --- a/test/standalone.zig +++ b/test/standalone.zig @@ -5,6 +5,17 @@ const tests = @import("tests.zig"); pub fn addCases(cases: *tests.StandaloneContext) void { cases.add("test/standalone/hello_world/hello.zig"); cases.addC("test/standalone/hello_world/hello_libc.zig"); + + cases.addBuildFile("test/standalone/options/build.zig", .{ + .extra_argv = &.{ + "-Dbool_true", + "-Dbool_false=false", + "-Dint=1234", + "-De=two", + "-Dstring=hello", + }, + }); + cases.add("test/standalone/cat/main.zig"); if (builtin.zig_backend == .stage1) { // https://github.com/ziglang/zig/issues/6025 cases.add("test/standalone/issue_9693/main.zig"); diff --git a/test/standalone/options/build.zig b/test/standalone/options/build.zig new file mode 100644 index 000000000000..087aceff019a --- /dev/null +++ b/test/standalone/options/build.zig @@ -0,0 +1,22 @@ +const std = @import("std"); + +pub fn build(b: *std.build.Builder) void { + const target = b.standardTargetOptions(.{}); + const mode = b.standardReleaseOptions(); + + const main = b.addTest("src/main.zig"); + main.setTarget(target); + main.setBuildMode(mode); + + const options = b.addOptions(); + main.addOptions("build_options", options); + options.addOption(bool, "bool_true", b.option(bool, "bool_true", "t").?); + options.addOption(bool, "bool_false", b.option(bool, "bool_false", "f").?); + options.addOption(u32, "int", b.option(u32, "int", "i").?); + const E = enum { one, two, three }; + options.addOption(E, "e", b.option(E, "e", "e").?); + options.addOption([]const u8, "string", b.option([]const u8, "string", "s").?); + + const test_step = b.step("test", "Run unit tests"); + test_step.dependOn(&main.step); +} diff --git a/test/standalone/options/src/main.zig b/test/standalone/options/src/main.zig new file mode 100644 index 000000000000..e2bbe254c5a7 --- /dev/null +++ b/test/standalone/options/src/main.zig @@ -0,0 +1,12 @@ +const std = @import("std"); +const assert = std.debug.assert; + +const build_options = @import("build_options"); + +test "build options" { + comptime assert(build_options.bool_true); + comptime assert(!build_options.bool_false); + comptime assert(build_options.int == 1234); + comptime assert(build_options.e == .two); + comptime assert(std.mem.eql(u8, build_options.string, "hello")); +} diff --git a/test/tests.zig b/test/tests.zig index 0057e562f2c3..b738de86b0ad 100644 --- a/test/tests.zig +++ b/test/tests.zig @@ -1043,6 +1043,7 @@ pub const StandaloneContext = struct { requires_stage2: bool = false, use_emulation: bool = false, requires_symlinks: bool = false, + extra_argv: []const []const u8 = &.{}, }) void { const b = self.b; @@ -1063,6 +1064,8 @@ pub const StandaloneContext = struct { zig_args.append("--build-file") catch unreachable; zig_args.append(b.pathFromRoot(build_file)) catch unreachable; + zig_args.appendSlice(features.extra_argv) catch unreachable; + zig_args.append("test") catch unreachable; if (b.verbose) {