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を手動で編集すればいけるかもしれないが……。