2024年3月19日火曜日

zig cc と musl を使って Vim を静的リンクする

開発環境の起動

今回は debian:bookworm-slim を使う。

docker run -it --rm debian:bookworm-slim

必要パッケージのインストール

apt update
apt install -y curl xz-utils make git file
  • curl: zig, ncurses のダウンロードのために使う
  • xz-utils: zig の展開のために使う
  • make: ncurses のビルドのために使う
  • git: Vim のソースコード取得のために使う
  • file: Vim の実行バイナリの形式確認に使う

作業用ディレクトリの作成

mkdir ~/work
cd ~/work

zig のインストール

zig 公式が配布しているバイナリを取得し、 /opt に配置する。

curl -L https://ziglang.org/download/0.11.0/zig-linux-x86_64-0.11.0.tar.xz -O
tar xf zig-linux-x86_64-0.11.0.tar.xz -C /opt
export PATH=$PATH:/opt/zig-linux-x86_64-0.11.0

ncurses のビルド

静的ビルドのためには静的ライブラリとしてビルドした ncurses が必要なので、ソースからビルドする。

# ダウンロード・展開
curl -LO https://invisible-island.net/datafiles/release/ncurses.tar.gz
tar xfv ncurses.tar.gz
cd ncurses-6.3/

# ビルド
./configure \
    CC="zig cc -target x86_64-linux-musl" \
    AR="zig ar" \
    --enable-widec
make -j16

これで、 ncurses-6.3/liblibncursesw.a が作成される。

vim のビルド

ダウンロード

cd ~/work
git clone --depth 1 https://github.com/vim/vim
cd vim

ビルド

./configure \
    CC="zig cc -target x86_64-linux-musl" \
    LDFLAGS="-L$(cd ~; pwd)/work/ncurses-6.3/lib -static -s -w" \
    --with-features=huge \
    --enable-terminal \
    --enable-gpm=no \
    --enable-fail-if-missing \
    --prefix /vim \
    --with-tlib=ncursesw

make -j16
make install

これで、 /vim/vim に Vim の実行ファイルが配置される。

静的リンクの確認

root@88773c67d701:~/work/vim# file /vim/bin/vim
/vim/bin/vim: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, stripped
root@88773c67d701:~/work/vim# ldd /vim/bin/vim
        not a dynamic executable

OK.

パッケージング

vim 実行時に検索される VIM ディレクトリは、--prefix で指定したパスを基に検索されるため、このままだとポータブルにならない。 (今回の場合だと /vim/share/vim となる)

そのため、 VIM 環境変数を上書きするシェルスクリプトを用意し、それ経由で実行してもらう事とする。

cat << "EOF" > /vim/vim
#!/bin/sh
CURRENT_DIR="$(dirname "$(realpath "$0")")"
export VIM="${CURRENT_DIR}/share/vim/"
exec "${CURRENT_DIR}/bin/vim" "$@"
EOF
chmod a+x /vim/vim
tar zcfv ./vim.tar.gz /vim

docker cp でホストに持ってきて、適当な場所に配置し、 vim/vim を実行すれば Vim が起動する。 ※vim/bin/vim ではなく

0 件のコメント:

コメントを投稿