ログ日記

作業ログと日記とメモ

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
こっちの方は古くて動かないようだ。
古い記事を参考にしてしまうと結構ハマる。