Open1
32ビットArm向けのGHCをビルドする
32ビットArm(armv7)向けのオフィシャルなGHCバイナリは毎回出ているとは限らない。8.10.7/9.0.1/9.2.2/9.4.3は出てるっぽいが。
ここでは32ビットArm向けのGHCを自分でビルドする方法をメモっておく。
作業環境はUbuntu 22.04を想定する。
ターゲット環境はarm-linux-gnueabihfとする。
GHCをビルドするためのGHCはghcupで入れる。alexとhappyはcabalで入れる。
多倍長整数の実装はGMPではなくHaskell onlyのやつを使う(--bignum=native
)。
apt-get update && apt-get install build-essential curl libgmp-dev libnuma1 llvm-12 gcc-arm-linux-gnueabihf
# ghcupでGHCを入れる。自動化のために環境変数で色々指定する。
export BOOTSTRAP_HASKELL_NONINTERACTIVE=1
export BOOTSTRAP_HASKELL_GHC_VERSION=9.2.5
export BOOTSTRAP_HASKELL_INSTALL_NO_STACK=1
curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org | sh
source /root/.ghcup/env # Dockerfileでは使えないので ENV PATH=/root/.cabal/bin:/root/.ghcup/bin:$PATH とする
cabal install alex happy # -> alex-3.2.7.1とhappy-1.20.0がインストールされた
curl -LO https://downloads.haskell.org/~ghc/9.2.5/ghc-9.2.5-src.tar.xz
tar xf ghc-9.2.5-src.tar.xz
cd ghc-9.2.5
./configure --target=arm-linux-gnueabihf
# installは https://gitlab.haskell.org/ghc/ghc/-/issues/21970 を踏むので使えない
hadrian/build --bignum=native -j binary-dist-dir
cd _build/bindist/ghc-9.2.5-arm-linux-gnueabihf
./configure --target=arm-linux-gnueabihf --host=$(uname -m)-linux-gnu --prefix=/opt/ghc-cross CC=arm-linux-gnueabihf-gcc
make install Stage1Only=YES
make install
でインストールされたやつはwrapperに問題があってそのままでは動かない。wrapperを手動で編集すればいけるかもしれないが……。