GHCJS supports many modern Haskell features, including:
- All type system extensions supported by GHC
- Lightweight preemptive threading with blackholes, MVar, STM, asynchronous exceptions
- Weak references, CAF deallocation, StableName, StablePtr
- Unboxed arrays, emulated pointers
- Integer support through JSBN, 32 and 64 bit signed and unsigned arithmetic (
- Cost-centres, stack traces
- Cabal support, GHCJS has its own package database
- synchronous and asynchronous threads.
First install GHC 7.8.2 or later and check with
ghc --version that it's the
compiler in your
PATH. Next, make sure that you have all the prerequisites for your platform.
Linux / OS X
- a recent version of
happyneed to be in your
patchneed to be in your
- by default,
ghcjs-bootwill try to use the system GMP library, see
ghcjs-boot --helpfor more info.
- virus scanners often interfere with configure scripts (permission denied errors),
disable on-access scanning before running
- no extra programs need to be installed,
ghcjs-bootwill download an archive (around 100MB) with the required programs.
Run the following script to install an updated
cabal-install with GHCJS
support. Note that this will overwrite the
cabal executable in your cabal executable
installation path (typically
~/.cabal/bin), you might want to backup your current version.
#!/bin/sh git clone https://github.com/ghcjs/cabal.git cd cabal git checkout ghcjs cabal install ./Cabal ./cabal-install
Make sure that you're now running the new
GHCJS support must be listed under the
$ cabal install --help ... build files (default dist) -g --ghc compile with GHC --ghcjs compile with GHCJS --nhc98 compile with NHC ...
ghcjs and its
$ git clone https://github.com/ghcjs/ghcjs-prim.git $ git clone https://github.com/ghcjs/ghcjs.git $ cabal install ./ghcjs ./ghcjs-prim
cabal install ./ghcjs ./ghcjs-prim fails because cabal cannot resolve dependencies, try adding
--reorder-goals --max-backjumps=-1. Sometimes the
transformers package causes problms, since GHC ships with an older version. Try
--with-constraint=transformers==0.3.0.0 (or the version that came with your GHC) if the problem looks related to this package.
Build the base libraries for
if you used the Git repository to install: $ ghcjs-boot --dev if you are using a package from hackage that includes the libraries: $ ghcjs-boot
Some distros install node.js as
nodejs instead of
--with-node nodejs to the
ghcjs-boot command in that case.
$ ghcjs -o helloWorld helloWorld.hs $ node helloWorld.jsexe/all.js Hello world!
cabal install --ghcjs packageName to install a package
You can create a new sandbox or add GHCJS support to an existing sandbox with:
$ cabal sandbox init ghcjs
If you also want to set GHCJS as the default compiler in the sandbox, run:
$ cabal sandbox init ghcjs $ echo "compiler: ghcjs" >> cabal.config
ghcjs-pkg to manipulate the GHCJS package database
The package database and runtime files from the shims repository are kept in the
GHCJS application data directory, typically
~/.ghcjs/. Remove this directory to reset your GHCJS installation, you
will need to run
ghcjs-boot --init again.
See GHCJS introduction for more examples.
If you want to hack on GHCJS, please join our friendly community on IRC at
#ghcjs on freenode (You're also
welcome if you only use the compiler or just want to chat about it!). Read the HACKING.markdown document
to get started. The wiki may also contain useful information.
JSC and webkit
- webkit - Bindings for WebKitGTK+ that provide a low level DOM interface.
You can use these libraries without GHCJS to build a native version of your application (it will use WebKitGTK+ to run without a browser). If you want to find out more about making GHCJS compatible Haskell applications check out the GHCJS Examples