Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/ghcjs/ghcjs
Haskell to JavaScript compiler, based on GHC
https://github.com/ghcjs/ghcjs
Last synced: 1 day ago
JSON representation
Haskell to JavaScript compiler, based on GHC
- Host: GitHub
- URL: https://github.com/ghcjs/ghcjs
- Owner: ghcjs
- License: mit
- Created: 2010-08-19T16:32:40.000Z (over 14 years ago)
- Default Branch: ghc-8.10
- Last Pushed: 2023-01-21T23:46:36.000Z (about 2 years ago)
- Last Synced: 2025-01-24T13:06:31.478Z (8 days ago)
- Language: Haskell
- Homepage:
- Size: 6.51 MB
- Stars: 2,607
- Watchers: 75
- Forks: 186
- Open Issues: 293
-
Metadata Files:
- Readme: README.markdown
- License: LICENSE
Awesome Lists containing this project
README
Introduction
============GHCJS is a Haskell to JavaScript compiler that uses the GHC API.
Quick Start - Developing GHCJS
==============================GHCJS contains a library, `ghcjs`, which contains the JavaScript code generator and a slightly customized variant of the `ghc` library, and several executable programs.
The repository has several submodules and some files must be generated before the package can be installed.
### prerequisites
#### GHC
You need the same major version of GHC as the version of the GHCJS branch you're building.
#### cabal-install
cabal-install 3.0 is supported
#### emscripten emsdk
GHCJS uses a C toolchain, mostly for build system related tasks like the C preprocessor, Autoconf scripts and tools like `hsc2hs`. Direct support for using compiled foreign libraries from Haskell code may follow at a later date.
Please follow the installation instructions at https://emscripten.org/docs/getting_started/index.html
GHCJS requires the "upstream" emscripten backend, which is the default now. The earlier "fastcomp" backend will not work.
### getting and preparing the source tree
```
$ git clone https://github.com/ghcjs/ghcjs.git
$ cd ghcjs
$ git submodule update --init --recursive
```### building the compiler
GHCJS depends on a few "local" packages in the source tree. You can use
`cabal-install` and `stack` to set up a build environment that contains
these packages.#### Cabal new-install
After the source tree has been prepared, the package can be installed.
You may want ensure that binaries of earlier versions are overwritten:```{.shell}
cabal v2-install --overwrite-policy=always --install-method=copy --installdir=inplace/bin
```At the time of writing, `cabal-install` does not support creating symbolic links on Windows, even though this is the default installation method. A workaround is telling it to copy the executables instead:
```{.shell}
cabal v1-install --prefix=inplace
```#### v1 style Cabal sandbox
v1 style cabal sandboxes are also supported
if you want to build with a Cabal sandbox, use the `makeSandbox.sh` script
to add the local packages.```
$ cabal v1-sandbox init
$ cabal v1-install
```#### stack
or you can use stack:
```
$ stack --system-ghc --skip-ghc-check install --local-bin-dir=inplace/bin
```#### Booting GHCJS
The `ghcjs-boot` program builds the "boot" libraries, like `ghc-prim`, `base` and `template-haskell` with GHCJS. After booting, GHCJS can compile regular Haskell programs and packages.
`ghcjs-boot` needs to be able to find the emscripten toolchain, a nodejs executable. The easiest way to do this is by running the `emsdk_env.sh` script. After that, you can run `ghcjs-boot` by pointing it to the boot libraries (the directory containing the `boot.yaml` file)
```
$ source ~/emsdk/emsdk_env.sh
$ ./inplace/bin/ghcjs-boot -s ./lib/boot
```### GHCJS executables and library paths
After booting, you can add the directory containing the GHCJS binaries to
your executable PATH. The `ghcjs-boot` program prints the location after
finishing building the libraries.You can also create a symbolic link for the `ghcjs` and `ghcjs-pkg`
programs, or use the `--with-compiler` and `--with-hc-pkg` flags
when using `cabal-install`#### Generating a source distribution
if you work on boot packages that need some for an upstream library,
make sure to update the patches in `/lib/patches` first```
$ ./utils/updatePatches.sh
```then regenerate the packages
```
$ ./utils/makePackages.sh
```