🦖

Zig言語をソースコードからビルドする

2022/07/13に公開

話題のZig言語を触ってみました。
https://ziglang.org/

いきなりソースコードからビルドしてみる(そしてあきらめる)

https://ziglang.org/learn/getting-started/#building-from-source
最新のmasterブランチをビルドするには clang, llvm, lldのversion 14が必要です。
最新のリリースタグの0.9.1 だとversion 13が必要です。
ubuntu 20.04ではaptで入らないので、Dockerを使ってubuntu 22.04で環境を作って試しました。

zigはzig自身で記述されています。
なので、zigのまだ入っていない環境にソースコードからビルドするためには、まずC++で書かれたバージョンをビルドし(=stage1)、次にそれでできたzigコンパイラで自分自身をコンパイルし(=stage2)、さらにそれでできたzigコンパイラで自分自身とライブラリを再度ビルドします。(=stage3)

試行錯誤してstage1のビルドはできたのですが、stage2でリンクエラーになってしまいました。
(Jetson AGX Orinでやりました。)

で、あきらめました。

ビルド済みのものをダウンロードする

https://ziglang.org/learn/getting-started/

$ wget https://ziglang.org/download/0.9.1/zig-linux-aarch64-0.9.1.tar.xz
$ sudo tar xf zig-linux-aarch64-0.9.1.tar.xz -C /usr/local/
$ vi ~/.profile

PATHに追加。

PATH="$PATH:/usr/local/zig-linux-aarch64-0.9.1"

反映。

$ . ~/.profile

Hello world を試す

この手順をなぞっただけ。
https://ziglang.org/learn/getting-started/#run-hello-world

zig init-exeを実行すると、サンプルのsrc/main.zigとそれをビルドするためのbuild.zigが生成されます。ビルドするのにmakeなど他のツールを使うのでなく、自分自身の言語でビルドするためのソースコードを生成するのはRustに似ていますね。WindowsやMac, Linuxなど全部の環境で統一的にするにはこれが一番シンプルなのでしょう。cmakeを使うよりは私は好きです。

zig build run を実行するとビルドと実行をしてくれます。
でてきたメッセージは

info: All your codebase are belong to us.

わかる人はこれをみて爆笑すると思うのですが、元ネタはこれですね。
https://ja.wikipedia.org/wiki/All_your_base_are_belong_to_us

$ file zig-out/bin/hello-world 
zig-out/bin/hello-world: ELF 64-bit LSB executable, ARM aarch64, version 1 (SYSV), statically linked, with debug_info, not stripped

生成された実行ファイルはstatic linkされていました。標準ライブラリはmuslベースのものを自前で持っているそうです。このあたりはgolangっぽいですね。

再びZigをソースコードからビルドする

実行可能なzigコンパイラがインストールできたので、今度は直接ソースコードからビルドできます。

$ git clone https://github.com/ziglang/zig.git
$ cd zig/
$ git checkout -b w0.9.1 0.9.1
$ zig build

今度はあっさり成功しました。
生成物は zig-out ディレクトリ以下にできます。

ソースコードを git grep でながめながら

https://twitter.com/tetsu_koba/status/1547104935849955329?conversation=none
リンクは古いバージョンを指していたようです。masterのドキュメントはこちら
https://ziglang.org/documentation/master/std/#std;os
https://twitter.com/tetsu_koba/status/1547105428873420800?conversation=none
https://twitter.com/tetsu_koba/status/1547106710560550912?conversation=none

Discussion