Get GHC 7.10.2 (MinGHC on Windows) and make sure that happy
is installed. On linux you may need to install a package like libtinfo-dev
to make the Haskell terminfo
package work.
Now run the following to install the current snapshot of the master
branch:
$ cabal install http://ghcjs.luite.com/master.tar.gz
$ ghcjs-boot
GHCJS is a Haskell to JavaScript compiler that uses the GHC API.
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 (
Word64
,Int32
etc.) - Cost-centres, stack traces
- Cabal support, GHCJS has its own package database
And some JavaScript-specific features:
- new JavaScriptFFI extension, with convenient import patterns, asynchronous FFI and a JSVal FFI type,
- synchronous and asynchronous threads.
GHCJS can be installed with GHC 7.10.2 or later.
- GHC 7.10.2 or higher
- Cabal 1.22.4 and cabal-install 1.22.3 or higher
- alex and happy
- node.js 0.10.28 or higher. GHCJS uses node.js for its build system and for running Template Haskell.
- A recent version of
alex
andhappy
need to be in yourPATH
git
,make
,cpp
,autoreconf
need to be in yourPATH
- One of the dependencies is the
terminfo
Haskell package, which requireslibtinfo
. On Debian/Ubuntu this is provided by thelibtinfo-dev
package.
- You need a shell that's capable of running autotools scripts (with
git
,make
,cpp
,autoreconf
installed). See the GHCJS Wiki or theINSTALL.windows
file for instructions for setting up MSYS2 for this. - A recent version of
alex
andhappy
need to be in yourPATH
- Virus scanners often interfere with configure scripts (permission denied errors),
disable on-access scanning before running
ghcjs-boot
.
Get ghcjs
from Github and install it:
$ git clone https://github.com/ghcjs/ghcjs.git
$ cabal install ./ghcjs
When installing from hackage, as shown above in the quickstart, the built base libraries are included in the source distribution package.
$ ghcjs-boot
Alternately, if you used the ghcjs repository to install.
- On the
master
branch.
$ git branch
* master
$ ghcjs-boot --dev
- On another branch, such as
ghc-8.0
, supply the branch names for repositories ghcjs-boot and shims.
$ git branch
* ghc-8.0
$ ghcjs-boot --dev --ghcjs-boot-dev-branch ghc-8.0 --shims-dev-branch ghc-8.0
Some distros install node.js as nodejs
instead of node
. Add --with-node nodejs
to the ghcjs-boot
command in that case.
ghcjs
can be invoked with the same command line arguments as ghc
. The generated programs can be run directly from
the shell with Node.js and SpiderMonkey jsshell.
for example:
$ ghcjs -o helloWorld helloWorld.hs
$ node helloWorld.jsexe/all.js
Hello world!
stack supports setting up the GHCJS compiler and building your code. See stack's ghcjs documentation for information on how to do this.
Use cabal install --ghcjs packageName
to install a package
Most packages from hackage should work out of the box. The main exception is packages with foreign (non-Haskell) dependencies. For these packages a JavaScript implementation of the dependencies must be provided. If a package you want to use does not work, please create a ticket.
You can use Cabal sandboxes with GHCJS, create a new sandbox with:
$ cabal sandbox init
Then you can just configure with --ghcjs
to build with GHCJS inside the sandbox:
$ cabal install --ghcjs
If you also want to set GHCJS as the default compiler in the sandbox, run:
$ cabal sandbox init
$ echo "compiler: ghcjs" >> cabal.config
Setting the default compiler to ghcjs
makes cabal sandbox exec
and cabal sandbox hc-pkg
use
GHCJS-specific settings. These commands do not know about the configure flags, so setting the default
compiler is the only way to make them use the correct settings for GHCJS.
Use 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.
Applications that use the following libraries should compile with GHCJS and run in a modern web browser and interface with DOM and JavaScript in the browser.
- webkit - Bindings for WebKitGTK+ that provide a low level DOM interface.
- webkit-javascriptcore - Low level bindings for JavaScriptCore
- jsc - Higher level interface for JavaScriptCore
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