Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What are the problem?
@mod_poppo

Apple Silicon MacにGHC/cabalを入れるメモ

注意:この記事はとっ散らかったメモ書きなので、書かれているコマンドを試す前に最後まで読んで欲しい。

特に、Homebrewユーザーの場合は brew install cabal-install すればArmネイティブなGHC 8.10.6とcabal-installが入るのでそれで十分かもしれない。


Apple Silicon MacでHaskell環境を整えたいが、ghcupやstackは2021年8月現在、まだネイティブARM64に対応していない。

GHC 8.10.6のarm64-apple-darwin向けバイナリーは公式で配布されているので、それを落としてきて使う。

LLVMの llcopt コマンドが必要なので、適宜MacPortsやHomebrewで入れること。筆者はMacPortsで入れたllvm-11のものを用いた(コマンド名は llc-mp-11opt-mp-11)。GHC 8.10.6ではLLVMのバージョンは9以上12以下に対応しているようだ。

まずはGHCを入れる。

$ curl -LO https://downloads.haskell.org/~ghc/8.10.6/ghc-8.10.6-aarch64-apple-darwin.tar.xz
$ curl https://downloads.haskell.org/~ghc/8.10.6/SHA256SUMS | grep ghc-8.10.6-aarch64-apple-darwin.tar.xz
9e43fc3a39d2f2762262c63868653984e381e29eff6386f7325aad501b9190ad  ./ghc-8.10.6-aarch64-apple-darwin.tar.xz
$ shasum -a 256 ghc-8.10.6-aarch64-apple-darwin.tar.xz
9e43fc3a39d2f2762262c63868653984e381e29eff6386f7325aad501b9190ad  ghc-8.10.6-aarch64-apple-darwin.tar.xz
$ tar xf ghc-8.10.6-aarch64-apple-darwin.tar.xz
$ cd ghc-8.10.6/

GHCの ./configure && make install でインストールする。--prefix には好きなインストール先を指定する。ここでは /opt/ghc-8.10.6/ を選択したが、権限の要らない $HOME 以下に入れるのも良いだろう。最初に書いたLLVMのツールの名前もここで指定する。

$ ./configure --prefix=/opt/ghc-8.10.6 LLC=llc-mp-11 OPT=opt-mp-11
$ sudo make install

早速GHCiを実行してみよう。

$ /opt/ghc-8.10.6/bin/ghci
GHCi, version 8.10.6: https://www.haskell.org/ghc/  :? for help
Prelude> System.Info.os
"darwin"
Prelude> System.Info.arch
"aarch64"
Prelude>

本格的にHaskell開発をするにはパッケージを管理するためにcabal-install(cabalコマンド)も必要である。公式のバイナリー配布はまだなさそうなので、自前でビルドする(他の方法もある;後述)。ここではbootstrapにはx86_64版のcabalコマンドを使う(筆者はx86_64版のghcupで入れた)。

$ /path/to/x86/cabal install -w /opt/ghc-8.10.6/bin/ghc --ghc-options="-optc -arch -optc arm64 -opta -arch -opta arm64 -optl -arch -optl arm64" cabal-install

cabal コマンドでは -w オプションでコンパイラーを指定できるが、それだけだとアセンブラーがエラーを吐く。仕組みはよくわからないが、Cコンパイラー、アセンブラー、リンカーのそれぞれに -arch arm64 を指定するとコンパイルできた。

cabal-installをインストールするには、ソースからbootstrapする方法もあるようだ。この辺:Bootstrap darwin aarch64 bindist · Issue #7433 · haskell/cabal の議論を参照。

Homebrewにはcabal-installのバイナリー配布があるようなので、Homebrewユーザーはそれを使うのが一番手っ取り早いかもしれない:

$ brew install cabal-install

なお、Mac上のGHC 8.10.5には「networkパッケージをビルドしようとすると詰まる(終わらなくなる)」という問題がある(GHC 8.10.5 on Intel Mac cannot build the network package (#19968) · Issues · Glasgow Haskell Compiler / GHC · GitLab; タイトルに「Intel Mac」とあるがApple Siliconでも同様)。networkパッケージを使いたい方はGHC 8.10.6を待つか、自分でGHCをビルドしよう。 GHC 8.10.6ではこの問題は修正された。

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
0
Help us understand the problem. What are the problem?