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

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

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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした