🍈
Zig プロジェクトにコンパイル時情報を追加する方法
Zig は、addOptions
関数を提供しており、これにより build.step
に追加の情報を追加できます。
const build_options = b.addOptions();
exe.addOptions("build_options", build_options);
私たちはコード内で、その名前に対応するモジュールを直接インポートできます。
const build_options = @import("build_options");
以下は、現在のコミット SHA をコンパイル後の実行可能ファイルに追加する方法を示す小さなデモです:
build.zig
const build_options = b.addOptions();
exe.addOptions("metadata", build_options);
var commit_sha: [:0]const u8 = "";
if (b.env_map.get("GITHUB_SHA") orelse b.env_map.get("GIT_SHA")) |sha| {
commit_sha = b.allocator.dupeZ(u8, sha) catch unreachable;
} else {
sha: {
const result = std.ChildProcess.exec(.{
.allocator = b.allocator,
.argv = &.{
"git",
"rev-parse",
"HEAD",
},
.cwd = b.pathFromRoot("."),
.expand_arg0 = .expand,
}) catch break :sha;
commit_sha = b.allocator.dupeZ(u8, std.mem.trim(u8, result.stdout, "\n \t")) catch unreachable;
}
}
build_options.addOption(@TypeOf(commit_sha), "commit_sha", commit_sha);
src/main.zig
const std = @import("std");
const metadata = @import("metadata");
pub fn main() !void {
std.debug.print("commit sha is {s}\n", .{metadata.commit_sha});
}
Discussion