paruをスタティックリンク形式でビルドする
rust製のArchLinux,ManjaroLinuxで使えるパッケージマネージャであるparuをmuslでビルドした際の記録です。
はじめに
ビルドにはpacman-static
パッケージ(libalpm.a)も必要です。
pacman-staticパッケージはltoが有効にされている場合、LTOFLAGSに-ffat-lto-objects
も指定されていないと、libalpm.aにsymbolsが埋め込まれません。aurやManjaroのpacman-staticパッケージは、そのままでは利用できない場合もあるかもしれません。
pacman-staticパッケージをltoをオフにしてビルドするか(PKGBUILDのoptionsに'!lto'指定を追加)、LTOFLAGSに-ffat-lto-objects
を追加して、ビルド&インストールしておきましょう。
クロスコンパイルの指定
targetをx86_64-unknown-linux-muslにしただけでは、openssl-sysのビルドでエラーとなりました。
クロスコンパイルを許可する必要があるようです。PKG_CONFIG_ALLOW_CROSS=1
を指定することで、muslでビルドできるようになりました。
export PKG_CONFIG_ALLOW_CROSS=1
featuresへstatic指定
またfeaturesにstaticの指定が必要のようです。
cargo build --frozen --features "static" --release --target-dir target --target $TARGET
明示的なlinker指定
rustc-wrapper = "sccache"
を利用している場合など、オプション指定によっては、moldまたはlldといったリンカの明示的な指定が必要になるかもしれません。
export RUSTFLAGS="$RUSTFLAGS -Clink-arg=-fuse-ld=mold"
or
export RUSTFLAGS="$RUSTFLAGS -Clink-arg=-fuse-ld=lld"
AUR (ja) - paru-static
AUR (en) - paru
GitHub - Morganamilo/paru: Feature packed AUR helper
Pacman Home Page
余談
- パッケージマネージャーがstatic linkであることの利点
依存しているライブラリ(opensslなど)の更新に影響されないのが利点です。
ライブラリの互換性がなくなって、パッケージマネージャーが動作しなくなると、システムの更新ができなくなります。pacmanパッケージとは別にpacman-staticというパッケージが用意されているのも、そういった状態に陥った場合のためとも言えると思います。
セキュリティ問題で関連するライブラリが更新されたときに、パッケージマネージャーが依存するライブラリが明示的にわかっていたほうがいいのは確かですが、それでもパッケージマネージャーについてはstatic link形式のバイナリで配布することを標準にするべきではないかと思っています。
Discussion