Help us understand the problem. What is going on with this article?

Apple Silicon MacでGHC masterをビルドするメモ

この記事はメモ書きです。

公式のissue

まずはここを最後まで読んで最新の情報を入手するべし。

メモ:

必要な外部のツール類

python3, automake, autoconf, llvm-10

筆者はMacPortsで入れた。

$ port install python3 automake autoconf cmake

2020年12月15日現在、MacPortsの llvm-10 はそのままではインストールできず、Portfileの改変が必要だった。

$ git clone https://github.com/macports/macports-ports.git
$ cd macports-ports/lang/llvm-10
$ emacs Portfile  # supported_archsの行をコメントアウトする
$ sudo port build
$ sudo port install

これで opt-mp-10 コマンドと llc-mp-10 コマンドが使えるようになるはず。

llvm-10がインストールできなかったのは

この辺の問題だった。

現在のmasterブランチ(ghc-9.1)では llvm-10 を使うが、 ghc-9.0 ブランチをビルドする場合は llvm-9.0 で同様にインストールする。コマンド名は opt-mp-9.0llc-mp-9.0 となる。

Haskell環境のインストール

GHCをビルドするためのGHCはghcupで入れる。ghcupはRosetta 2で動作させる。

$ curl --proto '=https' --tlsv1.2 -sSf https://get-ghcup.haskell.org > install-ghcup.sh
$ arch -arch x86_64 sh install-ghcup.sh
$ source ~/.ghcup/env

筆者が試した時点では、GHC 8.8.4がインストールされた。

GHCをビルドするための alexhappy を入れる。

$ cabal install alex happy

ghc-9.0 をビルドする際には happy 1.19.x が必要なようなのでバージョンを指定する。

$ cabal install --constraint="happy==1.19.*" --overwrite-policy=always happy

クロスコンパイル用ラッパー

clang -arch arm64arm64-apple-darwin-clang という名前で使えるようにするためのwrapperを導入する。

$ git clone https://github.com/zw3rk/toolchain-wrapper.git
$ cd toolchain-wrapper
$ ./bootstrap
$ export PATH="`pwd`:$PATH"

GHCのビルド

まず、GHCを「x86_64で動作し、AArch64バイナリーを吐く」クロスコンパイラーとしてビルドする。

$ git clone --recursive https://gitlab.haskell.org/ghc/ghc.git
$ cd ghc
$ ./boot
$ sed 's/#\(BuildFlavour = quick-cross\)/\1/' mk/build.mk.sample > mk/build.mk
$ ./configure --target=arm64-apple-darwin LLC=llc-mp-10 OPT=opt-mp-10
$ time make -j8
$ sudo make install prefix=/opt/ghc-9.1.0.20201214

インストールされるGHCコマンドの名前は /opt/ghc-9.1.0.20201214/bin/arm64-apple-darwin-ghc という風になる。

このクロスコンパイラーは実行時に前述のwrapperに依存する。

とりあえず使える状態にする(コンパイルにRosetta 2が必要でもよい)ならばこれで良いのかもしれない(Template Haskellが動くのかは確認していない)。

ネイティブGHCのビルド

次に、「AArch64で動作し、AArch64バイナリーを吐く」GHCをビルドする。

以下の手順では作業ディレクトリーを分けてみたが、元のディレクトリーで一旦distcleanするのでも良いのかもしれない。その場合 ./boot までの手順はスキップして良い。

$ cd ..
$ git clone ghc ghc-native
$ cd ghc-native
$ git submodule update --init
$ ./boot
$ sed 's/#\(BuildFlavour = quick-llvm\)/\1/' mk/build.mk.sample > mk/build.mk
$ ./configure --target=arm64-apple-darwin --enable-bootstrap-with-devel-snapshot GHC=/opt/ghc-9.1.0.20201214/bin/arm64-apple-darwin-ghc LLC=llc-mp-10 OPT=opt-mp-10 CC=clang CLANG=clang fp_prog_ar=ar LD=ld NM=nm RANLIB=ranlib
$ emacs llvm-targets  # 後述
$ cp config.sub libraries/ghc-bignum/config.sub
$ cp config.sub libraries/base/config.sub
$ cp config.sub libraries/unix/config.sub
$ time make -j8 BIGNUM_BACKEND=native
$ sudo make install prefix=/opt/ghc-9.1.0.20201214-native

本来ならGMPを使えて良いはずだが、ビルドエラーが出て使えなかった。なので BIGNUM_BACKEND=native を指定している。

また、ビルド中、あるいは出来上がったGHCを使用する際に

'vortex' is not a recognized processor for this target (ignoring processor)

というメッセージが出る。これは使用する llc-mp-10 コマンドが -mcpu=vortex を認識しないことによるものである(Apple版のLLVMは vortexapple-a12 のエイリアスとして認識するようだが、公式のLLVMは認識しない)。これを避けるには llvm-targets ファイルをいじって vortexapple-a12 に置き換える。

(ghc-9.0の場合、llvm-9.0が vortexapple-a12 も認識しないのでどうしようもない。あと、 make install の段で ghc-cabal がセグフォした。)

これでできたGHCは前述のwrapperには依存しない。

mod_poppo
最近は浮動小数点数オタクをやっています。
https://blog.miz-ar.info/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away