ログ日記

作業ログと日記とメモ

GHCJS + Template Haskell でハングアップ

hangs when linking Template Haskell 8.0/8.2 · Issue #668 · ghcjs/ghcjs · GitHub
このissueは見てたはずなんだけど、流し読みしていて頭に入ってなかった。

実際にTemplate Haskellを使ってみると問題が起きた。

なので再インストールする。
その前に、
https://n314.hatenablog.com/entry/2019/06/06/211205
ここで書いたhappyのエラー解消のために ghcjsのresolverがと同じバージョンで(プロジェクトのディレクトリで) stack install happyする。

その後に GHCJSを入れ直す。
(入れ直す必要あるかは不明。単にnodejsのバージョンを変えたあとにstack buildしたらコマンドが無い系のエラーで進まなくなり、どこでnodeのpath情報が使われているか分からなかったので。)

nodejs は nodebrew
https://github.com/hokaccha/nodebrew
で v8.9 を指定した。元々使っていたバージョンは10.15

stack setup --stack-yaml=js.yaml --ghcjs-boot-clean --reinstall

このコマンドでcleanしてghcjs-bootをやり直すことは出来るんだけど、どうやら解決しないっぽい。


tackで入れたghcjsのsetup-exe(例:~/.stack/setup-exe-cache/x86_64-linux/setup-Simple-Cabal-1.22.4.0-ghcjs-0.2.0.20151230.3_ghc-7.10.2)はビルド時に存在していたnodeコマンドのパスがshebangとしてハードコーディングされていて、~/.ghcjs/x86_64-linux-0.2.0.20151230.3-7.10.2/ghcjs/nodeファイルにもnodeコマンドのパスが書かれています。


ですので、ghcjsとツール群が認識しているnode.jsのパスも一緒に変更しないと、nodeコマンドが見つからないというエラーを吐くようになったり、いつまでも差し替え前のnodeコマンドを参照したりします。


必要最低限の修正に留めるのは調査するのが面倒だったので、今回は下記の3つを削除してからghcjsの再インストールを行う事で新しいnode.jsのパスを認識してもらう事にしました。

  • ~/.ghcjs
  • ~/.stack/setup-exe-cache/x86_64-linux/setup-Simple-Cabal-1.22.4.0-ghcjs-0.2.0.20151230.3_ghc-7.10.2
  • ~/.stack/setup-exe-cache/x86_64-linux/setup-Simple-Cabal-1.22.4.0-ghcjs-0.2.0.20151230.3_ghc-7.10.2.jsexe


これでnode.jsのバージョン管理システムを乗り換えたりしてnodeコマンドのパスが変わっても新しい方のパスを認識させることが出来ます。

ghcjsがnode.jsのバージョンによってはうまく動かない事への対処 - siphilia.github.io

なので全部消してからやり直し。
なんかしょっちゅう消したりインストールしたりしているな…。



Template Haskell を使って書いたコードは
https://github.com/nishimura/ghcjs-form-sample1/blob/31b79371e999f1ab5a270031e60be684a51adf1b/app/Generate1.hs
この辺。