Zig 0.12.0 対応のためのソースコードの修正
Zig 0.12.0 がリリースされました
2024.04.20にZigの新しい安定版 0.12.0 がリリースされました。
私は前の安定版の 0.11.0 が出た後はずっとそれを使っていて開発版には追っていませんでした。
Zig言語はまだ正式リリースではないので、破壊的変更が入ります。0.11.0で作っていたものは 0.12.0ではソースコードの修正が必要になります。
私はいくつかZigで書いたGithubのリポジトリがあり、全てを0.12.0向けに修正しました。
自分の13個のリポジトリは全て何らかの修正が必要でした。以下にどんな修正が必要だったかを簡単に紹介します。
変更しない変数はvarでなくconstで定数にしなければならない
Zigでは使用していないローカル変数があるとコンパイルエラーになるなど、ソースコード上の無駄な情報の除去をきっちりするポリシーの言語でした。0.12.0ではそれがさらに強まって、var
で宣言した変数で変更していないものは、const
に修正しなくてはなりません。これは警告でなくてコンパイルエラーになります。
でもこれは、コンパイラに指摘されたら、その行のvar
をconst
に置き換えればいいだけなので、修正は機械的です。私は手で修正しましたが、自動でアップデートしてくれるツールが登場しそうです。
Release noteの記述
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の記述
std.os renamed to std.posix
フラグの定義の変更
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の記述
std.posix APIs Gain Type Safety
エンディアン指定付きの入出力関数の変更
いままでエンディアン指定付きの入出力関数は writeIntLittle
や writeIntBig
のように別々の関数がありましたが、これがwriteInt
に引数を追加して対応するように変わりました。
- self.writer.writeIntLittle(u32, self.frame_count) catch {
+ self.writer.writeInt(u32, self.frame_count, .little) catch {
修正方法がわからない場合
Zigの標準ライブラリのソースコードを取得して、その関数の使われ方をみると修正方法のヒントになります。
Discussion