diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml index 3076dbf..d53f069 100644 --- a/.github/workflows/main.yaml +++ b/.github/workflows/main.yaml @@ -2,6 +2,14 @@ name: sledge on: [push, pull_request] +env: + LLVM_VERSION: 8 + WASMCEPTION_URL: https://github.com/gwsystems/wasmception/releases/download/v0.2.0/wasmception-linux-x86_64-0.2.0.tar.gz + # WASI_SDK: /opt/wasi-sdk + LANG: C.UTF-8 + LANGUAGE: C.UTF-8 + LC_ALL: C.UTF-8 + # job control jobs: format: @@ -10,3 +18,74 @@ jobs: - uses: actions/checkout@v2 - name: Clang Format run: ./format.sh -d + test: + runs-on: ubuntu-latest + steps: + - name: Apt Update + run: sudo apt-get update + - uses: actions/checkout@v2 + - name: Init Submodules + run: git submodule update --init --recursive + - name: Install General GCC C/C++ Build toolchain + run: | + sudo apt-get install -y --no-install-recommends \ + automake \ + build-essential \ + binutils-dev \ + cmake \ + git \ + libtinfo5 \ + libtool \ + pkg-config + - name: Install curl / wget tools + run: | + sudo apt-get install -y --no-install-recommends \ + curl \ + ca-certificates \ + libssl-dev \ + lsb-release \ + gpg-agent \ + software-properties-common \ + wget + - name: Install LLVM + run: | + sudo ./install_llvm.sh $LLVM_VERSION + - name: Install Rust + run: | + curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | \ + sh -s -- --default-toolchain stable --component rustfmt --target wasm32-wasi -y + echo "/root/.cargo/bin:$PATH" >> $GITHUB_PATH + - name: Get wasmception + run: | + wget $WASMCEPTION_URL -O wasmception.tar.gz + mkdir -p awsm/wasmception + tar xvfz wasmception.tar.gz -C awsm/wasmception + # - name: Get WASI-SDK + # run: | + # curl -sS -L -O https://github.com/WebAssembly/wasi-sdk/releases/download/wasi-sdk-8/wasi-sdk_8.0_amd64.deb && sudo dpkg -i wasi-sdk_8.0_amd64.deb && rm -f wasi-sdk_8.0_amd64.deb + # echo "ENV WASI_SDK=/opt/wasi-sdk" >> $GITHUB_ENV + - name: Install Test Script Utilities + run: | + sudo apt-get install -y --no-install-recommends \ + fonts-dejavu \ + fonts-cascadia-code \ + fonts-roboto \ + imagemagick \ + netpbm \ + pango1.0-tools \ + wamerican + - name: Compile sledge + run: | + make build + make rtinit + mkdir bin + mkdir lib + SYS_PREFIX="$(pwd)" ./install.sh + PATH="$(pwd)/bin:$PATH" + echo "$PATH" >> $GITHUB_PATH + LD_LIBRARY_PATH="$(pwd)/lib:$LD_LIBRARY_PATH" + echo "LD_LIBRARY_PATH=$LD_LIBRARY_PATH" >> $GITHUB_ENV + make build-validate + - name: Compile sample apps and run tests + run: | + ./test.sh diff --git a/Makefile b/Makefile index 03826ce..457987f 100644 --- a/Makefile +++ b/Makefile @@ -1,17 +1,20 @@ -COMPILER='awsm' +COMPILER=awsm ROOT=${ROOT:-$(cd "$(dirname ${BASH_SOURCE:-$0})" && pwd)} .PHONY: build build: - @echo "Building wasmception toolchain, takes a while." - @cd ${COMPILER} && make -C wasmception && cd ${ROOT} - @echo "Building aWsm compiler (release)" + test -f ./${COMPILER}/wasmception/dist/bin/clang || make -C ${COMPILER}/wasmception @cd ${COMPILER} && cargo build --release && cd ${ROOT} +# Sanity check that the aWsm compiler built and is in our PATH +.PHONY: build-validate +build-validate: + which awsm + awsm --version + .PHONY: build-dev build-dev: - @echo "Building wasmception toolchain, takes a while." - @cd ${COMPILER} && make -C wasmception && cd ${ROOT} + test -f ./${COMPILER}/wasmception/dist/bin/clang || make -C ${COMPILER}/wasmception @echo "Building aWsm compiler (default==debug)" @cd ${COMPILER} && cargo build && cd ${ROOT} diff --git a/awsm b/awsm index fa5d9ee..cd9b619 160000 --- a/awsm +++ b/awsm @@ -1 +1 @@ -Subproject commit fa5d9ee3859448094cbb021d16623a61e63ed17e +Subproject commit cd9b61958f89c8d958abae852289a2fa8f9cb299 diff --git a/install.sh b/install.sh index 420b830..60df1d6 100755 --- a/install.sh +++ b/install.sh @@ -1,13 +1,49 @@ -#!/bin/sh -# Executing by the root Makefile, typically within the sledge-dev build container +#!/bin/bash +# This script is responsible for copying, linking, and aliasing all of our build tools such that they are +# in known paths that we can add to PATH and LD_LIBRARY_PATH. The binaries go into "${SYS_PREFIX}/bin" and +# the libraries go into "${SYS_PREFIX}/lib". By default, SYS_PREFIX is `/opt/sledge/`, which means that this +# script is assumed to be executed as root, as in our Docker build container. However, by by setting +# SYS_PREFIX to a directory that the user has access to, this can be avoided. +# +# For example, in the GitHub Actions workflow, SYS_PREFIX is set to the topmost project directory and the +# environment is updated as follows. +# +# SYS_PREFIX="$(pwd)" ./install.sh +# PATH="$(pwd)/bin:$PATH" +# LD_LIBRARY_PATH="$(pwd)/lib:$LD_LIBRARY_PATH" +# +# This is currently executed +# - Indirectly via `make install` in the root Makefile, typically when the sledge-dev build container is built +# - Directly by the GitHub workflow +# +# The script takes either wasmception or wasi as the first argument to install either wasmception or WASI-SDK +# If no argument is provided, wasmception is assumed +# If either wasmception or wasi is provided, an additional `-d` or `--dry-run` flag can be provided to view the commands +# and paths that would be generated. This is helpful for sanity checking when setting SYS_PREFIX and using in a new context echo "Setting up toolchain environment" -# Get the path of this repo +for last_arg in "$@"; do :; done + +if [[ $last_arg == "-d" ]] || [[ $last_arg == "--dry-run" ]]; then + DRY_RUN=true +else + DRY_RUN=false +fi + +if $DRY_RUN; then + DRY_RUN_PREFIX=echo +else + DRY_RUN_PREFIX= +fi + +# Get the absolute path of the topmost project directly +# The use of dirname is particular. It seems unneccesary how this script is run SYS_SRC_PREFIX=${SYS_SRC_PREFIX:-"$( cd "$(dirname "$(dirname "${0}")")" || exit 1 pwd -P )"} +$DRY_RUN && echo SYS_SRC_PREFIX: "$SYS_SRC_PREFIX" # And check for the presence of this script to make sure we got it right if [ ! -x "${SYS_SRC_PREFIX}/install.sh" ]; then @@ -17,21 +53,27 @@ fi SYS_NAME='sledge' COMPILER='awsm' -COMPILER_EXECUTABLE='silverfish' +COMPILER_EXECUTABLE=$COMPILER # /opt/sledge SYS_PREFIX=${SYS_PREFIX:-"/opt/${SYS_NAME}"} +$DRY_RUN && echo SYS_PREFIX: "$SYS_PREFIX" # /sledge, where the sledge repo is mounted from the host SYS_SRC_PREFIX=${SYS_SRC_PREFIX:-"/${SYS_NAME}"} +$DRY_RUN && echo SYS_SRC_PREFIX: "$SYS_SRC_PREFIX" # The release directory containing the binary of the aWsm compiler SYS_COMPILER_REL_DIR=${SYS_COMPILER_REL_DIR:-"${SYS_SRC_PREFIX}/${COMPILER}/target/release"} +$DRY_RUN && echo SYS_COMPILER_REL_DIR: "$SYS_COMPILER_REL_DIR" # /opt/sledge/bin SYS_BIN_DIR=${SYS_BIN_DIR:-"${SYS_PREFIX}/bin"} +$DRY_RUN && echo SYS_BIN_DIR: "$SYS_BIN_DIR" + # /opt/sledge/lib SYS_LIB_DIR=${SYS_LIB_DIR:-"${SYS_PREFIX}/lib"} +$DRY_RUN && echo SYS_LIB_DIR: "$SYS_LIB_DIR" # The first argument can be either wasi or wasmception. This determines the system interface used # The default is wasmception @@ -43,7 +85,7 @@ if [ $# -eq 0 ] || [ "$1" = "wasmception" ]; then WASM_SYSROOT=${WASM_SYSROOT:-"${WASM_PREFIX}/sysroot"} WASM_TARGET=${WASM_TARGET:-"wasm32-unknown-unknown-wasm"} WASM_BIN_PREFIX=${WASM_BIN_PREFIX:-"$WASM_TARGET"} - WASM_TOOLS=ar + WASM_TOOLS=(ar) elif [ "$1" = "wasi" ]; then echo "Setting up for wasi-sdk" WASM_PREFIX=${WASM_PREFIX:-${WASM_SDK:-"/opt/wasi-sdk"}} @@ -51,16 +93,29 @@ elif [ "$1" = "wasi" ]; then WASM_SYSROOT=${WASM_SYSROOT:-"${WASM_PREFIX}/share/sysroot"} WASM_TARGET=${WASM_TARGET:-"wasm32-wasi"} WASM_BIN_PREFIX=${WASM_BIN_PREFIX:-"$WASM_TARGET"} - WASM_TOOLS=ar dwarfdump nm ranlib size + WASM_TOOLS=(ar dwarfdump nm ranlib size) fi +$DRY_RUN && echo WASM_PREFIX: "$WASM_PREFIX" +$DRY_RUN && echo WASM_BIN: "$WASM_BIN" +$DRY_RUN && echo WASM_SYSROOT: "$WASM_SYSROOT" +$DRY_RUN && echo WASM_TARGET: "$WASM_TARGET" +$DRY_RUN && echo WASM_BIN_PREFIX: "$WASM_BIN_PREFIX" +$DRY_RUN && echo WASM_TOOLS: "${WASM_TOOLS[@]}" + +# Delete all existing installations of the binaries +$DRY_RUN_PREFIX rm -f "${SYS_BIN_DIR}"/* -rm -f "${SYS_BIN_DIR}"/* -install -d -v "$SYS_BIN_DIR" || exit 1 +# And reinstall +$DRY_RUN_PREFIX install -d -v "$SYS_BIN_DIR" || exit 1 -# Link the Awsm compiler. Rename to awsm if still using legacy "silverfish" name +# Symbolically link the Awsm compiler # /sledge/awsm/target/release/silverfish /opt/sledge/bin/awsm -ln -sfv "${SYS_COMPILER_REL_DIR}/${COMPILER_EXECUTABLE}" "${SYS_BIN_DIR}/awsm" +$DRY_RUN_PREFIX ln -sfv "${SYS_COMPILER_REL_DIR}/${COMPILER_EXECUTABLE}" "${SYS_BIN_DIR}/${COMPILER_EXECUTABLE}" +# Generate shell script stubs that act as aliases that automatically set the approproiate target and sysroot +# for either Wasmception or WASI-SDK +# For example, when wasmception is set, calling `wasm32-unknown-unknown-wasm-clang` results in +# `exec "/sledge/awsm/wasmception/dist/bin/clang" --target="wasm32-unknown-unknown-wasm" --sysroot="/sledge/awsm/wasmception/sysroot" "$@"` for file in clang clang++; do wrapper_file="$(mktemp)" cat >"$wrapper_file" <