🍈

Zig プロジェクトにコンパイル時情報を追加する方法

2023/08/14に公開

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