Edited at

GHCJS をビルドできなかった

More than 1 year has passed since last update.

GHCJS は Stack を使って簡単にインストールできる、ということになっているが、パックされているバージョンは ghc-7.10.3 や ghc-8.0.1 と、かなり古い。

https://docs.haskellstack.org/en/stable/ghcjs/

GitHub にある開発版の GHCJS は ghc-8.2 に基づくブランチがあるようなので、自前でビルドしてみたい。

https://github.com/ghcjs/ghcjs/tree/ghc-8.2

筆者の環境:


  • macOS 10.12.6 Sierra

  • stack を常用しているが、古い Haskell Platform が残っている (GHC-8.0.2)


    • bootstrap 時に「古い Haskell Platform」が使われたようだ



  • cabal コマンドは Cabal 2 系である必要がある


    • 筆者の環境にあった「古い Haskell Platform」のものではダメだった。

    • stack install cabal-install で最新の cabal コマンドを ~/.local/bin に入れた。



  • GNU 系のコマンド(gsed, gnutar, gpatch など)


    • Mac 標準のこれらのコマンドは BSD 系なので、 GNU 系のものとは微妙に互換性がない。具体的にどれが BSD 系だとダメなのかはちゃんと調べていないが、少なくとも tar に関しては GNU 系である必要がある。

    • configure を使うやつは GNU 系のコマンド名が gsed や gnutar という名前で置いてあっても拾ってくれたりするが、スクリプトの一部に tar を直接叩いているものがあるようで、プレフィックスのないコマンド名が GNU 系のコマンドである必要がある。MacPorts なら /opt/local/libexec/gnubin に PATH を通せば良さそうである。

    • Linux ユーザーならここで苦労はしないだろう。



このほか、 Linux (Debian) でも試した。stack の利用、 cabal コマンドの要件に関しては同様である。

README には

$ git clone https://github.com/ghcjs/ghcjs.git

$ cd ghcjs
$ git submodule update --init
$ ./utils/makePackages.sh

とあるが、これではうまく動かなかった。utils/ 以下に boot という謎のコマンドが置いてあるので、

$ git clone https://github.com/ghcjs/ghcjs.git

$ cd ghcjs
$ git checkout ghc-8.2
$ git submodule update --init --recursive
$ PATH=/opt/local/libexec/gnubin:$PATH ./utils/boot

を実行した(PATH の指定は MacPorts の GNU 系コマンドを使うため。Linux では必要ない)。何もわからない。俺たちは雰囲気で GHCJS をビルドしている。

どうも並列ビルドされないようで、やたら時間がかかる。

なお、失敗してやり直す場合は、 git clean -xdf しておかないと patch の二重適用でハマる。

なんとか ./utils/boot が完了したら、

$ stack build --ghc-options=-j

を実行する。

しかし最終的に

***/ghcjs/ghcjs/.stack-work/dist/x86_64-osx/Cabal-2.0.1.0/setup/setup: streamingProcess: invalid argument (Bad file descriptor)

というエラーが出て(Mac の場合のメッセージだが、 Linux でも同様)、ダメだった。

エラーメッセージ中の streamingProcess という関数を調べてみると、 streaming-commons パッケージの関数らしい。Cabal のどこで streaming-commons を使っているかは直ちには明らかではないが、おそらく HTTP パッケージを介してだろう。…が、それ以上はわからない。

(追記)streamingProcessがどうのこうのという問題はすでに解消されたようだ:https://github.com/ghcjs/ghcjs/issues/636

stack build が正常に終了したら、

$ stack exec ghcjs-boot

を実行する(README には $ ghcjs-boot と書かれているが、 stack を使うなら $ stack exec だろう)。(追記終わり)

stack 以外のビルド方法として、 cabal new-build や cabal sandbox を使ったものがあるようだが、 stack で GHC 等を入れているのに今更 Haskell Platform を入れたくない(Mac は SSD 残量が厳しい、Linux では apt で入る haskell-platform が古い、という事情もある)。

というわけで、今回 GHCJS を自前でビルドするのは諦めた。GHC 8.2 系の Haskell Platform が入った環境で試す、あるいは GHCJS の ghc-8.0.2 対応ブランチを試すという案も考えられるが、気力が湧いてくるのを待つ必要がある。