name: Build

on:
  push:
    tags:
      - '*'
    branches-ignore:
      - 'l10n_master'
  pull_request:
    branches:
      - '*'

env:
  QT_VERSION: "5.15.2"
  OBS_VERSION: "27.0.0-ci"
  OBSDEPS_VERSION: "27.0.0"

jobs:
  windows:
    name: "Windows 64-bit"
    strategy:
      fail-fast: true
      matrix:
        runner: [ windows-2019 ]
        include:
          - runner: windows-2019
            id: windows-2019
            windows_sdk: "10.0.18362.0"
            cmake_generator: "Visual Studio 16 2019"
            cmake_generator_platform: "x64"
    runs-on: ${{ matrix.runner }}
    env:
      CMAKE_GENERATOR: ${{ matrix.cmake_generator }}
      CMAKE_GENERATOR_PLATFORM: ${{ matrix.cmake_generator_platform }}
      CMAKE_GENERATOR_TOOLSET: "host=x64"
      CMAKE_SYSTEM_VERSION: ${{ matrix.windows_sdk }}
    steps:
    - name: "Clone"
      uses: actions/checkout@v2
      with:
        submodules: recursive
        fetch-depth: 0
    - name: "libobs: Cache"
      uses: actions/cache@v2
      with:
        path: |
          build/temp/libobs-download
          build/temp/libobs-build
          build/temp/libobs-src
        key: libobs-${{ matrix.id }}-${{ env.OBS_VERSION }}-${{ env.DOWNLOAD_OBS_HASH }}-${{ secrets.CACHE_VERSION }}
    - name: "obsdeps: Cache"
      uses: actions/cache@v2
      with:
        path: |
          build/temp/obsdeps-download
          build/temp/obsdeps-build
          build/temp/obsdeps-src
        key: obsdeps-${{ matrix.id }}-${{ env.OBSDEPS_VERSION }}-${{ env.DOWNLOAD_OBSDEPS_HASH }}-${{ secrets.CACHE_VERSION }}
    - name: "qt: Cache"
      uses: actions/cache@v2
      with:
        path: |
          build/temp/qt-download
          build/temp/qt-build
          build/temp/qt-src
        key: qt-${{ matrix.id }}-${{ env.OBSDEPS_VERSION }}-${{ env.QT_VERSION }}-${{ secrets.CACHE_VERSION }}
    - name: "StreamFX: Configure"
      shell: bash
      run: |
        cmake -H. -B"build/temp" \
          -DCMAKE_BUILD_TYPE=RelWithDebInfo \
          -DCMAKE_INSTALL_PREFIX="build/distrib" \
          -DPACKAGE_NAME="streamfx-${{ matrix.id }}" \
          -DPACKAGE_PREFIX="build/package" \
          -DDOWNLOAD_QT=ON \
          -DDOWNLOAD_OBS_URL="https://github.com/Xaymar/obs-studio/releases/download/${{ env.OBS_VERSION }}/obs-studio-x64-0.0.0.0-windows-x86-64.7z" \
          -DDOWNLOAD_OBS_HASH="SHA256=EBF9853C8A553E16ECBCA22523F401E6CF1EB2E8DA93F1493FEF41D65BD06633" \
          -DDOWNLOAD_OBSDEPS_URL="https://github.com/Xaymar/obs-studio/releases/download/${{ env.OBSDEPS_VERSION }}/deps-windows-x86.7z" \
          -DDOWNLOAD_OBSDEPS_HASH="SHA256=B4AED165016F0B64A7E8B256CCC12EAF8AF087F61B0B239B9D3D00277485B5B5" \
          -DDOWNLOAD_QT_URL="https://github.com/Xaymar/obs-studio/releases/download/${{ env.OBSDEPS_VERSION }}/qt-${{ env.QT_VERSION }}-windows-x86-64.7z" \
          -DDOWNLOAD_QT_HASH="SHA256=109B9C21EF165B0C46DFAA9AD23124F2070ED4D74207C4AFB308183CB8D43BDD"
    - name: "StreamFX: Build"
      shell: bash
      run: |
        cmake --build "build/temp" --config RelWithDebInfo --target INSTALL
    - name: "StreamFX: Package (Install Prerequisites)"
      run: |
        curl "-kL" "https://cdn.xaymar.com/ci/innosetup-6.1.2.exe" "-f" "--retry" "5" "-o" "inno.exe"
        .\inno.exe /VERYSILENT /SP- /SUPPRESSMSGBOXES /NORESTART
    - name: "StreamFX: Package"
      shell: bash
      run: |
        mkdir build/package
        cmake --build "build/temp" --config RelWithDebInfo --target PACKAGE_7Z
        cmake --build "build/temp" --config RelWithDebInfo --target PACKAGE_ZIP
    - name: "StreamFX: Package Installer"
      run: |
        & "C:\Program Files (x86)\Inno Setup 6\ISCC.exe" /V10 ".\build\temp\installer.iss"
    - name: "Artifacts"
      uses: actions/upload-artifact@v1
      with:
        name: ${{ matrix.id }}
        path: build/package
  ubuntu:
    name: "Ubuntu 64-bit"
    strategy:
      fail-fast: true
      matrix:
        ubuntu: [ focal ]
        compiler: [ gcc, clang ]
        include:
          - ubuntu: focal
            compiler: gcc
            compiler-cxx: g++
            runner: ubuntu-20.04
            packages: gcc-9 g++9
            extra_command: sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 800 --slave /usr/bin/g++ g++ /usr/bin/g++-9
            id: ubuntu-20.04
          - ubuntu: focal
            compiler: clang
            compiler-cxx: clang++
            compiler-version: 9
            runner: ubuntu-20.04
            packages: clang-9 clang-format-9 clang-tidy-9
            extra_command: ""
            id: ubuntu-20.04-clang
    runs-on: ${{ matrix.runner }}
    env:
      CC: ${{ matrix.compiler }}
      CXX: ${{ matrix.compiler-cxx }}
      CMAKE_GENERATOR: "Ninja"
    steps:
    - name: "Clone"
      uses: actions/checkout@v2
      with:
        submodules: recursive
        fetch-depth: 0
    - name: "Prerequisites: Apt-Get"
      shell: bash
      run: |
        sudo apt-get -qq update
        sudo apt-get purge libjpeg9-dev:amd64 libjpeg8-dev:amd64 libjpeg-turbo8-dev:amd64
        sudo apt-get install \
          build-essential \
          cmake \
          ninja-build \
          git \
          qt5-default libqwt-qt5-dev libqt5svg5-dev \
          libavcodec-dev libavdevice-dev libavfilter-dev libavformat-dev libavutil-dev libswresample-dev libswscale-dev \
          libcurl4-openssl-dev \
          ${{ matrix.packages }} \
          checkinstall pkg-config
        ${{ matrix.extra_command }}
    - name: "libobs: Cache"
      uses: actions/cache@v2
      with:
        path: |
          build/temp/libobs-download
          build/temp/libobs-build
          build/temp/libobs-src
        key: libobs-${{ matrix.id }}-${{ env.OBS_VERSION }}-${{ env.DOWNLOAD_OBS_HASH }}-${{ secrets.CACHE_VERSION }}
    - name: "StreamFX: Configure"
      shell: bash
      run: |
        cmake -H. -B"build/temp" \
          -DCMAKE_BUILD_TYPE=RelWithDebInfo \
          -DCMAKE_INSTALL_PREFIX="build/distrib" \
          -DENABLE_FILTER_NVIDIA_FACE_TRACKING=FALSE \
          -DPACKAGE_NAME="streamfx-${{ matrix.id }}" \
          -DPACKAGE_PREFIX="build/package" \
          -DDOWNLOAD_OBS_URL="https://github.com/Xaymar/obs-studio/releases/download/${{ env.OBS_VERSION }}/obs-studio-x64-0.0.0.0-ubuntu-x86-64.7z" \
          -DDOWNLOAD_OBS_HASH="SHA256=0AF6C7262C37D80C24CB18523A851FD765C04E766D8EB0F4AC0F6E75D13A035F"
    - name: "StreamFX: Build"
      shell: bash
      run: |
        cmake --build "build/temp" --config RelWithDebInfo --target install
    - name: "StreamFX: Package"
      shell: bash
      run: |
        mkdir build/package
        cmake --build "build/temp" --config RelWithDebInfo --target PACKAGE_7Z
        cmake --build "build/temp" --config RelWithDebInfo --target PACKAGE_ZIP
    - name: "Artifacts"
      uses: actions/upload-artifact@v1
      with:
        name: ${{ matrix.id }}
        path: build/package
  macos:
    strategy:
      fail-fast: true
      matrix:
        runner: [ macos-latest ]
        include:
          - runner: macos-latest
            id: macos-10.15
            target-version: "10.15"
    name: "MacOS (${{ matrix.target-version }})"
    runs-on: ${{ matrix.runner }}
    env:
      CMAKE_GENERATOR: "Xcode"
      CMAKE_OSX_DEPLOYMENT_TARGET: "${{ matrix.target-version }}"
    steps:
    - name: "Clone"
      uses: actions/checkout@v2
      with:
        submodules: recursive
        fetch-depth: 0
    - name: "libobs: Cache"
      uses: actions/cache@v2
      with:
        path: |
          build/temp/libobs-download
          build/temp/libobs-build
          build/temp/libobs-src
        key: libobs-${{ matrix.id }}-${{ env.OBS_VERSION }}-${{ env.DOWNLOAD_OBS_HASH }}-${{ secrets.CACHE_VERSION }}
    - name: "obsdeps: Cache"
      uses: actions/cache@v2
      with:
        path: |
          build/temp/obsdeps-download
          build/temp/obsdeps-build
          build/temp/obsdeps-src
        key: obsdeps-${{ matrix.id }}-${{ env.OBSDEPS_VERSION }}-${{ env.DOWNLOAD_OBSDEPS_HASH }}-${{ secrets.CACHE_VERSION }}
    - name: "qt: Cache"
      uses: actions/cache@v2
      id: qt-cache
      with:
        path: |
          /usr/local/Cellar/qt@5
        key: qt-${{ matrix.id }}-${{ env.QT_VERSION }}-${{ secrets.CACHE_VERSION }}
    - name: "qt: Install"
      if: "steps.qt-cache.outputs.cache-hit != 'true'"
      shell: bash
      run: |
        brew install qt@5
    - name: "StreamFX: Configure"
      shell: bash
      run: |
        cmake -H. -B"build/temp" \
          -DCMAKE_BUILD_TYPE=RelWithDebInfo \
          -DCMAKE_INSTALL_PREFIX="build/distrib" \
          -DPACKAGE_NAME="streamfx-${{ matrix.id }}" \
          -DPACKAGE_PREFIX="build/package" \
          -DQt5_DIR=$(brew --prefix)/Cellar/qt@5/${{ env.QT_VERSION }}/lib/cmake/Qt5 \
          -DDOWNLOAD_OBS_URL="https://github.com/Xaymar/obs-studio/releases/download/${{ env.OBS_VERSION }}/obs-studio-x64-0.0.0.0-macos-x86-64.7z" \
          -DDOWNLOAD_OBS_HASH="SHA256=F15BC4CA8EB3F581A94372759CFE554E30D202B604B541445A5756B878E4E799" \
          -DDOWNLOAD_OBSDEPS_URL="https://github.com/Xaymar/obs-studio/releases/download/${{ env.OBSDEPS_VERSION }}/deps-macos-x86_64-2021-03-25.tar.gz" \
          -DDOWNLOAD_OBSDEPS_HASH="SHA256=1C409374BCAB9D5CEEAFC121AA327E13AB222096718AF62F2648302DF62898D6"
    - name: "StreamFX: Build"
      shell: bash
      run: |
        cmake --build "build/temp" --config RelWithDebInfo --target install
    - name: "StreamFX: Package"
      shell: bash
      run: |
        mkdir build/package
        cmake --build "build/temp" --config RelWithDebInfo --target PACKAGE_7Z
        cmake --build "build/temp" --config RelWithDebInfo --target PACKAGE_ZIP
    - name: 'Packages: Install'
      shell: bash
      run: |
        curl -L -O http://s.sudre.free.fr/Software/files/Packages.dmg
        sudo hdiutil attach ./Packages.dmg
        sudo installer -pkg /Volumes/Packages\ 1.2.9/Install\ Packages.pkg -target /
    - name: "Packages: Package"
      shell: bash
      run: |
        packagesbuild ./build/temp/installer.pkgproj
    - name: "Artifacts"
      uses: actions/upload-artifact@v1
      with:
        name: ${{ matrix.id }}
        path: build/package
