GHCJS

To use GHCJS with stack, place a GHCJS version in the compiler field of stack.yaml. After this, all stack commands should work with GHCJS! In particular:

  • stack setup will install GHCJS from source and boot it, which takes a long time.

  • stack build will compile your code to JavaScript. In particular, the generated code for an executable ends up in $(stack path --local-install-root)/bin/EXECUTABLE.jsexe/all.js (bash syntax, where EXECUTABLE is the name of your executable).

You can also build existing stack projects which target GHC, and instead build them with GHCJS. For example: stack build --compiler ghcjs-0.2.0.9006020_ghc-7.10.3

Sidenote: If you receive a message like The program 'ghcjs' version >=0.1 is required but the version of .../ghcjs could not be determined., then you may need to install a different version of node. See issue #1496.

Example Configurations

Recent versions of GHCJS, repacked for stack

These versions of GHCJS were created by Marcin Tolysz, and were particularly crafted to include package versions which match those expected by particular stackage snapshots.

For ghcjs based on ghc-7.10.3 one could try:

resolver: lts-6.25
compiler: ghcjs-0.2.0.9006025_ghc-7.10.3
compiler-check: match-exact

setup-info:
  ghcjs:
    source:
      ghcjs-0.2.0.9006025_ghc-7.10.3:
         url: http://ghcjs.tolysz.org/lts-6.25-9006025.tar.gz
         sha1: 3c87228579b55c05e227a7876682c2a7d4c9c007

Or for the latest one based on ghc-8.0.1 (with more features):

resolver: lts-7.15
compiler: ghcjs-0.2.1.9007015_ghc-8.0.1
compiler-check: match-exact

setup-info:
  ghcjs:
    source:
      ghcjs-0.2.1.9007015_ghc-8.0.1:
           url: http://ghcjs.tolysz.org/ghc-8.0-2017-01-11-lts-7.15-9007015.tar.gz
           sha1: 30d34e9d704bdb799066387dfa1ba98b8884d932

The later can be generated via: https://github.com/tolysz/prepare-ghcjs the fromer is a bit more manual. Those bundles are only tested against the latest node-7.4.0.

In order to corrrectly boot and use ghcjs, one might need to install alex happy hscolour hsc2hs with the normal ghc.

Older resolvers:

resolver ghcjs url sha1
lts-7.14 0.2.1 http://ghcjs.tolysz.org/ghc-8.0-2016-12-25-lts-7.14-9007014.tar.gz 530c4ee5e19e2874e128431c7ad421e336df0303
lts-7.13 0.2.1 http://ghcjs.tolysz.org/ghc-8.0-2016-12-18-lts-7.13-9007013.tar.gz 0d2ebe0931b29adca7cb9d9b9f77d60095bfb864
lts-7.8 http://ghcjs.tolysz.org/ghc-8.0-2016-11-07-lts-7.8-9007008.tar.gz 190300a3725cde44b2a08be9ef829f2077bf8825
lts-7.7 http://ghcjs.tolysz.org/ghc-8.0-2016-11-03-lts-7.7-9007007.tar.gz ce169f85f1c49ad613ae77fc494d5565452ff59a
lts-7.5 http://ghcjs.tolysz.org/ghc-8.0-2016-10-24-lts-7.5-9007005.tar.gz 450e81028d7f1eb82a16bc4b0809f30730c3e173
lts-7.4 http://ghcjs.tolysz.org/ghc-8.0-2016-10-22-lts-7.4-9007004.tar.gz ed77b3c15fedbadad5ab0e0afe1bd42c0a8695b4
lts-7.3 http://ghcjs.tolysz.org/ghc-8.0-2016-10-11-lts-7.3-9007003.tar.gz 3196fd5eaed670416083cf3678396d02c50096de
lts-7.2 http://ghcjs.tolysz.org/ghc-8.0-2016-10-01-lts-7.2-9007002.tar.gz a41ae415328e2b257d40724d13d1386390c26322
lts-7.1 http://ghcjs.tolysz.org/ghc-8.0-2016-09-26-lts-7.1-9007001-mem.tar.gz e640724883238593e2d2f7f03991cb413ec0347b
lts-6.21 http://ghcjs.tolysz.org/lts-6.21-9006021.tar.gz 80b83f85dcec182093418e843979f4cee092fa85
lts-6.20 http://ghcjs.tolysz.org/lts-6.20-9006020.tar.gz a6cea90cd8121eee3afb201183c6e9bd6bacd94a
lts-6.19 http://ghcjs.tolysz.org/lts-6.19-9006019.tar.gz ef4264d5a93b269ee4ec8f9d5139da030331d65a
lts-6.18 http://ghcjs.tolysz.org/lts-6.18-9006018.tar.gz 3e9f345116c851349a5a551ffd94f7e0b74bfabb

If you do not use the same resolver, say, an older LTS snapshot, you will get some warnings like this:

Ignoring that the GHCJS boot package "aeson" has a different version, 0.9.0.1, than the resolver's wanted version, 0.8.0.2
Ignoring that the GHCJS boot package "attoparsec" has a different version, 0.13.0.1, than the resolver's wanted version, 0.12.1.6
Ignoring that the GHCJS boot package "scientific" has a different version, 0.3.3.8, than the resolver's wanted version, 0.3.4.2
...

These warnings can usually be safely ignored, but they do indicate a divergence between your snapshot's packages, and those that are being used to compile your project. You will normally get these warnings when using a GHCJS tarball that has not been packaged with a particular snapshot in mind.

GHCJS (old base)

If you want to build some older GHCJS packages, you may need to use the "old base" GHCJS. To do this, use the following compiler info:

compiler: ghcjs-0.1.0.20150924_ghc-7.10.2
compiler-check: match-exact

Custom installed GHCJS (development branch)

In order to use a GHCJS installed on your path, just add the following to your stack.yaml:

compiler: ghcjs-0.2.0_ghc-7.10.2

(Or, ghcjs-0.1.0_ghc-7.10.2 if you are working with an older version)

Project with both client and server

For projects with both a server and client, the recommended project organization is to put one or both of your stack.yaml files in sub-directories. This way, you can use the current working directory to specify whether you're working on the client or server. This will also allow more straightforward editor tooling, once projects like ghc-mod and haskell-ide-engine support GHCJS.

For example, here's what a script for building both client and server looks like:

#!/bin/bash

# Build the client
stack build --stack-yaml=client/stack.yaml

# Copy over the javascript
rm -f server/static/all.js
cp $(stack path --stack-yaml=client/stack.yaml --local-install-root)/bin/client.jsexe/all.js server/static/all.js

# Build the server
stack build --stack-yaml=server/stack.yaml

You can also put both the yaml files in the same directory, and have e.g. ghcjs-stack.yaml, but this won't work well with editor integrations.

Using stack without a snapshot

If you don't want to use a snapshot, instead place the ghcjs version in the resolver field of your stack.yaml. This is also necessary when using stack < 0.1.8.

Setting up GHCJS on Windows

If stack setup command fails to successfully complete with message: commitBuffer: invalid argument (invalid character), it means you have a locale problem. This problem is not exclusive to GHCJS, and might happen also during other builds. A workaround is to set Language for non-Unicode programs to English (US). For details see stack issue #1448.