Skip to content

Commit

Permalink
* Add raw parameter to stage1 build-exe --emit
Browse files Browse the repository at this point in the history
* Add --custom-ext to stage1 build-exe, allow to customize the exectuable extension for --emit bin or --emit raw
* Add setEmit to Zig build system
* Add addExecutableCustomExtension to Zig build system to customize the executable extension, useful for emit raw
* Implement emit_raw in stage1/stage2 Zig that does a similar job to llvm-objcopy
* Add custom_extension and emit_raw / no_emit_raw to cache digest

Part of ziglang#2826
  • Loading branch information
mlarouche committed Jan 26, 2020
1 parent aaa2f9a commit 2329a72
Show file tree
Hide file tree
Showing 11 changed files with 476 additions and 77 deletions.
69 changes: 60 additions & 9 deletions lib/std/build.zig
Expand Up @@ -214,6 +214,17 @@ pub const Builder = struct {
name,
if (root_src) |p| FileSource{ .path = p } else null,
false,
null,
);
}

pub fn addExecutableCustomExtension(self: *Builder, name: []const u8, root_src: ?[]const u8, custom_extension: ?[] const u8) *LibExeObjStep {
return LibExeObjStep.createExecutable(
self,
name,
if (root_src) |p| FileSource{ .path = p } else null,
false,
custom_extension,
);
}

Expand All @@ -228,15 +239,15 @@ pub const Builder = struct {
.step = wfs,
.basename = basename,
},
}), false);
}), false, null);
}

pub fn addExecutableSource(
self: *Builder,
name: []const u8,
root_src: ?FileSource,
) *LibExeObjStep {
return LibExeObjStep.createExecutable(self, name, root_src, false);
return LibExeObjStep.createExecutable(self, name, root_src, false, null);
}

