name: tests on: [push, pull_request] jobs: build-linux: runs-on: ubuntu-latest name: build-linux-${{ matrix.config.target }} timeout-minutes: 10 strategy: fail-fast: false matrix: config: - {target: clang, cc: clang, } - {target: clang-x86, cc: clang, flags: -DCMAKE_C_FLAGS="-m32", install: "gcc-multilib" } - {target: gcc, cc: gcc, } - {target: gcc-debug, cc: gcc, flags: -DCMAKE_BUILD_TYPE=Debug } # TODO: fails on numeric operations #- {target: gcc-x86, cc: gcc, flags: "-m32", install: "gcc-multilib" } steps: - uses: actions/checkout@v2 - name: Install ${{ matrix.config.install }} if: ${{ matrix.config.install }} run: | sudo apt update sudo apt install ${{ matrix.config.install }} - name: Configure env: CC: ${{ matrix.config.cc }} run: | mkdir build cd build cmake ${{ matrix.config.flags }} .. - name: Build run: | cmake --build build - name: Test WebAssembly spec run: cd test && python3 run-spec-test.py - name: Test WASI apps run: cd test && python3 run-wasi-test.py build-linux-alpine: runs-on: ubuntu-latest container: alpine:3.10 steps: - uses: actions/checkout@v2 - name: Prepare run: apk add build-base cmake python3 git --update-cache - name: Configure run: | mkdir build cd build cmake .. - name: Build run: cmake --build build - name: Test WebAssembly spec run: cd test && python3 run-spec-test.py - name: Test WASI apps run: cd test && python3 run-wasi-test.py build-mac: runs-on: macos-latest timeout-minutes: 10 steps: - uses: actions/checkout@v2 - name: Configure run: | mkdir build cd build cmake .. - name: Build run: | cmake --build build - name: Test WebAssembly spec run: cd test && python3 run-spec-test.py - name: Test WASI apps run: cd test && python3 run-wasi-test.py build-windows: runs-on: windows-latest name: build-windows-${{ matrix.config.target }} timeout-minutes: 10 strategy: fail-fast: false matrix: config: - {target: clang-x64, platform: "-A x64", toolset: "-T ClangCL" } - {target: msvc-x64, platform: "-A x64", toolset: "" } - {target: clang-x86, platform: "-A Win32", toolset: "-T ClangCL" } - {target: msvc-x86, platform: "-A Win32", toolset: "" } steps: - uses: actions/checkout@v2 - name: Configure run: | mkdir build cd build cmake ${{ matrix.config.platform }} ${{ matrix.config.toolset }} .. - name: Build run: | cmake --build build --config Release cp ./build/Release/wasm3.exe ./build/ - name: Test WebAssembly spec run: | cd test python run-spec-test.py - name: Test WASI apps run: | cd test python run-wasi-test.py build-wasi: runs-on: ubuntu-latest timeout-minutes: 10 steps: - uses: actions/checkout@v2 - name: Install Python dependencies run: | python3 -m pip install pip=20.1.1 python3 -m pip install --upgrade setuptools wheel pip3 --version - name: Install Wasienv run: curl https://raw.githubusercontent.com/wasienv/wasienv/master/install.sh | sh - name: Install Wasmer env: WASMER_RELEASE_TAG: "0.17.1" run: curl https://get.wasmer.io -sSfL | sh - name: Configure run: | source $HOME/.wasienv/wasienv.sh mkdir build-wasi cd build-wasi wasimake cmake -DBUILD_WASI=metawasi .. - name: Build run: | source $HOME/.wasienv/wasienv.sh cmake --build build-wasi - name: Test WebAssembly spec (in Wasmer) run: | source $HOME/.wasmer/wasmer.sh cd test python3 run-spec-test.py --exec "wasmer run --dir=. ../build-wasi/wasm3.wasm -- --repl" # TODO: Test WASI apps in Wasmer - name: Configure (native) run: | mkdir build cd build export CFLAGS="-Dd_m3LogOutput=0" cmake .. - name: Build (native) run: | cmake --build build - name: Test WebAssembly spec (in Wasm3, self-hosting) run: | cd test cp ../build-wasi/wasm3.wasm ./ python3 run-spec-test.py --exec "../build/wasm3 --stack-size 2097152 ../build-wasi/wasm3.wasm --repl" - name: Test WASI apps (in Wasm3, self-hosting) run: | cd test python3 run-wasi-test.py --fast --exec "../build/wasm3 --stack-size 2097152 ../build-wasi/wasm3.wasm" build-ios: runs-on: macos-latest timeout-minutes: 10 steps: - uses: actions/checkout@v2 - name: List Xcode versions run: ls /Applications | grep Xcode - name: Select Xcode 11 run: sudo xcode-select -switch /Applications/Xcode_11.3.app - name: Build (iPhone 11) run: | cd platforms/ios xcodebuild build -scheme wasm3 -project wasm3.xcodeproj -configuration Release -destination 'platform=iOS Simulator,name=iPhone 11,OS=13.3' build-android: runs-on: ubuntu-latest timeout-minutes: 10 steps: - uses: actions/checkout@v2 - uses: seanmiddleditch/gha-setup-ninja@master - name: Set up JDK 1.8 uses: actions/setup-java@v1 with: java-version: 1.8 - name: Build run: | cd platforms/android ./gradlew build build-cross-qemu: runs-on: ubuntu-latest name: build-cross-qemu-${{ matrix.config.target }} timeout-minutes: 10 strategy: fail-fast: false matrix: config: #- {target: i386, toolchain: gcc-multilib, cc: clang -m32, qemu: qemu-i386-static } - {target: arm, toolchain: gcc-arm-linux-gnueabi, cc: arm-linux-gnueabi-gcc, qemu: qemu-arm-static } - {target: armhf, toolchain: gcc-arm-linux-gnueabihf, cc: arm-linux-gnueabihf-gcc, qemu: qemu-arm-static } - {target: aarch64, toolchain: gcc-aarch64-linux-gnu, cc: aarch64-linux-gnu-gcc, qemu: qemu-aarch64-static } - {target: riscv64, toolchain: gcc-riscv64-linux-gnu, cc: riscv64-linux-gnu-gcc, qemu: qemu-riscv64-static } - {target: ppc, toolchain: gcc-powerpc-linux-gnu, cc: powerpc-linux-gnu-gcc, qemu: qemu-ppc-static } - {target: ppc64, toolchain: gcc-powerpc64-linux-gnu, cc: powerpc64-linux-gnu-gcc, qemu: qemu-ppc64-static } - {target: ppc64le, toolchain: gcc-powerpc64le-linux-gnu, cc: powerpc64le-linux-gnu-gcc, qemu: qemu-ppc64le-static } - {target: s390x, toolchain: gcc-s390x-linux-gnu, cc: s390x-linux-gnu-gcc, qemu: qemu-s390x-static } - {target: mips, toolchain: gcc-mips-linux-gnu, cc: mips-linux-gnu-gcc, qemu: qemu-mips-static } - {target: mips64, toolchain: gcc-mips64-linux-gnuabi64, cc: mips64-linux-gnuabi64-gcc, qemu: qemu-mips64-static } - {target: mipsel, toolchain: gcc-mipsel-linux-gnu, cc: mipsel-linux-gnu-gcc, qemu: qemu-mipsel-static } - {target: mips64el,toolchain: gcc-mips64el-linux-gnuabi64, cc: mips64el-linux-gnuabi64-gcc,qemu: qemu-mips64el-static } - {target: alpha, toolchain: gcc-alpha-linux-gnu, cc: alpha-linux-gnu-gcc, qemu: qemu-alpha-static } - {target: sparc64, toolchain: gcc-sparc64-linux-gnu, cc: sparc64-linux-gnu-gcc, qemu: qemu-sparc64-static, skip_wasi: true } #- {target: i386 (u64 slots), toolchain: gcc-multilib, cc: clang -m32, qemu: qemu-i386-static, cflags: -Dd_m3Use32BitSlots=0 } - {target: arm (u64 slots), toolchain: gcc-arm-linux-gnueabi, cc: arm-linux-gnueabi-gcc, qemu: qemu-arm-static, cflags: -Dd_m3Use32BitSlots=0 } - {target: aarch64 (u64 slots), toolchain: gcc-aarch64-linux-gnu, cc: aarch64-linux-gnu-gcc, qemu: qemu-aarch64-static, cflags: -Dd_m3Use32BitSlots=0 } - {target: ppc (u64 slots), toolchain: gcc-powerpc-linux-gnu, cc: powerpc-linux-gnu-gcc, qemu: qemu-ppc-static, cflags: -Dd_m3Use32BitSlots=0 } - {target: ppc64 (u64 slots), toolchain: gcc-powerpc64-linux-gnu, cc: powerpc64-linux-gnu-gcc, qemu: qemu-ppc64-static, cflags: -Dd_m3Use32BitSlots=0 } steps: - uses: actions/checkout@v2 - name: Install QEMU env: QEMU_SRC: "http://archive.ubuntu.com/ubuntu/pool/universe/q/qemu" QEMU_VER: "qemu-user-static_4\\.2-.*_amd64.deb$" run: | DEB=`curl -s $QEMU_SRC/ | grep -o -E 'href="([^"#]+)"' | cut -d'"' -f2 | grep $QEMU_VER | tail -1` wget $QEMU_SRC/$DEB sudo dpkg -i $DEB - name: Install ${{ matrix.config.toolchain }} run: | sudo apt update sudo apt install ${{ matrix.config.toolchain }} - name: Build run: | mkdir build cd build ${{ matrix.config.cc }} -DASSERTS -Dd_m3HasWASI \ -I../source ../source/*.c ../platforms/app/main.c \ -O3 -g0 -flto -lm -static \ -o wasm3 - name: Test WebAssembly spec run: | cd test python3 run-spec-test.py --exec "${{ matrix.config.qemu }} ../build/wasm3 --repl" - name: Test WASI apps if: ${{ !matrix.config.skip_wasi }} run: | cd test python3 run-wasi-test.py --fast --exec "${{ matrix.config.qemu }} ../build/wasm3" build-platformio: runs-on: ubuntu-latest timeout-minutes: 10 steps: - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 with: python-version: '3.x' - name: Install PlatformIO run: | python -m pip install --upgrade pip pip install -U platformio - name: Build AVR ATmega1284 run: | cd platforms/arduino pio run -e mega1284 ! nm .pio/build/mega1284/firmware.elf | grep printf - name: Build ESP8266 run: | cd platforms/esp8266 pio run # TODO: #- name: Build ESP32 # run: | # cd platforms/esp32-pio # pio run build-platformio-arm: runs-on: ubuntu-latest timeout-minutes: 10 steps: - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 with: python-version: '3.x' - name: Install PlatformIO run: | python -m pip install --upgrade pip pip install -U platformio - name: Build Arduino MKR1000 run: | cd platforms/arduino pio run -e mkr1000 - name: Build Blue Pill (JeeH) run: | cd platforms/bluepill pio run - name: Build TinyBLE run: | cd platforms/arduino pio run -e tinyBLE - name: Build MXChip AZ3166 run: | cd platforms/arduino pio run -e az3166 build-platformio-riscv: runs-on: ubuntu-latest timeout-minutes: 10 steps: - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v1 with: python-version: '3.x' - name: Install PlatformIO run: | python -m pip install --upgrade pip pip install -U platformio - name: Build HiFive1 run: | cd platforms/hifive1 pio run - name: Build Sipeed MAIX run: | cd platforms/arduino pio run -e maix build-particle: runs-on: ubuntu-latest timeout-minutes: 10 if: "github.event_name == 'push'" steps: - uses: actions/checkout@v2 - name: Set up Particle CLI run: sudo npm install -g particle-cli - name: Log in env: PARTICLE_TOKEN: ${{ secrets.PARTICLE_TOKEN }} run: particle login --token $PARTICLE_TOKEN - name: Build Photon run: | cd platforms/particle particle compile --followSymlinks photon build-esp32-idf: runs-on: ubuntu-latest container: igrr/idf-qemu:release-v4.0-esp-develop-20191228 timeout-minutes: 10 steps: - uses: actions/checkout@v2 - name: Build for ESP32 (IDF v4.0) run: | . $IDF_PATH/export.sh cd platforms/esp32-idf export EXTRA_CFLAGS="-Werror" idf.py build shell: bash - name: Test for ESP32 in QEMU run: | cd platforms/esp32-idf make-flash-img.sh wasm3 flash_img.bin qemu-system-xtensa -machine esp32 -nographic -drive file=flash_img.bin,if=mtd,format=raw -no-reboot | tee out.txt grep "Result: 46368" out.txt grep "Elapsed: " out.txt grep "Restarting..." out.txt test $(($(grep "ets Jun 8 2016" out.txt | wc -l))) -eq 1 - name: Check that IDF and PIO examples are in sync run: | diff -q platforms/esp32-idf/main/main.cpp platforms/esp32-pio/src/main.cpp # TODO: also check that the build flags are in sync build-cpp: runs-on: ubuntu-latest timeout-minutes: 10 steps: - uses: actions/checkout@v2 - name: Configure run: | cd platforms/cpp mkdir build cd build cmake .. - name: Build run: | cd platforms/cpp cmake --build build - name: Run run: | cd platforms/cpp/build ./wasm3_cpp_example build-as-cpp: name: maintenance (build as C++) runs-on: ubuntu-latest timeout-minutes: 10 steps: - uses: actions/checkout@v2 - name: Build run: | mkdir build cd build g++ -xc++ -Dd_m3HasWASI \ -I../source ../source/*.c ../platforms/app/main.c \ -O3 -g0 -lm \ -o wasm3 - name: Test run: ./build/wasm3 ./test/wasi/test.wasm build-with-logs: name: maintenance (debug logs) runs-on: ubuntu-latest timeout-minutes: 10 steps: - uses: actions/checkout@v2 - name: Build run: | mkdir build cd build g++ -xc++ -Dd_m3HasWASI -DDEBUG \ -Dd_m3EnableOpTracing=1 \ -Dd_m3LogParse=1 \ -Dd_m3LogModule=1 \ -Dd_m3LogCompile=1 \ -Dd_m3LogWasmStack=1 \ -Dd_m3LogEmit=1 \ -Dd_m3LogCodePages=1 \ -Dd_m3LogExec=1 \ -Dd_m3LogRuntime=1 \ -Dd_m3LogStackTrace=1 \ -Dd_m3LogNativeStack=1 \ -I../source ../source/*.c ../platforms/app/main.c \ -O3 -g0 -lm \ -o wasm3 - name: Test run: ./build/wasm3 ./test/wasi/test.wasm > /dev/null build-preprocessed-ops: name: maintenance (preprocess ops) runs-on: ubuntu-latest timeout-minutes: 10 steps: - uses: actions/checkout@v2 - name: Install sponge run: | sudo apt update sudo apt install moreutils - name: Build run: | make -f extra/utils.mk preprocess mkdir build cd build gcc -Dd_m3HasWASI \ -I../source ../source/*.c ../platforms/app/main.c \ -O3 -g0 -lm \ -o wasm3 - name: Test run: ./build/wasm3 ./test/wasi/test.wasm build-python: runs-on: ubuntu-latest strategy: matrix: python-version: [3.5, 3.6, 3.7, 3.8] steps: - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v1 with: python-version: ${{ matrix.python-version }} - name: Build python module run: | pip install . - name: Test with pytest run: | pip install pytest pytest platforms/python/test