Hi! I am building zig for riscv32im target and I came across an issue with build script. I need to copy .data section from the executable elf file as a raw binary data to another file. But this should happen only if this section exists. AFAIK there is no option in build API to skip the build step if it fails, so the whole build fails for me when there is no .data section in elf.
How can I do that zig way?
My current build script:
const std = @import("std");
const CrossTarget = @import("std").zig.CrossTarget;
const Target = @import("std").Target;
const Feature = @import("std").Target.Cpu.Feature;
pub fn build(std_build: *std.Build) void {
const features = Target.riscv.Feature;
var disabled_features = Feature.Set.empty;
var enabled_features = Feature.Set.empty;
disabled_features.addFeature(@intFromEnum(features.a));
disabled_features.addFeature(@intFromEnum(features.c));
disabled_features.addFeature(@intFromEnum(features.d));
disabled_features.addFeature(@intFromEnum(features.e));
disabled_features.addFeature(@intFromEnum(features.f));
enabled_features.addFeature(@intFromEnum(features.m));
const query = CrossTarget{
.cpu_arch = .riscv32,
.os_tag = .freestanding,
.abi = .none,
.cpu_model = .{
.explicit = &std.Target.riscv.cpu.generic_rv32
},
.cpu_features_sub = disabled_features,
.cpu_features_add = enabled_features
};
const target = std_build.resolveTargetQuery(query);
const elf = std_build.addExecutable(.{
.name = "main.elf",
.root_source_file = .{ .path = "src/main.zig" },
.target = target,
.optimize = .ReleaseFast
});
elf.setLinkerScriptPath(.{ .path = "src/linker.ld" });
std_build.installArtifact(elf);
const code_bin = std_build.addObjCopy(
elf.getEmittedBin(),
std.Build.Step.ObjCopy.Options {
.only_section = ".text",
.format = .bin
}
);
const copy_code_bin = std_build.addInstallBinFile(
code_bin.getOutput(),
"code.bin"
);
std_build.default_step.dependOn(©_code_bin.step);
const ram_bin = std_build.addObjCopy(
elf.getEmittedBin(),
std.Build.Step.ObjCopy.Options {
.only_section = ".data",
.format = .bin
}
);
const copy_ram_bin = std_build.addInstallBinFile(
ram_bin.getOutput(),
"ram.bin"
);
std_build.default_step.dependOn(©_ram_bin.step);
}