pub fn addObject(self: *Builder, name: []const u8, root_src: ?[]const u8) *LibExeObjStep {
Expand Down Expand Up @@ -1129,6 +1140,7 @@ pub const LibExeObjStep = struct {
version: Version,
build_mode: builtin.Mode,
kind: Kind,
emit: ?Emit,
major_only_filename: []const u8,
name_only_filename: []const u8,
strip: bool,
Expand Down Expand Up @@ -1199,6 +1211,8 @@ pub const LibExeObjStep = struct {

subsystem: ?builtin.SubSystem = null,

custom_extension: ?[]const u8 = null,

const LinkObject = union(enum) {
StaticPath: []const u8,
OtherStep: *LibExeObjStep,
Expand All @@ -1220,33 +1234,40 @@ pub const LibExeObjStep = struct {
Test,
};

const Emit = enum {
Asm,
Bin,
LLVMIr,
Raw,
};

pub fn createSharedLibrary(builder: *Builder, name: []const u8, root_src: ?FileSource, ver: Version) *LibExeObjStep {
const self = builder.allocator.create(LibExeObjStep) catch unreachable;
self.* = initExtraArgs(builder, name, root_src, Kind.Lib, true, ver);
self.* = initExtraArgs(builder, name, root_src, Kind.Lib, true, ver, null);
return self;
}

pub fn createStaticLibrary(builder: *Builder, name: []const u8, root_src: ?FileSource) *LibExeObjStep {
const self = builder.allocator.create(LibExeObjStep) catch unreachable;
self.* = initExtraArgs(builder, name, root_src, Kind.Lib, false, builder.version(0, 0, 0));
self.* = initExtraArgs(builder, name, root_src, Kind.Lib, false, builder.version(0, 0, 0), null);
return self;
}

pub fn createObject(builder: *Builder, name: []const u8, root_src: ?FileSource) *LibExeObjStep {
const self = builder.allocator.create(LibExeObjStep) catch unreachable;
self.* = initExtraArgs(builder, name, root_src, Kind.Obj, false, builder.version(0, 0, 0));
self.* = initExtraArgs(builder, name, root_src, Kind.Obj, false, builder.version(0, 0, 0), null);
return self;
}

pub fn createExecutable(builder: *Builder, name: []const u8, root_src: ?FileSource, is_dynamic: bool) *LibExeObjStep {
pub fn createExecutable(builder: *Builder, name: []const u8, root_src: ?FileSource, is_dynamic: bool, custom_extension: ?[]const u8,) *LibExeObjStep {
const self = builder.allocator.create(LibExeObjStep) catch unreachable;
self.* = initExtraArgs(builder, name, root_src, Kind.Exe, is_dynamic, builder.version(0, 0, 0));
self.* = initExtraArgs(builder, name, root_src, Kind.Exe, is_dynamic, builder.version(0, 0, 0), custom_extension);
return self;
}

pub fn createTest(builder: *Builder, name: []const u8, root_src: FileSource) *LibExeObjStep {
const self = builder.allocator.create(LibExeObjStep) catch unreachable;
self.* = initExtraArgs(builder, name, root_src, Kind.Test, false, builder.version(0, 0, 0));
self.* = initExtraArgs(builder, name, root_src, Kind.Test, false, builder.version(0, 0, 0), null);
return self;
}

Expand All @@ -1257,6 +1278,7 @@ pub const LibExeObjStep = struct {
kind: Kind,
is_dynamic: bool,
ver: Version,
custom_extension: ?[]const u8,
) LibExeObjStep {
if (mem.indexOf(u8, name, "/") != null or mem.indexOf(u8, name, "\\") != null) {
panic("invalid name: '{}'. It looks like a file path, but it is supposed to be the library or application name.", .{name});
Expand All @@ -1269,6 +1291,7 @@ pub const LibExeObjStep = struct {
.build_mode = builtin.Mode.Debug,
.is_dynamic = is_dynamic,
.kind = kind,
.emit = null,
.root_src = root_src,
.name = name,
.target = Target.Native,
Expand Down Expand Up @@ -1305,6 +1328,7 @@ pub const LibExeObjStep = struct {
.single_threaded = false,
.installed_path = null,
.install_step = null,
.custom_extension = custom_extension,
};
self.computeOutFileNames();
if (root_src) |rs| rs.addStepDependencies(&self.step);
Expand All @@ -1317,7 +1341,13 @@ pub const LibExeObjStep = struct {
self.out_filename = self.builder.fmt("{}{}", .{ self.name, self.target.oFileExt() });
},
.Exe => {
self.out_filename = self.builder.fmt("{}{}", .{ self.name, self.target.exeFileExt() });
const extension = blk: {
if (self.custom_extension) |ext| {
break :blk ext;
}
break :blk self.target.exeFileExt();
};
self.out_filename = self.builder.fmt("{}{}", .{ self.name, extension });
},
.Test => {
self.out_filename = self.builder.fmt("test{}", .{self.target.exeFileExt()});
Expand Down Expand Up @@ -1384,6 +1414,10 @@ pub const LibExeObjStep = struct {
self.computeOutFileNames();
}

pub fn setEmit(self: *LibExeObjStep, emit: Emit) void {
self.emit = emit;
}

pub fn setTargetGLibC(self: *LibExeObjStep, major: u32, minor: u32, patch: u32) void {
self.target_glibc = Version{
.major = major,
Expand Down Expand Up @@ -1835,6 +1869,18 @@ pub const LibExeObjStep = struct {

if (self.root_src) |root_src| try zig_args.append(root_src.getPath(builder));

if (self.emit) |emit| {
try zig_args.append("--emit");

const emitArg = switch (emit) {
.Asm => "asm",
.Bin => "bin",
.LLVMIr => "llvm-ir",
.Raw => "raw",
};
try zig_args.append(emitArg);
}

for (self.link_objects.toSlice()) |link_object| {
switch (link_object) {
.StaticPath => |static_path| {
Expand Down Expand Up @@ -1942,6 +1988,11 @@ pub const LibExeObjStep = struct {
zig_args.append("--name") catch unreachable;
zig_args.append(self.name) catch unreachable;

if (self.custom_extension) |ext| {
try zig_args.append("--custom-ext");
try zig_args.append(ext);
}

if (self.kind == Kind.Lib and self.is_dynamic) {
zig_args.append("--ver-major") catch unreachable;
zig_args.append(builder.fmt("{}", .{self.version.major})) catch unreachable;
Expand Down
4 changes: 2 additions & 2 deletions lib/std/debug.zig
Expand Up @@ -928,8 +928,8 @@ fn readSparseBitVector(stream: var, allocator: *mem.Allocator) ![]usize {
fn findDwarfSectionFromElf(elf_file: *elf.Elf, name: []const u8) !?DwarfInfo.Section {
const elf_header = (try elf_file.findSection(name)) orelse return null;
return DwarfInfo.Section{
.offset = elf_header.offset,
.size = elf_header.size,
.offset = elf_header.sh_offset,
.size = elf_header.sh_size,
};
}

Expand Down

0 comments on commit 2329a72

Please sign in to comment.