GHCJS は Stack を使って簡単にインストールできる、ということになっているが、パックされているバージョンは ghc-7.10.3 や ghc-8.0.1 と、かなり古い。
GitHub にある開発版の GHCJS は 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 対応ブランチを試すという案も考えられるが、気力が湧いてくるのを待つ必要がある。