🙌

paruをスタティックリンク形式でビルドする

2023/12/26に公開

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

余談

  1. パッケージマネージャーがstatic linkであることの利点
    依存しているライブラリ(opensslなど)の更新に影響されないのが利点です。
    ライブラリの互換性がなくなって、パッケージマネージャーが動作しなくなると、システムの更新ができなくなります。pacmanパッケージとは別にpacman-staticというパッケージが用意されているのも、そういった状態に陥った場合のためとも言えると思います。
    セキュリティ問題で関連するライブラリが更新されたときに、パッケージマネージャーが依存するライブラリが明示的にわかっていたほうがいいのは確かですが、それでもパッケージマネージャーについてはstatic link形式のバイナリで配布することを標準にするべきではないかと思っています。

Discussion