# Configs that enables Deep Redudancy (DRED)
name: DRED

on: [push, pull_request]

jobs:
  CMakeBuild:
    name: CMake/${{ matrix.config.name }}
    runs-on: ${{ matrix.config.os }}
    strategy:
      fail-fast: false
      matrix:
        config:
        - {
            name: "Windows/Lib/X64/Release",
            os: windows-latest,
            config: Release,
            args: -G "Visual Studio 17 2022" -DOPUS_X86_PRESUME_AVX2=ON
          }
        - {
           name: "Windows/Lib/armv8/Release",
           os: windows-latest,
           config: Release,
           args: -G "Visual Studio 17 2022" -A ARM64
          }
        - {
            name: "Linux/Lib/X64/Release",
            os: ubuntu-latest,
            config: Release,
            args: -DOPUS_X86_PRESUME_AVX2=ON
          }
        - {
            name: "Android/Lib/X64/Release",
            os: ubuntu-latest,
            config: Release,
            args: "-DCMAKE_TOOLCHAIN_FILE=${ANDROID_HOME}/ndk/25.2.9519653/build/cmake/android.toolchain.cmake -DANDROID_ABI=x86_64"
          }
        - {
            name: "Android/Lib/ARMv8/Release",
            os: ubuntu-latest,
            config: Release,
            args: "-DCMAKE_TOOLCHAIN_FILE=${ANDROID_HOME}/ndk/25.2.9519653/build/cmake/android.toolchain.cmake -DANDROID_ABI=arm64-v8a"
          }
        - {
            name: "MacOSX/Lib/X64/Release",
            os: macos-latest,
            config: Release,
            # some macs are really old in githubs lab so they don't support avx
            args: -DOPUS_X86_PRESUME_AVX2=OFF
          }
        - {
            name: "iOS/Lib/arm64/Release",
            os: macos-latest,
            config: Release,
            args: -G "Unix Makefiles" -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64
          }
    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0
      - name: Install AutoConf, AutoMake and LibTool # Needed for autogen.sh
        if: matrix.config.os == 'macos-latest'
        run: brew install autoconf automake libtool
      - name: Download models Windows
        if: contains(matrix.config.name, 'Windows')
        run: .\autogen.bat
      - name: Download models
        if: contains(matrix.config.name, 'MacOSX') ||
            contains(matrix.config.name, 'Linux') ||
            contains(matrix.config.name, 'Android') ||
            contains(matrix.config.name, 'iOS')
        run: ./autogen.sh
      - name: Create Work Dir
        run: mkdir build
      - name: Configure
        working-directory: ./build
        run: cmake .. ${{ matrix.config.args }} -DCMAKE_BUILD_TYPE=${{ matrix.config.config }} -DOPUS_BUILD_PROGRAMS=ON -DBUILD_TESTING=ON -DOPUS_FAST_MATH=ON -DOPUS_FLOAT_APPROX=ON -DOPUS_DRED=ON -DOPUS_OSCE=ON
      - name: Build
        working-directory: ./build
        run: cmake --build . -j 2 --config ${{ matrix.config.config }} --target package
      - name: Test
        if: contains(matrix.config.name, 'Windows') && !contains(matrix.config.name, 'ARM') && !contains(matrix.config.name, 'Dll') ||
            contains(matrix.config.name, 'MacOSX') && !contains(matrix.config.name, 'ARM') && !contains(matrix.config.name, 'Dll') ||
            contains(matrix.config.name, 'Linux') && !contains(matrix.config.name, 'ARM') && !contains(matrix.config.name, 'Dll')
        working-directory: ./build
        run: ctest -j 2 -C ${{ matrix.config.config }} --output-on-failure

  AutoToolsBuild:
    name: AutoTools/${{ matrix.config.name }}
    runs-on: ${{ matrix.config.os }}
    strategy:
      fail-fast: false
      matrix:
        config:
        - {
            name: "Linux/GCC",
            os: ubuntu-latest,
            compiler: gcc,
            automakeconfig:
          }
        - {
            name: "Linux/Clang",
            os: ubuntu-latest,
            compiler: clang,
            automakeconfig:
          }
    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0
      - name: Install AutoConf, AutoMake and LibTool on MacOSX
        if: matrix.config.os == 'macos-latest'
        run: brew install autoconf automake libtool
      - name: Autogen
        run: CC=${{ matrix.config.compiler }} ./autogen.sh
      - name: Configure
        run: CFLAGS="-mavx -mfma -mavx2 -O2 -ffast-math" ./configure --enable-float-approx
      - name: Build
        run: make -j 2
      - name: Test
        run: make check -j 2
