Skip to content

Ada WASM Runtime and Bindings for Web API

License

BSD-3-Clause, GPL-3.0 licenses found

Licenses found

BSD-3-Clause
LICENSE.BSD3
GPL-3.0
LICENSE.GPL3
Notifications You must be signed in to change notification settings

godunko/adawebpack

Build binaries

AdaWebPack

AdaWebPack includes GNAT-LLVM compiler for WebAssembly target, GNAT Run Time Library and AdaWebPack bindings for Web API.

How to install

Prebuild packages are available on Release page.

You will also need wasm-ld, the Web asssembly linker. You will find this:

  • on Fedora Linux through the lld package;
  • on Ubuntu through the lld-16 package;
  • on other Linux systems look for a similarly-named package.

How to build

  • Setup GNAT using Alire.

  • Clone GNAT-LLVM. Latest known good revision of GNAT-LLVM compatible with GNAT FSF is 66e36d929524972353600db5d604d0189cf0308f.

    git clone https://github.com/AdaCore/gnat-llvm
    git -C gnat-llvm checkout 66e36d929524972353600db5d604d0189cf0308f
    
  • Clone bb-runtimes. Use gnat-fsf-14 branch.

    git clone -b gnat-fsf-14 https://github.com/Fabien-Chouteau/bb-runtimes gnat-llvm/llvm-interface/bb-runtimes
    
  • Clone GCC sources. Use, for instance, releases/gcc-14.1.0 commit.

    git clone --single-branch --branch=releases/gcc-14 --shallow-since=01-04-2024 https://github.com/gcc-mirror/gcc gnat-llvm/llvm-interface/gcc
    git -C gnat-llvm/llvm-interface/gcc checkout releases/gcc-14.1.0
    
  • Setup GNAT-LLVM development environment, see details in GNAT-LLVM README. Note, you need to use externally build LLVM with enabled 'lld' project and 'WebAssembly' target, so, if you build it your-self, cmake command line should contain among other switches:

    cmake ... -DLLVM_ENABLE_PROJECTS='...;clang;lld' -DLLVM_TARGETS_TO_BUILD="...;WebAssembly"
    

    On Ubuntu it is possible to install prebuild LLVM/CLang packages (use LLVM/CLang 16). However, alternatives need to be updated using the provided script:

    sudo utilities/update-alternatives-clang.sh 16 100
    

    Or install a LLVM 16 binary release (llvm-16, lld-16 and clang-16 are required).

  • Checkout AdaWebPack repository into gnat-llvm/llvm-interface as adawebpack_src and create link for Makefile.target.

    cd gnat-llvm/llvm-interface
    git clone https://github.com/godunko/adawebpack.git adawebpack_src
    ln -s adawebpack_src/source/rtl/Makefile.target
    cd -
    
  • Create a link to RTS source code

    cd gnat-llvm/llvm-interface
    ln -s bb-runtimes/gnat_rts_sources/include/rts-sources/
    cd -
    
  • Create a link to GNAT source code (or copy it)

    cd gnat-llvm/llvm-interface
    ln -s gcc/gcc/ada gnat_src
    cd -
    
  • Apply patch to GNAT-LLVM repository

    cd gnat-llvm/llvm-interface
    patch -p1 < adawebpack_src/patches/gnat-llvm.patch
    patch -p1 < adawebpack_src/patches/llvm_wrapper2.patch
    cd -
    
  • Use make wasm to build compiler and Run Time Library

    cd gnat-llvm/llvm-interface
    make wasm
    cd -
    
  • When make finishes, you will find toolchain in gnat-llvm/llvm-interface/bin.

    cd gnat-llvm/llvm-interface
    export PATH=$PWD/bin:$PATH
    cd -
    
  • Now you can build examples:

    cd gnat-llvm/llvm-interface/adawebpack_src
    make build_examples
    cd -
    

    You will most likely need to run the examples through an HTTP server; otherwise, the browser will report a security error and/or refuse to load the page. An easy way to obtain an HTTP server is by via Python 3 with python3 -m http.server.

Usage with Docker

It could be handy to use docker.

  • Find latest build on our Fedora COPR repository.
  • Build a container image (make sure to replace curl argument with latest RPM URL)
    docker build --tag wgprbuild - <<EOF
    FROM registry.fedoraproject.org/fedora-minimal:40
    RUN microdnf --assumeyes install \
      gprbuild \
      clang16 \
      llvm16 \
      lld \
      libgnat \
      ca-certificates && \
    curl -O \
    https://download.copr.fedorainfracloud.org/results/reznik/adawebpack/fedora-40-x86_64/07674186-adawebpack/adawebpack-24.0.0-git.fc40.x86_64.rpm && \
    rpm -i adawebpack*.rpm && \
    rm -f adawebpack*.rpm && \
    /usr/share/adawebpack/update-alternatives-clang.sh 16 99 && \
    microdnf clean all
    EOF
    
  • Write a bash wrapper script to replace gprbuild like this:
    #!/bin/bash
    exec docker run --rm --tmpfs /tmp/ --user $UID --volume $HOME:$HOME --workdir $PWD wgprbuild gprbuild "$@"

Unsupported features

  • nested subprograms are not supported

  • exceptions support is limited to local exceptions propagation and last chance handler

  • tasks and protected objects are not supported

License

Web API bindings is licensed under BSD3 license.

GNAT Runtime Library is licensed under GPL3 license with GCC Runtime Library Exception.