🦔

プログラミング言語Zigでパッケージマネージャgyroを使う

2023/03/05に公開

最近、Zigをちょこちょこ触っています。ライブラリの使い方を調べていたところ、パッケージマネージャもあるようで、2023年3月5日現在では zigmodgyro が使えるようです。

mattnさん曰く、

だそうなので、gyro を使ってみることにしました。

ちょっとつまずくところがあったのでZenn記事にまとめます。

この記事を書いたときの手元のZigバージョンは 0.10.1、gyroはバージョン番号はわかりませんでしたがGitリポジトリ上ではmasterのコミット19cf64dまでのものを利用しました。

利用までの流れ

  1. gyro コマンドのインストール
  2. Zigのプロジェクトに gyro で依存パッケージを追加する
    3. Zigのプロジェクトを作成
    4. 依存パッケージの追加
    5. build.zig ファイルの編集
  3. ビルド・実行

build.zig ファイルの編集」が少し気づきづらかったです。

gyro コマンドのインストール

リポジトリのREADME.mdに記載のビルド手順 に従ってビルドします。

git clone https://github.com/mattnite/gyro.git
cd gyro
zig build -Drelease-safe

zig-out/bin/gyro というファイルができますので、適当にパスの通ったディレクトリにファイルをコピーします。

Zigのプロジェクトに gyro で依存パッケージを追加する

パッケージを使う例として、コマンドライン引数をパースするライブラリ clapサンプルコードを動かせるようにします。

Zigのプロジェクトを作成

まず、自分用の開発プロジェクトを作りましょう。hoge という名前のプロジェクトディレクトリとします。

mkdir hoge
cd hoge
zig init-exe

こんな感じでファイルができます。(tree コマンドの出力)

.
├── build.zig
└── src
    └── main.zig

2 directories, 2 files

依存パッケージの追加

gyro で依存パッケージを追加する場合は、<公開者のユーザー名>/<パッケージ名> の形で指定するようです。

gyro add Hejsil/clap

すると、依存パッケージを記述する gyro.zzz というファイルができます。

次に、以下のコマンドでパッケージを取得し deps.zig ファイルを生成します。( gyro build でも、fetch を行ってくれそうです )

gyro fetch

build.zig ファイルの編集

少しつまずいたのがこのステップです。

build.zig ファイルを編集して gyro で取得したパッケージを使えるようにします。
gyroのIntroductionにも書いてありますが、追加してある箇所が分かりづらいので、zig init-exe で生成される build.zig に対する修正箇所を以下に記載します。( // ★この行を追加 とある行を追加します)

const std = @import("std");
const pkgs = @import("deps.zig").pkgs; // ★この行を追加

pub fn build(b: *std.build.Builder) void {
    // (コメント省略)
    const target = b.standardTargetOptions(.{});

    // (コメント省略)
    const mode = b.standardReleaseOptions();

    const exe = b.addExecutable("hoge", "src/main.zig");
    pkgs.addAllTo(exe); // ★この行を追加
    exe.setTarget(target);
    exe.setBuildMode(mode);
    exe.install();

    const run_cmd = exe.run();
    run_cmd.step.dependOn(b.getInstallStep());
    if (b.args) |args| {
        run_cmd.addArgs(args);
    }

    const run_step = b.step("run", "Run the app");
    run_step.dependOn(&run_cmd.step);

    const exe_tests = b.addTest("src/main.zig");
    exe_tests.setTarget(target);
    exe_tests.setBuildMode(mode);

    const test_step = b.step("test", "Run unit tests");
    test_step.dependOn(&exe_tests.step);
}

ビルド・実行

src/main.zig の内容を、 clap.parseサンプル のコードに書き換えます。

その上で、Zig単体では zig build としていたコマンドを gyro build のように gyro を使って実行するようにします。

gyro build run -- aaa -n 100 -s bbb

以下のように出力されればパッケージを使えています。

--number = 100
--string = bbb
aaa

おわりに

gyro を使ってみました。Zigにはまだ十分に慣れてはいませんが、書くのは楽しいので上手に使えるようになりたいなと思います。

Discussion