GHCJSに再度トライ
stack new myghcjs cd myghcjs
myghcjs.cabal の 各build-depends に追加
if impl(ghcjs) build-depends: ghcjs-base if !impl(ghcjs) build-depends: ghcjs-base-stub
js.yaml
resolver: lts-8.11 compiler: ghcjs-0.2.1.9008011_ghc-8.0.2 compiler-check: match-exact setup-info: ghcjs: source: ghcjs-0.2.1.9008011_ghc-8.0.2: url: https://github.com/matchwood/ghcjs-stack-dist/raw/master/ghcjs-0.2.1.9008011.tar.gz sha1: a72a5181124baf64bcd0e68a8726e65914473b3b
lts-9.21は動かなかった。というかコンパイルのリンクが永遠に終わらなかった。
Linking template Haskell -- Stuck for 10+ hrs · Issue #14 · matchwood/ghcjs-stack-dist · GitHub
stack build --stack-yaml=js.yaml
jsが出力されているか確認する。
stack.yaml
resolver: lts-13.24 extra-deps: - ghcjs-base-stub-0.2.0.0 - containers-0.5.11.0
GHCJSのコンパイラを使わないビルドテスト(intero用)
stack build
GitHub - ghcjs/ghcjs-base: base library for GHCJS for JavaScript interaction and marshalling, used by higher level libraries like JSC
ここのサンプルを書いてみる。
{-# LANGUAGE CPP #-} {-# LANGUAGE JavaScriptFFI #-} {-# LANGUAGE OverloadedStrings #-} module Main where import Lib import Data.JSString as S #ifdef __GHCJS__ foreign import javascript unsafe "require('console').log($1)" console_log :: S.JSString -> IO () #else console_log :: S.JSString -> IO () console_log = error "GHCJS required to use console_log" #endif main :: IO () main = do console_log "yo"
コンパイルが通るプラグマを探すのでハマった。
JavaScriptFFI はGHCJSでしか効かないので、intero用に#ifdef も必要っぽい。
Add -fdefer-ffi-errors flag (#14227) · Issues · Glasgow Haskell Compiler / GHC · GitLab
ここに書いているように#ifdefで分ける。
.yaml や .cabal は変更なし。
JSとやり取りする例は新しくなっていて
A few examples of Foreign Function Interface · ghcjs/ghcjs Wiki · GitHub
こっちの方は古くて動かないようだ。
古い記事を参考にしてしまうと結構ハマる。