name: CI
on: [push]

jobs:
    ubuntu-latest:
        runs-on: ubuntu-latest

        steps:
            - name: Clone
              uses: actions/checkout@v1

            - name: Dependencies
              run: |
                  sudo apt-get update
                  sudo apt-get install build-essential
                  sudo apt-get install libsdl2-dev

            - name: Build
              run: |
                make
                make stream

    macOS-latest:
        runs-on: macOS-latest

        steps:
            - name: Clone
              uses: actions/checkout@v1

            - name: Dependencies
              run: |
                  brew update
                  brew install sdl2

            - name: Build
              run: |
                make
                make stream

    ubuntu-latest-gcc:
        runs-on: ubuntu-latest

        strategy:
            matrix:
                build: [Debug, Release]

        steps:
            - name: Clone
              uses: actions/checkout@v1

            - name: Dependencies
              run: |
                  sudo apt-get update
                  sudo apt-get install build-essential
                  sudo apt-get install cmake
                  sudo apt-get install libsdl2-dev

            - name: Configure
              run: cmake . -DWHISPER_SUPPORT_SDL2=ON -DCMAKE_BUILD_TYPE=${{ matrix.build }}

            - name: Build
              run: |
                make
                ctest -L gh --output-on-failure

    ubuntu-latest-clang:
        runs-on: ubuntu-latest

        strategy:
            matrix:
                build: [Debug, Release]

        steps:
            - name: Clone
              uses: actions/checkout@v1

            - name: Dependencies
              run: |
                  sudo apt-get update
                  sudo apt-get install build-essential
                  sudo apt-get install cmake
                  sudo apt-get install libsdl2-dev

            - name: Configure
              run: cmake . -DWHISPER_SUPPORT_SDL2=ON -DCMAKE_BUILD_TYPE=${{ matrix.build }} -DCMAKE_CXX_COMPILER=clang++ -DCMAKE_C_COMPILER=clang

            - name: Build
              run: |
                make
                ctest -L gh --output-on-failure

    ubuntu-latest-gcc-sanitized:
        runs-on: ubuntu-latest

        strategy:
            matrix:
                sanitizer: [ADDRESS, THREAD, UNDEFINED]

        steps:
            - name: Clone
              uses: actions/checkout@v1

            - name: Dependencies
              run: |
                  sudo apt-get update
                  sudo apt-get install build-essential
                  sudo apt-get install cmake

            - name: Configure
              run: cmake . -DCMAKE_BUILD_TYPE=Debug -DWHISPER_SANITIZE_${{ matrix.sanitizer }}=ON

            - name: Build
              run: |
                make
                ctest -L gh --output-on-failure

    windows:
        runs-on: windows-latest

        strategy:
            matrix:
                build: [Release]
                arch: [Win32, x64]
                sdl2: [ON]
                include:
                  - arch: Win32
                    s2arc: x86
                  - arch: x64
                    s2arc: x64
                  - sdl2: ON
                    s2ver: 2.26.0

        steps:
            - name: Clone
              uses: actions/checkout@v1

            - name: Add msbuild to PATH
              uses: microsoft/setup-msbuild@v1

            - name: Fetch SDL2 and set SDL2_DIR
              if: matrix.sdl2 == 'ON'
              run: |
                C:/msys64/usr/bin/wget.exe -qO sdl2.zip https://github.com/libsdl-org/SDL/releases/download/release-${{ matrix.s2ver }}/SDL2-devel-${{ matrix.s2ver }}-VC.zip
                7z x sdl2.zip
                echo "SDL2_DIR=$env:GITHUB_WORKSPACE/SDL2-${{ matrix.s2ver }}/cmake" >> $env:GITHUB_ENV

            - name: Configure
              run: >
                cmake -S . -B ./build -A ${{ matrix.arch }}
                -DCMAKE_BUILD_TYPE=${{ matrix.build }}
                -DWHISPER_SUPPORT_SDL2=${{ matrix.sdl2 }}

            - name: Build
              run: |
                cd ./build
                msbuild ALL_BUILD.vcxproj -t:build -p:configuration=${{ matrix.build }} -p:platform=${{ matrix.arch }}

            - name: Copy SDL2.dll
              if: matrix.sdl2 == 'ON'
              run: copy "$env:SDL2_DIR/../lib/${{ matrix.s2arc }}/SDL2.dll" build/bin/${{ matrix.build }}

            - name: Upload binaries
              if: matrix.sdl2 == 'ON'
              uses: actions/upload-artifact@v1
              with:
                name: whisper-bin-${{ matrix.arch }}
                path: build/bin/${{ matrix.build }}

    windows-blas:
        runs-on: windows-latest

        strategy:
            matrix:
                build: [Release]
                arch: [Win32, x64]
                blas: [ON]
                sdl2: [ON]
                include:
                  - arch: Win32
                    obzip: https://github.com/xianyi/OpenBLAS/releases/download/v0.3.21/OpenBLAS-0.3.21-x86.zip
                    s2arc: x86
                  - arch: x64
                    obzip: https://github.com/xianyi/OpenBLAS/releases/download/v0.3.21/OpenBLAS-0.3.21-x64.zip
                    s2arc: x64
                  - sdl2: ON
                    s2ver: 2.26.0

        steps:
            - name: Clone
              uses: actions/checkout@v1

            - name: Add msbuild to PATH
              uses: microsoft/setup-msbuild@v1

            - name: Fetch OpenBLAS
              if: matrix.blas == 'ON'
              run: |
                C:/msys64/usr/bin/wget.exe -qO blas.zip ${{ matrix.obzip }}
                7z x blas.zip -oblas -y
                copy blas/include/cblas.h .
                copy blas/include/openblas_config.h .
                echo "blasdir=$env:GITHUB_WORKSPACE/blas" >> $env:GITHUB_ENV

            - name: Fetch SDL2 and set SDL2_DIR
              if: matrix.sdl2 == 'ON'
              run: |
                C:/msys64/usr/bin/wget.exe -qO sdl2.zip https://github.com/libsdl-org/SDL/releases/download/release-${{ matrix.s2ver }}/SDL2-devel-${{ matrix.s2ver }}-VC.zip
                7z x sdl2.zip
                echo "SDL2_DIR=$env:GITHUB_WORKSPACE/SDL2-${{ matrix.s2ver }}/cmake" >> $env:GITHUB_ENV

            - name: Configure
              run: >
                cmake -S . -B ./build -A ${{ matrix.arch }}
                -DCMAKE_BUILD_TYPE=${{ matrix.build }}
                -DWHISPER_SUPPORT_OPENBLAS=${{ matrix.blas }}
                -DCMAKE_LIBRARY_PATH="$env:blasdir/lib"
                -DWHISPER_SUPPORT_SDL2=${{ matrix.sdl2 }}

            - name: Build
              run: |
                cd ./build
                msbuild ALL_BUILD.vcxproj -t:build -p:configuration=${{ matrix.build }} -p:platform=${{ matrix.arch }}

            - name: Copy libopenblas.dll
              if: matrix.blas == 'ON'
              run: copy "$env:blasdir/bin/libopenblas.dll" build/bin/${{ matrix.build }}

            - name: Copy SDL2.dll
              if: matrix.sdl2 == 'ON'
              run: copy "$env:SDL2_DIR/../lib/${{ matrix.s2arc }}/SDL2.dll" build/bin/${{ matrix.build }}

            - name: Upload binaries
              if: matrix.blas == 'ON' && matrix.sdl2 == 'ON'
              uses: actions/upload-artifact@v1
              with:
                name: whisper-blas-bin-${{ matrix.arch }}
                path: build/bin/${{ matrix.build }}

    emscripten:
        runs-on: ubuntu-latest

        strategy:
            matrix:
                build: [Release]

        steps:
            - name: Clone
              uses: actions/checkout@v1

            - name: Dependencies
              run: |
                wget -q https://github.com/emscripten-core/emsdk/archive/master.tar.gz
                tar -xvf master.tar.gz
                emsdk-master/emsdk update
                emsdk-master/emsdk install latest
                emsdk-master/emsdk activate latest

            - name: Configure
              run: echo "tmp"

            - name: Build
              run: |
                pushd emsdk-master
                source ./emsdk_env.sh
                popd
                emcmake cmake . -DCMAKE_BUILD_TYPE=${{ matrix.build }}
                make
