📚

build.zig.zonを使ったZigの新しいパッケージ管理

2023/06/01に公開

執筆時点でまだNightly (master)の機能なので、今後どんどん変わっていく可能性があるけれど、Zigのビルドシステムにnpmやpipのようなパッケージマネージャーを追加しようという動きがv0.11.0-devから始まっていて、その現時点での使い方として、zapのREADMEがとてもわかりやすい。

https://github.com/zigzap/zap/#using-zap-in-your-own-projects

要約すると以下の通り。

  • build.zig.zon[1] (npmでいうところのpackage.json) を以下のように作る。
build.zig.zon
.{
    .name = "My example project",
    .version = "0.0.1",

    .dependencies = .{
        // zap v0.1.6-pre
        .zap = .{
            .url = "https://github.com/zigzap/zap/archive/refs/tags/v0.1.6-pre.tar.gz",
            .hash = "1220a3eab193523b30721dae56a763468b7348b3d1f0b3364d68f6d548c753a72c5a",
        }
    }
}
  • build.zig (pythonでいうところのsetup.py) に以下を追記。
build.zig
// 前略
const zap = b.dependency("zap", .{
    .target = target,
    .optimize = optimize,
}); // ここでbuild.zig.zonの情報を読み取ってくれる
exe.addModule("zap", zap.module("zap"));
exe.linkLibrary(zap.artifact("facil.io")); // 指定がある場合のみ
// 後略

これだけでライブラリが使えるようになるので、今までの手動でのgit cloneからするとだいぶパッケージマネージャーっぽくなった。たぶん、linkLibraryなんかも今後自動解決するようになるはずで、この辺の自動解決や自動生成を zig pkg コマンドでできるようにするらしい。v0.11.0〜v0.13.0で随時リリース予定とのこと。

https://github.com/ziglang/zig/projects/4

ちなみに上記のbuild.zig.zonを早速使ってみようとすると、v0.11.0-devで行われた破壊的変更のために、大半のライブラリのbuild.zigが正しく読み取れないので、まだちょっと時期尚早。今後に期待。

https://devlog.hexops.com/2023/zig-0-11-breaking-build-changes/

なお現時点でも使えるサードパーティのZig用パッケージマネージャーは既にいくつかあるのだけれど、gyroが個人的には便利そう。gyro.zzzというYAMLっぽい記法も、build.zig.zonと構造はかなり似ているので、正式リリース後の移行も楽そう。
https://github.com/mattnite/gyro

脚注
  1. .zonというのはZig Object Notationのことで、ZigのAnonymous Struct (Anonymous List) 記法を使ったjsonのようなもの。 ↩︎

Discussion