2
1

More than 5 years have passed since last update.

GHCJS をビルドできなかった

Last updated at Posted at 2018-02-22

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 対応ブランチを試すという案も考えられるが、気力が湧いてくるのを待つ必要がある。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1