@@ -214,6 +214,17 @@ pub const Builder = struct {
214
214
name ,
215
215
if (root_src ) | p | FileSource { .path = p } else null ,
216
216
false ,
217
+ null ,
218
+ );
219
+ }
220
+
221
+ pub fn addExecutableCustomExtension (self : * Builder , name : []const u8 , root_src : ? []const u8 , custom_extension : ? [] const u8 ) * LibExeObjStep {
222
+ return LibExeObjStep .createExecutable (
223
+ self ,
224
+ name ,
225
+ if (root_src ) | p | FileSource { .path = p } else null ,
226
+ false ,
227
+ custom_extension ,
217
228
);
218
229
}
219
230
@@ -228,15 +239,15 @@ pub const Builder = struct {
228
239
.step = wfs ,
229
240
.basename = basename ,
230
241
},
231
- }), false );
242
+ }), false , null );
232
243
}
233
244
234
245
pub fn addExecutableSource (
235
246
self : * Builder ,
236
247
name : []const u8 ,
237
248
root_src : ? FileSource ,
238
249
) * LibExeObjStep {
239
- return LibExeObjStep .createExecutable (self , name , root_src , false );
250
+ return LibExeObjStep .createExecutable (self , name , root_src , false , null );
240
251
}
241
252
242
253
pub fn addObject (self : * Builder , name : []const u8 , root_src : ? []const u8 ) * LibExeObjStep {
@@ -1129,6 +1140,7 @@ pub const LibExeObjStep = struct {
1129
1140
version : Version ,
1130
1141
build_mode : builtin.Mode ,
1131
1142
kind : Kind ,
1143
+ emit : ? Emit ,
1132
1144
major_only_filename : []const u8 ,
1133
1145
name_only_filename : []const u8 ,
1134
1146
strip : bool ,
@@ -1199,6 +1211,8 @@ pub const LibExeObjStep = struct {
1199
1211
1200
1212
subsystem : ? builtin.SubSystem = null ,
1201
1213
1214
+ custom_extension : ? []const u8 = null ,
1215
+
1202
1216
const LinkObject = union (enum ) {
1203
1217
StaticPath : []const u8 ,
1204
1218
OtherStep : * LibExeObjStep ,
@@ -1220,33 +1234,40 @@ pub const LibExeObjStep = struct {
1220
1234
Test ,
1221
1235
};
1222
1236
1237
+ const Emit = enum {
1238
+ Asm ,
1239
+ Bin ,
1240
+ LLVMIr ,
1241
+ Raw ,
1242
+ };
1243
+
1223
1244
pub fn createSharedLibrary (builder : * Builder , name : []const u8 , root_src : ? FileSource , ver : Version ) * LibExeObjStep {
1224
1245
const self = builder .allocator .create (LibExeObjStep ) catch unreachable ;
1225
- self .* = initExtraArgs (builder , name , root_src , Kind .Lib , true , ver );
1246
+ self .* = initExtraArgs (builder , name , root_src , Kind .Lib , true , ver , null );
1226
1247
return self ;
1227
1248
}
1228
1249
1229
1250
pub fn createStaticLibrary (builder : * Builder , name : []const u8 , root_src : ? FileSource ) * LibExeObjStep {
1230
1251
const self = builder .allocator .create (LibExeObjStep ) catch unreachable ;
1231
- self .* = initExtraArgs (builder , name , root_src , Kind .Lib , false , builder .version (0 , 0 , 0 ));
1252
+ self .* = initExtraArgs (builder , name , root_src , Kind .Lib , false , builder .version (0 , 0 , 0 ), null );
1232
1253
return self ;
1233
1254
}
1234
1255
1235
1256
pub fn createObject (builder : * Builder , name : []const u8 , root_src : ? FileSource ) * LibExeObjStep {
1236
1257
const self = builder .allocator .create (LibExeObjStep ) catch unreachable ;
1237
- self .* = initExtraArgs (builder , name , root_src , Kind .Obj , false , builder .version (0 , 0 , 0 ));
1258
+ self .* = initExtraArgs (builder , name , root_src , Kind .Obj , false , builder .version (0 , 0 , 0 ), null );
1238
1259
return self ;
1239
1260
}
1240
1261
1241
- pub fn createExecutable (builder : * Builder , name : []const u8 , root_src : ? FileSource , is_dynamic : bool ) * LibExeObjStep {
1262
+ pub fn createExecutable (builder : * Builder , name : []const u8 , root_src : ? FileSource , is_dynamic : bool , custom_extension : ? [] const u8 , ) * LibExeObjStep {
1242
1263
const self = builder .allocator .create (LibExeObjStep ) catch unreachable ;
1243
- self .* = initExtraArgs (builder , name , root_src , Kind .Exe , is_dynamic , builder .version (0 , 0 , 0 ));
1264
+ self .* = initExtraArgs (builder , name , root_src , Kind .Exe , is_dynamic , builder .version (0 , 0 , 0 ), custom_extension );
1244
1265
return self ;
1245
1266
}
1246
1267
1247
1268
pub fn createTest (builder : * Builder , name : []const u8 , root_src : FileSource ) * LibExeObjStep {
1248
1269
const self = builder .allocator .create (LibExeObjStep ) catch unreachable ;
1249
- self .* = initExtraArgs (builder , name , root_src , Kind .Test , false , builder .version (0 , 0 , 0 ));
1270
+ self .* = initExtraArgs (builder , name , root_src , Kind .Test , false , builder .version (0 , 0 , 0 ), null );
1250
1271
return self ;
1251
1272
}
1252
1273
@@ -1257,6 +1278,7 @@ pub const LibExeObjStep = struct {
1257
1278
kind : Kind ,
1258
1279
is_dynamic : bool ,
1259
1280
ver : Version ,
1281
+ custom_extension : ? []const u8 ,
1260
1282
) LibExeObjStep {
1261
1283
if (mem .indexOf (u8 , name , "/" ) != null or mem .indexOf (u8 , name , "\\ " ) != null ) {
1262
1284
panic ("invalid name: '{}'. It looks like a file path, but it is supposed to be the library or application name." , .{name });
@@ -1269,6 +1291,7 @@ pub const LibExeObjStep = struct {
1269
1291
.build_mode = builtin .Mode .Debug ,
1270
1292
.is_dynamic = is_dynamic ,
1271
1293
.kind = kind ,
1294
+ .emit = null ,
1272
1295
.root_src = root_src ,
1273
1296
.name = name ,
1274
1297
.target = Target .Native ,
@@ -1305,6 +1328,7 @@ pub const LibExeObjStep = struct {
1305
1328
.single_threaded = false ,
1306
1329
.installed_path = null ,
1307
1330
.install_step = null ,
1331
+ .custom_extension = custom_extension ,
1308
1332
};
1309
1333
self .computeOutFileNames ();
1310
1334
if (root_src ) | rs | rs .addStepDependencies (& self .step );
@@ -1317,7 +1341,13 @@ pub const LibExeObjStep = struct {
1317
1341
self .out_filename = self .builder .fmt ("{}{}" , .{ self .name , self .target .oFileExt () });
1318
1342
},
1319
1343
.Exe = > {
1320
- self .out_filename = self .builder .fmt ("{}{}" , .{ self .name , self .target .exeFileExt () });
1344
+ const extension = blk : {
1345
+ if (self .custom_extension ) | ext | {
1346
+ break :blk ext ;
1347
+ }
1348
+ break :blk self .target .exeFileExt ();
1349
+ };
1350
+ self .out_filename = self .builder .fmt ("{}{}" , .{ self .name , extension });
1321
1351
},
1322
1352
.Test = > {
1323
1353
self .out_filename = self .builder .fmt ("test{}" , .{self .target .exeFileExt ()});
@@ -1384,6 +1414,10 @@ pub const LibExeObjStep = struct {
1384
1414
self .computeOutFileNames ();
1385
1415
}
1386
1416
1417
+ pub fn setEmit (self : * LibExeObjStep , emit : Emit ) void {
1418
+ self .emit = emit ;
1419
+ }
1420
+
1387
1421
pub fn setTargetGLibC (self : * LibExeObjStep , major : u32 , minor : u32 , patch : u32 ) void {
1388
1422
self .target_glibc = Version {
1389
1423
.major = major ,
@@ -1835,6 +1869,18 @@ pub const LibExeObjStep = struct {
1835
1869
1836
1870
if (self .root_src ) | root_src | try zig_args .append (root_src .getPath (builder ));
1837
1871
1872
+ if (self .emit ) | emit | {
1873
+ try zig_args .append ("--emit" );
1874
+
1875
+ const emitArg = switch (emit ) {
1876
+ .Asm = > "asm" ,
1877
+ .Bin = > "bin" ,
1878
+ .LLVMIr = > "llvm-ir" ,
1879
+ .Raw = > "raw" ,
1880
+ };
1881
+ try zig_args .append (emitArg );
1882
+ }
1883
+
1838
1884
for (self .link_objects .toSlice ()) | link_object | {
1839
1885
switch (link_object ) {
1840
1886
.StaticPath = > | static_path | {
@@ -1942,6 +1988,11 @@ pub const LibExeObjStep = struct {
1942
1988
zig_args .append ("--name" ) catch unreachable ;
1943
1989
zig_args .append (self .name ) catch unreachable ;
1944
1990
1991
+ if (self .custom_extension ) | ext | {
1992
+ try zig_args .append ("--custom-ext" );
1993
+ try zig_args .append (ext );
1994
+ }
1995
+
1945
1996
if (self .kind == Kind .Lib and self .is_dynamic ) {
1946
1997
zig_args .append ("--ver-major" ) catch unreachable ;
1947
1998
zig_args .append (builder .fmt ("{}" , .{self .version .major })) catch unreachable ;
0 commit comments