name: CI

on:
  create:
    tags:
  push:
    branches:
      - main
  pull_request:

jobs:
  lint:
    name: lint
    runs-on: ubuntu-latest
    steps:
    - uses: actions/setup-python@v1
      with:
        python-version: '3.x'
    - uses: actions/checkout@v1
    - name: install tools
      run: |
        pip3 install flake8==3.7.8
        sudo apt-get install clang-format
    - run: flake8
    - run: ./scripts/clang-format-diff.sh
      env:
        GITHUB_EVENT_BEFORE: ${{ github.event.before }}
  build:
    name: build
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-latest, macos-12, windows-latest]
    steps:
    - uses: actions/setup-python@v1
      with:
        python-version: '3.x'
    - uses: actions/checkout@v1
      with:
        submodules: true
    - name: install ninja (linux)
      run: sudo apt-get install ninja-build
      if: matrix.os == 'ubuntu-latest'
    - name: install ninja (osx)
      run: brew install ninja
      if: matrix.os == 'macos-12'
    - name: install ninja (win)
      run: choco install ninja
      if: matrix.os == 'windows-latest'
    - name: mkdir
      run: mkdir -p out
    - name: cmake
      run: cmake .. -G Ninja -DWITH_WASI=ON -DWERROR=ON -Werror=dev -Wno-deprecated
      working-directory: out
      if: matrix.os != 'windows-latest'
    - name: cmake (windows)
      run: cmake .. -DWERROR=ON -Werror=dev
      working-directory: out
      if: matrix.os == 'windows-latest'
    - name: build
      run: cmake --build out
    - name: check if generated files are up-to-date
      run: python ./scripts/check_clean.py
    - name: unittests
      run: cmake --build out --target run-unittests
    - name: c-api-tests
      run: cmake --build out --target run-c-api-tests
    - name: tests
      run: cmake --build out --target run-tests
  emscripten:
    name: emscripten
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v1
      with:
        submodules: true
    - name: build
      run: |
        docker run -di --name emscripten -v $(pwd):/src emscripten/emsdk:latest bash
        docker exec emscripten emcc -v
        docker exec emscripten emcmake cmake .
        docker exec emscripten make -j 2 VERBOSE=1
  wasi:
    name: wasi
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          submodules: true
      - name: build-tools
        run: |
          docker run -di --name wasi-sdk -v $(pwd):/src --workdir /src ghcr.io/webassembly/wasi-sdk:wasi-sdk-20 bash
          docker exec wasi-sdk cmake -S . -B out -G Ninja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=install -DBUILD_TESTS=0 -DBUILD_LIBWASM=0
          docker exec wasi-sdk cmake --build out --config Release --target install
      - uses: ./.github/actions/release-archive
        with:
          os: wasi

  sanitize:
    name: sanitize
    runs-on: ubuntu-latest
    env:
      USE_NINJA: "1"
      CC: "clang"
      WASM2C_CFLAGS: "-march=x86-64-v2" # currently required for SIMDe to pass some tests on x86-64
    strategy:
      matrix:
        sanitizer: [asan, ubsan, fuzz]
        type: [debug, release]
    steps:
    - uses: actions/setup-python@v1
      with:
        python-version: '3.x'
    - uses: actions/checkout@v1
      with:
        submodules: true
    - run: sudo apt-get install ninja-build
    - run: make clang-${{ matrix.type }}-${{ matrix.sanitizer }}
    - if: ${{ matrix.sanitizer }} != fuzz
      run: make test-clang-${{ matrix.type }}-${{ matrix.sanitizer }}
  build-wasm2c-memchecked:
    name: wasm2c-memchecked
    runs-on: ubuntu-latest
    env:
      USE_NINJA: "1"
      CC: "clang" # used by the wasm2c tests
      WASM2C_CFLAGS: "-march=x86-64-v2 -fsanitize=address -DWASM_RT_USE_MMAP=0"
    steps:
    - uses: actions/setup-python@v1
      with:
        python-version: '3.x'
    - uses: actions/checkout@v1
      with:
        submodules: true
    - run: sudo apt-get install ninja-build
    - run: make clang-debug-asan
    - run: make test-clang-debug-asan

  build-min-cmake:
    name: min-cmake
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v1
      with:
        submodules: true
    - uses: actions/setup-python@v1
      with:
        python-version: '3.x'
    - name: Install Ninja
      run: sudo apt-get install ninja-build
    - name: Detect minimum CMake version
      run: >
        awk 'match($0, /cmake_minimum_required\(VERSION *([0-9]+\.[0-9]+)\)/, a)
        { print "WABT_CMAKE_VER=" a[1]; exit; }' CMakeLists.txt | tee $GITHUB_ENV
    - name: Install minimum CMake
      run: |
        python -m pip install -U setuptools wheel pip
        python -m pip install "cmake==${WABT_CMAKE_VER}.*"
        cmake --version
    - name: Configure WABT
      run: cmake -G Ninja -S . -B out -DCMAKE_BUILD_TYPE=Release
    - name: build
      run: cmake --build out
    - name: unittests
      run: cmake --build out --target run-unittests
    - name: c-api-tests
      run: cmake --build out --target run-c-api-tests
    - name: tests
      run: cmake --build out --target run-tests
