⚙️

Build from source for Ubuntu Desktop 22.04 LTS

2023/01/28に公開

ちょっとずつ Zig について試しているが、言語仕様が確定して v1.0.0 がリリースされるのは、もうちょっと先の様子で、当然、破壊的変更がmasterブランチでは、それなりに発生する。

ビルド済みのZigをダウンロードしてきて設置しても良いのだけども、masterブランチとピッタリ連動しているだけではないようなので、最新のソースコードを取得してきてビルドしながらZigについて、試していこうと思います。

メイン環境の Ubuntu Desktop 22.04 LTS 上でサクッと常に最新のZigが生成できるように、手順をまとめてみました。(まとめに記載していますが、最新だけならLinuxbrewでええんよ?)

1. パッケージを最新に更新

sudo apt update && sudo apt -y full-upgrade

一応、システム全体のパッケージをアップグレードしておきます。
不要な方はスキップして構いません。

2. 必須パッケージインストール

sudo apt update
sudo apt install -y \
  libtinfo-dev \
  libzstd-dev \
  build-essential \
  cmake \
  git \
  curl \
  ninja-build

3. スワップ拡張

sudo mkdir -p /var/cache/swap/
sudo dd if=/dev/zero of=/var/cache/swap/swap0 bs=64M count=64
sudo chmod 0600 /var/cache/swap/swap0
sudo mkswap /var/cache/swap/swap0
sudo swapon /var/cache/swap/swap0
sudo swapon -s

4. LLVM インストール

$ cd /tmp
$ git clone --depth 1 --branch release/15.x https://github.com/llvm/llvm-project llvm-project-15
$ cd llvm-project-15
$ git checkout release/15.x
$ mkdir build-release
$ cd build-release
$ cmake ../llvm \
  -DCMAKE_INSTALL_PREFIX=$HOME/local/llvm15-release \
  -DCMAKE_BUILD_TYPE=Release \
  -DLLVM_ENABLE_PROJECTS="lld;clang" \
  -DLLVM_ENABLE_LIBXML2=OFF \
  -DLLVM_ENABLE_TERMINFO=OFF \
  -DLLVM_ENABLE_LIBEDIT=OFF \
  -DLLVM_ENABLE_ASSERTIONS=ON \
  -DLLVM_PARALLEL_LINK_JOBS=1 \
  -G Ninja
$ ninja install
$ cd
$ rm -rf /tmp/llvm-project-15

5. build-zig-head.sh 作成

$ cat <<EOS > ~/build-zig-head.sh
# Set PATH to llvm
export PATH="$HOME/local/llvm15-release/bin:$PATH"

# Set script directory path
SCRIPT_DIR=\$(cd \$(dirname \$0); pwd)

# Set source directory path
SOURCE_ROOT="\${SCRIPT_DIR}/source"
SOURCE_DIR="\${SOURCE_ROOT}/zig"

# Clone Zig source code from github.com
if [ ! -d \${SOURCE_DIR} ]; then
  mkdir -p "\${SOURCE_ROOT}"
  cd "\${SOURCE_ROOT}"
  git clone https://github.com/ziglang/zig.git
fi

# Set build directory path
BUILD_DIR="\${SOURCE_DIR}/build"

# Move to source directory
cd "\${SOURCE_DIR}" || exit

# Pull from github.com
git fetch origin master
git reset --hard origin/master

# Cleanup build directory
if [ ! -d \${BUILD_DIR} ]; then
  mkdir \${BUILD_DIR}
else
  rm -rf \${BUILD_DIR}
  mkdir \${BUILD_DIR}
fi

# Move to build directory
cd "\${BUILD_DIR}"

# Build from source
cmake ..

# Install Zig
make install

# Copt built zig to "/usr/local/bin"
if [ ! -f "/usr/local/bin/zig" ]; then
  sudo cp "\${BUILD_DIR}/stage3/bin/zig" /usr/local/bin
fi

# EOF
EOS

chmod +x ~/build-zig-head.sh

6. Zig ビルド

$ bash ~/build-zig-head.sh
$ which zig
/usr/local/bin/zig

7. バージョン確認

$ zig version
0.11.0-dev.1480+f68d3c63d

次回以降は、~/build-zig-head.sh を実行すれば、最新版のソースコードを取得し、ビルド後に/usr/local/bin/zig として更新されます。

まとめ

コマンド叩いてほっとけば、Zigが最新になるようにスクリプトを組んでみました。
(あと、Zenn使って見たかったのもあります)

結果、Linuxbrew 入れていれば brew install zig --HEAD でソースからビルドしてくれてインストールできるんですが、コミット辿ってビルドし直したりできるように、ローカルでのビルド環境
構築のついでに、上記の手順をまとめておきました。

Linuxbrew でインストールされたパスと切り替えるの面倒だし、LunuxbrewでZigの開発版バージョン指定方法がわからなかったというだけなんですが・・・(指定方法わかる方いたら教えてほしいです、絶対それでいいじゃんっ!てなるんで、バージョン切り替えもできるしLinuxbrew)

C/C++ からの進化という形で見ていますが、そのうちC言語で低レベル操作するのからはいるのではなく、Zigから若い子たちが入る時代も来るんですかねぇ。

ビルドしたときのバイナリサイズの小ささといい、Bunの登場でも話題になったみたいですが、ずっと実際に触れられてなかったので、まずは環境作りから。

ソースビルドしたい方のお役に立てば幸いです。

Discussion