🦖

Zig 0.12.0 対応のためのソースコードの修正

2024/04/23に公開

Zig 0.12.0 がリリースされました

2024.04.20にZigの新しい安定版 0.12.0 がリリースされました。
https://ziglang.org/download/0.12.0/release-notes.html

私は前の安定版の 0.11.0 が出た後はずっとそれを使っていて開発版には追っていませんでした。
Zig言語はまだ正式リリースではないので、破壊的変更が入ります。0.11.0で作っていたものは 0.12.0ではソースコードの修正が必要になります。

私はいくつかZigで書いたGithubのリポジトリがあり、全てを0.12.0向けに修正しました。
https://github.com/tetsu-koba?tab=repositories&q=&type=&language=zig

自分の13個のリポジトリは全て何らかの修正が必要でした。以下にどんな修正が必要だったかを簡単に紹介します。

変更しない変数はvarでなくconstで定数にしなければならない

Zigでは使用していないローカル変数があるとコンパイルエラーになるなど、ソースコード上の無駄な情報の除去をきっちりするポリシーの言語でした。0.12.0ではそれがさらに強まって、varで宣言した変数で変更していないものは、constに修正しなくてはなりません。これは警告でなくてコンパイルエラーになります。

でもこれは、コンパイラに指摘されたら、その行のvarconstに置き換えればいいだけなので、修正は機械的です。私は手で修正しましたが、自動でアップデートしてくれるツールが登場しそうです。

Release noteの記述
https://ziglang.org/download/0.12.0/release-notes.html#toc-Unnecessary-Use-of-var

std.os パッケージから std.posix パッケージへ

OSのシステムコールなどが定義されていたstd.osパッケージがstd.posixに変更になりました。
今までエラー終了のときにはstd.os.exitを使っていたので、これをstd.posix.exitに変更する必要があります。
エディタで os.posix.に置換するのですが、os.linuxなどOS個別の部分はそのまま残す必要があります。

Release noteの記述
https://ziglang.org/download/0.12.0/release-notes.html#stdos-renamed-to-stdposix

フラグの定義の変更

std.posixパッケージのリファクタリングとともに、いくつかのパラメータでビットで意味を持たせていたものに関して、ただの整数でなくてC言語で言うところのビットフィールドのような構造体に変更されているところがあります。例えばstd.posix.openの引数

     fn openDevice(self: *Self) !void {
-        self.fd = try os.open(self.devname, os.O.RDWR, 0o664);
+        self.fd = try posix.open(self.devname, .{ .ACCMODE = .RDWR }, 0o664);
     }

Release noteの記述
https://ziglang.org/download/0.12.0/release-notes.html#toc-stdposix-APIs-Gain-Type-Safety

エンディアン指定付きの入出力関数の変更

いままでエンディアン指定付きの入出力関数は writeIntLittlewriteIntBig のように別々の関数がありましたが、これがwriteInt に引数を追加して対応するように変わりました。

-        self.writer.writeIntLittle(u32, self.frame_count) catch {
+        self.writer.writeInt(u32, self.frame_count, .little) catch {

修正方法がわからない場合

Zigの標準ライブラリのソースコードを取得して、その関数の使われ方をみると修正方法のヒントになります。

https://github.com/ziglang/zig

Discussion