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
      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: 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

  build-asan:
    name: asan
    runs-on: ubuntu-22.04
    env:
      USE_NINJA: "1"
      CC: "clang" # used by the wasm2c tests
      WASM2C_CFLAGS: "-fsanitize=address"
    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 clang-release-asan
    - run: make test-clang-debug-asan
    - run: make test-clang-release-asan

  build-ubsan:
    name: ubsan
    runs-on: ubuntu-22.04
    env:
      USE_NINJA: "1"
      CC: "clang" # used by the wasm2c tests
      WASM2C_CFLAGS: "-fsanitize=undefined"
    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-ubsan
    - run: make clang-release-ubsan
    - run: make test-clang-debug-ubsan
    - run: make test-clang-release-ubsan

  build-wasm2c-memchecked:
    name: wasm2c-memchecked
    runs-on: ubuntu-22.04
    env:
      USE_NINJA: "1"
      CC: "clang" # used by the wasm2c tests
      WASM2C_CFLAGS: "-fsanitize=address -DWASM_RT_MEMCHECK_SIGNAL_HANDLER=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
