An example of D to asmjs using emscripten
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
api
rt
src
.gitignore
LICENSE
Makefile
README.md
build_asmjs
build_native
check
fetch_toolchain
ldc.patch

README.md

dscripten

An example of D to asmjs using Emscripten

Authors

Purpose

This is a demonstration on how D code can be compiled to Javascript using a combination of existing tools.

Demo

You can try an online demo here: http://code.alaiwan.org/dscripten/full.html

Usage

  • Fetch and build the toolchains

    $ ./fetch_toolchain
    

    This will take some time, as it will build LLVM-fastcomp and a patched ldc2. The result will be in the /tmp/toolchains directory. Alternatively, it's possible to specify another installation prefix using the 'PREFIX' environment variable.

    It's also possible to specify another temporary directory using the 'tmpDir' environment variable. Using a tmpfs (in-RAM directory) is recommended, as it greatly speeds up the build.

  • Add some directories to your PATH

    First, add the JSBackend LLVM toolchain. This one provides ldc2, clang, llc.

    $ export PATH=/tmp/toolchains/llvm-js/bin:$PATH
    

    Then, add Emscripten itself, i.e the python 'emcc' tool family. This relies on the JSBackend LLVM toolchain.

    $ export PATH=/tmp/toolchains/emscripten:$PATH
    
  • Check your PATH:

    Here's what you should get:

    $ which -a llvm-config
    /tmp/toolchains/llvm-js/bin/llvm-config
    

    If you have more than one llvm-config appearing in this list, you're asking for trouble and the build might not work.

  • Now configure emscripten. This will create a '.emscripten' configuration file in your home, containing the path to LLVM 3.9svn (aka 'fastcomp', which implements the JSBackend). "emcc" will use this path to find its Javascript-enabled clang and llc.

    rm -f ~/.emscripten
    EMMAKEN_JUST_CONFIGURE=1 PATH=/tmp/toolchains/llvm-js/bin:$PATH /tmp/toolchains/emscripten/emcc
    
  • Run the build script (it just sets some variables before calling the makefile)

    $ ./build_asmjs
    

    (If it fails, try removing ~/.emscripten, or setting EM_CONFIG to anything else)

  • Enjoy the result:

    $ firefox bin/asmjs/game.html
    
  • You can also play the native version:

    $ ./build_native
    $ ./bin/native/game.exe
    

License

  • The build scripts and demo game source files are licensed under the GNU Affero GPL. In short: you're free to run them for whatever purpose, but if you put them on a server and provide them as a service, you must ensure your users have access to the source code, under the same license.

  • Everything under the '/rt' directory is licensed under the permissive Boost software license. Indeed, some parts of 'rt' get integrated to the produced asm.js binaries, for which I don't want to impose any restriction.