├── .github └── workflows │ └── build.yml ├── .gitignore ├── Dockerfile ├── README.md ├── shims └── cargo └── test.sh /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Build Docker Image 2 | 3 | on: 4 | push: 5 | branches: [master] 6 | workflow_dispatch: 7 | branches: [master] 8 | 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - name: Set up QEMU 14 | uses: docker/setup-qemu-action@v3 15 | 16 | - name: Set up Docker Buildx 17 | uses: docker/setup-buildx-action@v3 18 | 19 | - name: Login to GHCR (GitHub Packages) 20 | uses: docker/login-action@v3 21 | with: 22 | registry: ghcr.io 23 | username: ${{ github.actor }} 24 | password: ${{ secrets.GITHUB_TOKEN }} 25 | 26 | - name: Build and push 27 | id: docker_build 28 | uses: docker/build-push-action@v5 29 | with: 30 | push: true 31 | tags: | 32 | ghcr.io/${{github.repository}}:latest 33 | 34 | test: 35 | runs-on: ubuntu-latest 36 | needs: [build] 37 | container: 38 | image: ghcr.io/${{github.repository}}:latest 39 | steps: 40 | - name: Run some tests 41 | run: /test.sh 42 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | repo 2 | *.tar.gz 3 | *.tgz 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ghcr.io/r-wasm/webr:main 2 | 3 | # Alternative workaround 4 | RUN apt-get update && apt-get install -y lsb-release language-pack-en-base 5 | 6 | # Install some common runtime libs 7 | RUN CRANLIBS=$(curl https://r-universe.dev/stats/sysdeps/noble | jq --slurp -r '.[].packages | flatten[]' | grep -v "libnode") &&\ 8 | apt-get install -y --no-install-recommends zstd xvfb $CRANLIBS && \ 9 | apt-get clean all 10 | 11 | # Set CRAN repo, etc 12 | RUN \ 13 | git clone https://github.com/r-universe-org/base-image &&\ 14 | cp base-image/Rprofile /opt/R/current/lib/R/etc/Rprofile.site &&\ 15 | rm -R base-image 16 | 17 | # Update to latest pak 18 | RUN R -e 'install.packages("pak", lib = .Library, repos = "https://r-lib.github.io/p/pak/devel/source/linux-gnu/x86_64")' 19 | 20 | # Add cargo shim 21 | COPY shims /shims 22 | RUN cp -v /shims/* "$(R RHOME)/library/rwasm/bin/" 23 | 24 | # Set default shell to bash 25 | RUN ln -sf /usr/bin/bash /bin/sh 26 | 27 | COPY test.sh /test.sh 28 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # WebAssembly build image 2 | 3 | This container wraps https://ghcr.io/r-wasm/webr with some extra options and tools. 4 | 5 | Other things that used to be here are now merged in the upstream r-wasm container. -------------------------------------------------------------------------------- /shims/cargo: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | for arg in "$@"; do 5 | case "$arg" in 6 | "--manifest-path="*) 7 | manifest="${arg:16}" 8 | ;; 9 | "--target="*) 10 | target="$arg" 11 | ;; 12 | esac 13 | done 14 | if [ "$1" = "build" ] && [ -z "$target" ]; then 15 | targetdir=$(dirname ${manifest:-.}) 16 | echo "Setting --target to wasm32-unknown-emscripten for $targetdir" 17 | /usr/local/cargo/bin/cargo "$@" --target=wasm32-unknown-emscripten 18 | echo "Copying wasm32-unknown-emscripten/release files" 19 | cd $targetdir/target 20 | cp -Rfv wasm32-unknown-emscripten/* . || true 21 | else 22 | /usr/local/cargo/bin/cargo "$@" 23 | fi 24 | -------------------------------------------------------------------------------- /test.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | R -e "download.packages(c('tomledit', 'RcppArmadillo','sf','openssl', 'fftw', 'jsonlite', 'png', 'gdtools', 'ragg', 'systemfonts', 'textshaping', 'gam'), 5 | '.', repos = 'https://cloud.r-project.org')" 6 | #curl -OL "https://r-rust.r-universe.dev/src/contrib/hellorust_1.2.3.tar.gz" 7 | for pkg in *.tar.gz; do 8 | #broken in pak: R -e "pak::pak('deps::$pkg')" 9 | R -e "pak::pak('./$pkg')" 10 | R -e "rwasm::build('./$pkg')" 11 | done 12 | --------------------------------------------------------------------------------