2 Initial installation
GHCJS can’t actually work with vanilla GHC 7.* as it requires to
apply some patches (in order to get JS ffi to work, it adds
ghcjs-build uses Vagrant (a tool for automatically building and
running work environments) to mange the work environment, so prior to
running GHCJS you need to install vagrant and VirtualBox. It’s actually
a sensible way to tackle a project like that: everyone has similar
work environments, you don’t have to mess with your local GHC
installation. It also make use of Puppet deployment system in
puppetlabs-vcsrepo module for cloning Git repositories.
Currently, there are two ways to start up GHCJS using
2.1 Using the prebuilt version
git clone https://github.com/ghcjs/ghcjs-build.git cd ghcjs-build git checkout prebuilt vagrant up
Using this configuration the following procedures are performed:
- Vagrant sets up a 32-bit Ubuntu Precise system (/Note: if this is
your first time running Vagrant it downloads the 280Mb
precise32.box file from the Vagrant site/)
- Vagrants does some provisioning using Puppet (downloads and
installs necessary packages)
- A 1.4GB archive with ghcjs and other prebuilt tools are downloaded
2.2 Compiling from source
git clone https://github.com/ghcjs/ghcjs-build.git cd ghcjs-build vagrant up
Apart from setting up the box this will
- Get the GHC sources from Git HEAD and applies the GHCJS patch.
- Get all the necessary packages for ghcjs
- Get the latest Cabal from Git HEAD, applies the GHCJS patch and
- Compile the necessary libraries using ghcjs
ghcjs-examplesand its dependencies (it appears that it
can take a lot of time to compile gtk2hs and gtk2hs’s tools)
Please note, that depending on your computer, you might want to go for
a long walk, enjoy a small book or get a night sleep (assuming you are
not scared by the sound of computer fans).
Apart from being slow, the process of compiling everything from
source is error prone. To give you a taste, last night I was not able
to reproduce a working environment myself, because of some recent
changes in GHC HEAD. The prebuilt version on the other hand is
guaranteed to install correctly.
Hopefully, the GHCJS patches will be merged upstream before the GHC
7.8 is out. That way you won’t need to partake in building GHC from
the source in order to use GHCJS.
2.3 Communicating with the VM
After you’ve finished with the initial setup you should be able just
in your new vm and start messing around.
ghcjs command is available to you and Vagrant kindly forwards the
3000 port on the VM to the local 3030 port, allowing you to run web
warp on the VM and accessing them locally.
You can access your local project directory under
/vagrant in VM:
$ ls /vagrant keys manifests modules outputs README.rst Vagrantfile
However, copying file back-and-forth is not a perfect solution. I
recommend setting up a sshfs filesystem (Note: if you are on OSX,
don’t forget to install fuse4x kernel extension):
$ vagrant ssh-config Host default HostName 127.0.0.1 User vagrant Port 2222 UserKnownHostsFile /dev/null StrictHostKeyChecking no PasswordAuthentication no IdentityFile "/Users/dan/.vagrant.d/insecure_private_key" IdentitiesOnly yes LogLevel FATAL $ sshfs vagrant@localhost:/home/vagrant ../vm -p2222 -oreconnect,defer_permissions,negative_vncache,volname=ghcjs,IdentityFile=~/.vagrant.d/insecure_private_key $ ls ../vm
When you are done you can just
3 Compiling other packages
diagrams package on Hackage depends on the older version
of base we are going to use the latest version from Git:
mkdir dia; cd dia git clone git://github.com/diagrams/diagrams-core.git cd diagrams-core && cabal install && cd .. cabal unpack active cd active-0.1* cat >version.patch <<EOF --- active.cabal 2013-06-12 12:58:40.082914214 +0000 +++ active.cabal.new 2013-06-12 12:58:31.029465815 +0000 @@ -19,7 +19,7 @@ library exposed-modules: Data.Active - build-depends: base >= 4.0 && < 4.7, + build-depends: base >= 4.0 && < 4.8, array >= 0.3 && < 0.5, semigroups >= 0.1 && < 0.10, semigroupoids >= 1.2 && < 3.1, @@ -31,7 +31,7 @@ test-suite active-tests type: exitcode-stdio-1.0 main-is: active-tests.hs - build-depends: base >= 4.0 && < 4.7, + build-depends: base >= 4.0 && < 4.8, array >= 0.3 && < 0.5, semigroups >= 0.1 && < 0.10, semigroupoids >= 1.2 && < 3.1, EOF patch active.cabal < version.patch cabal install cd .. git clone git://github.com/diagrams/diagrams-lib.git cd diagrams-lib && cabal install && cd .. git clone git://github.com/diagrams/diagrams-svg.git cd diagrams-svg && cabal install && cd ..
Other packages I had to install already had their Hackage versions
Now you can try to build a test diagram to see that everything works
module Main where import Diagrams.Prelude import Diagrams.Backend.SVG.CmdLine d :: Diagram SVG R2 d = square 20 # lw 0.5 # fc black # lc green # dashing [0.2,0.2] 0 main = defaultMain (pad 1.1 d)
then you can compile and run it
ghc --make Test.hs ./Test -w 400 -o /vagrant/test.svg
And that’s it!
I would also like to note that we are currently polishing the GHCJS
build process. Luite, especially is working on making ghcjs work (and
run tests) with Travis CI (it take quite a bit of time to build ghcjs
and sometimes travis is timeouting) and I am working on tidying up
the build config.
Stay tuned for more updates.