@@ -320,6 +320,14 @@ pub const Builder = struct {
320
320
return LibExeObjStep .createTest (self , "test" , root_src .dupe (self ));
321
321
}
322
322
323
+ pub fn addTestExe (self : * Builder , name : []const u8 , root_src : []const u8 ) * LibExeObjStep {
324
+ return LibExeObjStep .createTestExe (self , name , .{ .path = root_src });
325
+ }
326
+
327
+ pub fn addTestExeSource (self : * Builder , name : []const u8 , root_src : FileSource ) * LibExeObjStep {
328
+ return LibExeObjStep .createTestExe (self , name , root_src .dupe (self ));
329
+ }
330
+
323
331
pub fn addAssemble (self : * Builder , name : []const u8 , src : []const u8 ) * LibExeObjStep {
324
332
return addAssembleSource (self , name , .{ .path = src });
325
333
}
@@ -1569,6 +1577,7 @@ pub const LibExeObjStep = struct {
1569
1577
lib ,
1570
1578
obj ,
1571
1579
@"test" ,
1580
+ test_exe ,
1572
1581
};
1573
1582
1574
1583
pub const SharedLibKind = union (enum ) {
@@ -1617,6 +1626,10 @@ pub const LibExeObjStep = struct {
1617
1626
return initExtraArgs (builder , name , root_src , .@"test" , null , null );
1618
1627
}
1619
1628
1629
+ pub fn createTestExe (builder : * Builder , name : []const u8 , root_src : FileSource ) * LibExeObjStep {
1630
+ return initExtraArgs (builder , name , root_src , .test_exe , null , null );
1631
+ }
1632
+
1620
1633
fn initExtraArgs (
1621
1634
builder : * Builder ,
1622
1635
name_raw : []const u8 ,
@@ -1698,7 +1711,7 @@ pub const LibExeObjStep = struct {
1698
1711
.output_mode = switch (self .kind ) {
1699
1712
.lib = > .Lib ,
1700
1713
.obj = > .Obj ,
1701
- .exe , .@"test" = > .Exe ,
1714
+ .exe , .@"test" , .test_exe = > .Exe ,
1702
1715
},
1703
1716
.link_mode = if (self .linkage ) | some | @as (std .builtin .LinkMode , switch (some ) {
1704
1717
.dynamic = > .Dynamic ,
@@ -1816,7 +1829,7 @@ pub const LibExeObjStep = struct {
1816
1829
pub fn producesPdbFile (self : * LibExeObjStep ) bool {
1817
1830
if (! self .target .isWindows () and ! self .target .isUefi ()) return false ;
1818
1831
if (self .strip ) return false ;
1819
- return self .isDynamicLibrary () or self .kind == .exe ;
1832
+ return self .isDynamicLibrary () or self .kind == .exe or self . kind == .test_exe ;
1820
1833
}
1821
1834
1822
1835
pub fn linkLibC (self : * LibExeObjStep ) void {
@@ -1976,12 +1989,12 @@ pub const LibExeObjStep = struct {
1976
1989
}
1977
1990
1978
1991
pub fn setNamePrefix (self : * LibExeObjStep , text : []const u8 ) void {
1979
- assert (self .kind == .@"test" );
1992
+ assert (self .kind == .@"test" or self . kind == .test_exe );
1980
1993
self .name_prefix = self .builder .dupe (text );
1981
1994
}
1982
1995
1983
1996
pub fn setFilter (self : * LibExeObjStep , text : ? []const u8 ) void {
1984
- assert (self .kind == .@"test" );
1997
+ assert (self .kind == .@"test" or self . kind == .test_exe );
1985
1998
self .filter = if (text ) | t | self .builder .dupe (t ) else null ;
1986
1999
}
1987
2000
@@ -2222,6 +2235,7 @@ pub const LibExeObjStep = struct {
2222
2235
.exe = > "build-exe" ,
2223
2236
.obj = > "build-obj" ,
2224
2237
.@"test" = > "test" ,
2238
+ .test_exe = > "test" ,
2225
2239
};
2226
2240
zig_args .append (cmd ) catch unreachable ;
2227
2241
@@ -2268,8 +2282,9 @@ pub const LibExeObjStep = struct {
2268
2282
.static_path = > | static_path | try zig_args .append (static_path .getPath (builder )),
2269
2283
2270
2284
.other_step = > | other | switch (other .kind ) {
2271
- .exe = > unreachable ,
2272
- .@"test" = > unreachable ,
2285
+ .exe = > @panic ("Cannot link with an executable build artifact" ),
2286
+ .test_exe = > @panic ("Cannot link with an executable build artifact" ),
2287
+ .@"test" = > @panic ("Cannot link with a test" ),
2273
2288
.obj = > {
2274
2289
try zig_args .append (other .getOutputSource ().getPath (builder ));
2275
2290
},
@@ -2542,89 +2557,93 @@ pub const LibExeObjStep = struct {
2542
2557
try zig_args .append (builder .pathFromRoot (version_script ));
2543
2558
}
2544
2559
2545
- if (self .exec_cmd_args ) | exec_cmd_args | {
2546
- for (exec_cmd_args ) | cmd_arg | {
2547
- if (cmd_arg ) | arg | {
2548
- try zig_args .append ("--test-cmd" );
2549
- try zig_args .append (arg );
2550
- } else {
2551
- try zig_args .append ("--test-cmd-bin" );
2552
- }
2553
- }
2554
- } else {
2555
- const need_cross_glibc = self .target .isGnuLibC () and self .is_linking_libc ;
2556
-
2557
- switch (self .builder .host .getExternalExecutor (self .target_info , .{
2558
- .qemu_fixes_dl = need_cross_glibc and builder .glibc_runtimes_dir != null ,
2559
- .link_libc = self .is_linking_libc ,
2560
- })) {
2561
- .native = > {},
2562
- .bad_dl , .bad_os_or_cpu = > {
2563
- try zig_args .append ("--test-no-exec" );
2564
- },
2565
- .rosetta = > if (builder .enable_rosetta ) {
2566
- try zig_args .append ("--test-cmd-bin" );
2567
- } else {
2568
- try zig_args .append ("--test-no-exec" );
2569
- },
2570
- .qemu = > | bin_name | ok : {
2571
- if (builder .enable_qemu ) qemu : {
2572
- const glibc_dir_arg = if (need_cross_glibc )
2573
- builder .glibc_runtimes_dir orelse break :qemu
2574
- else
2575
- null ;
2560
+ if (self .kind == .@"test" ) {
2561
+ if (self .exec_cmd_args ) | exec_cmd_args | {
2562
+ for (exec_cmd_args ) | cmd_arg | {
2563
+ if (cmd_arg ) | arg | {
2576
2564
try zig_args .append ("--test-cmd" );
2577
- try zig_args .append (bin_name );
2578
- if (glibc_dir_arg ) | dir | {
2579
- // TODO look into making this a call to `linuxTriple`. This
2580
- // needs the directory to be called "i686" rather than
2581
- // "i386" which is why we do it manually here.
2582
- const fmt_str = "{s}" ++ fs .path .sep_str ++ "{s}-{s}-{s}" ;
2583
- const cpu_arch = self .target .getCpuArch ();
2584
- const os_tag = self .target .getOsTag ();
2585
- const abi = self .target .getAbi ();
2586
- const cpu_arch_name : []const u8 = if (cpu_arch == .i386 )
2587
- "i686"
2565
+ try zig_args .append (arg );
2566
+ } else {
2567
+ try zig_args .append ("--test-cmd-bin" );
2568
+ }
2569
+ }
2570
+ } else {
2571
+ const need_cross_glibc = self .target .isGnuLibC () and self .is_linking_libc ;
2572
+
2573
+ switch (self .builder .host .getExternalExecutor (self .target_info , .{
2574
+ .qemu_fixes_dl = need_cross_glibc and builder .glibc_runtimes_dir != null ,
2575
+ .link_libc = self .is_linking_libc ,
2576
+ })) {
2577
+ .native = > {},
2578
+ .bad_dl , .bad_os_or_cpu = > {
2579
+ try zig_args .append ("--test-no-exec" );
2580
+ },
2581
+ .rosetta = > if (builder .enable_rosetta ) {
2582
+ try zig_args .append ("--test-cmd-bin" );
2583
+ } else {
2584
+ try zig_args .append ("--test-no-exec" );
2585
+ },
2586
+ .qemu = > | bin_name | ok : {
2587
+ if (builder .enable_qemu ) qemu : {
2588
+ const glibc_dir_arg = if (need_cross_glibc )
2589
+ builder .glibc_runtimes_dir orelse break :qemu
2588
2590
else
2589
- @tagName (cpu_arch );
2590
- const full_dir = try std .fmt .allocPrint (builder .allocator , fmt_str , .{
2591
- dir , cpu_arch_name , @tagName (os_tag ), @tagName (abi ),
2592
- });
2593
-
2591
+ null ;
2594
2592
try zig_args .append ("--test-cmd" );
2595
- try zig_args .append ("-L" );
2596
- try zig_args .append ("--test-cmd" );
2597
- try zig_args .append (full_dir );
2593
+ try zig_args .append (bin_name );
2594
+ if (glibc_dir_arg ) | dir | {
2595
+ // TODO look into making this a call to `linuxTriple`. This
2596
+ // needs the directory to be called "i686" rather than
2597
+ // "i386" which is why we do it manually here.
2598
+ const fmt_str = "{s}" ++ fs .path .sep_str ++ "{s}-{s}-{s}" ;
2599
+ const cpu_arch = self .target .getCpuArch ();
2600
+ const os_tag = self .target .getOsTag ();
2601
+ const abi = self .target .getAbi ();
2602
+ const cpu_arch_name : []const u8 = if (cpu_arch == .i386 )
2603
+ "i686"
2604
+ else
2605
+ @tagName (cpu_arch );
2606
+ const full_dir = try std .fmt .allocPrint (builder .allocator , fmt_str , .{
2607
+ dir , cpu_arch_name , @tagName (os_tag ), @tagName (abi ),
2608
+ });
2609
+
2610
+ try zig_args .append ("--test-cmd" );
2611
+ try zig_args .append ("-L" );
2612
+ try zig_args .append ("--test-cmd" );
2613
+ try zig_args .append (full_dir );
2614
+ }
2615
+ try zig_args .append ("--test-cmd-bin" );
2616
+ break :ok ;
2598
2617
}
2618
+ try zig_args .append ("--test-no-exec" );
2619
+ },
2620
+ .wine = > | bin_name | if (builder .enable_wine ) {
2621
+ try zig_args .append ("--test-cmd" );
2622
+ try zig_args .append (bin_name );
2599
2623
try zig_args .append ("--test-cmd-bin" );
2600
- break :ok ;
2601
- }
2602
- try zig_args .append ("--test-no-exec" );
2603
- },
2604
- .wine = > | bin_name | if (builder .enable_wine ) {
2605
- try zig_args .append ("--test-cmd" );
2606
- try zig_args .append (bin_name );
2607
- try zig_args .append ("--test-cmd-bin" );
2608
- } else {
2609
- try zig_args .append ("--test-no-exec" );
2610
- },
2611
- .wasmtime = > | bin_name | if (builder .enable_wasmtime ) {
2612
- try zig_args .append ("--test-cmd" );
2613
- try zig_args .append (bin_name );
2614
- try zig_args .append ("--test-cmd" );
2615
- try zig_args .append ("--dir=." );
2616
- try zig_args .append ("--test-cmd-bin" );
2617
- } else {
2618
- try zig_args .append ("--test-no-exec" );
2619
- },
2620
- .darling = > | bin_name | if (builder .enable_darling ) {
2621
- try zig_args .append ("--test-cmd" );
2622
- try zig_args .append (bin_name );
2623
- try zig_args .append ("--test-cmd-bin" );
2624
- } else {
2625
- try zig_args .append ("--test-no-exec" );
2626
- },
2624
+ } else {
2625
+ try zig_args .append ("--test-no-exec" );
2626
+ },
2627
+ .wasmtime = > | bin_name | if (builder .enable_wasmtime ) {
2628
+ try zig_args .append ("--test-cmd" );
2629
+ try zig_args .append (bin_name );
2630
+ try zig_args .append ("--test-cmd" );
2631
+ try zig_args .append ("--dir=." );
2632
+ try zig_args .append ("--test-cmd-bin" );
2633
+ } else {
2634
+ try zig_args .append ("--test-no-exec" );
2635
+ },
2636
+ .darling = > | bin_name | if (builder .enable_darling ) {
2637
+ try zig_args .append ("--test-cmd" );
2638
+ try zig_args .append (bin_name );
2639
+ try zig_args .append ("--test-cmd-bin" );
2640
+ } else {
2641
+ try zig_args .append ("--test-no-exec" );
2642
+ },
2643
+ }
2627
2644
}
2645
+ } else if (self .kind == .test_exe ) {
2646
+ try zig_args .append ("--test-no-exec" );
2628
2647
}
2629
2648
2630
2649
for (self .packages .items ) | pkg | {
@@ -2877,13 +2896,13 @@ pub const InstallArtifactStep = struct {
2877
2896
.step = Step .init (.install_artifact , builder .fmt ("install {s}" , .{artifact .step .name }), builder .allocator , make ),
2878
2897
.artifact = artifact ,
2879
2898
.dest_dir = artifact .override_dest_dir orelse switch (artifact .kind ) {
2880
- .obj = > unreachable ,
2881
- .@"test" = > unreachable ,
2882
- .exe = > InstallDir { .bin = {} },
2899
+ .obj = > @panic ( "Cannot install a .obj build artifact." ) ,
2900
+ .@"test" = > @panic ( "Cannot install a test build artifact, use addTestExe instead." ) ,
2901
+ .exe , .test_exe = > InstallDir { .bin = {} },
2883
2902
.lib = > InstallDir { .lib = {} },
2884
2903
},
2885
2904
.pdb_dir = if (artifact .producesPdbFile ()) blk : {
2886
- if (artifact .kind == .exe ) {
2905
+ if (artifact .kind == .exe or artifact . kind == .test_exe ) {
2887
2906
break :blk InstallDir { .bin = {} };
2888
2907
} else {
2889
2908
break :blk InstallDir { .lib = {} };
0 commit comments