name: Build Cemu

on:
  pull_request_target:
    types:
      - opened
      - synchronize
      - reopened
  push:
    branches:
      - main
  workflow_call:
    inputs:
      deploymode:
        required: false
        type: string

env:
  VCPKG_ROOT: "${{github.workspace}}/dependencies/vcpkg"
  VCPKG_BINARY_SOURCES: 'clear;nuget,GitHub,readwrite'

jobs:
  build-ubuntu:
    runs-on: ubuntu-20.04
    env:
      install_vulkan_folder: "$GITHUB_WORKSPACE/vulkan_sdk"
      install_vulkan_version: "1.3.216.0"
    steps:
    - name: "Checkout repo"
      uses: actions/checkout@v3
      with:
        submodules: "recursive"
        
    - name: Setup release mode parameters (for deploy)
      if: ${{ inputs.deploymode == 'release' }}
      run: |
        echo "BUILD_MODE=release" >> $GITHUB_ENV
        echo "BUILD_FLAGS=-DPUBLIC_RELEASE=ON" >> $GITHUB_ENV
        echo "Build mode is release"

    - name: Setup debug mode parameters (for continous build)
      if: ${{ inputs.deploymode != 'release' }}
      run: |
        echo "BUILD_MODE=debug" >> $GITHUB_ENV
        echo "BUILD_FLAGS=" >> $GITHUB_ENV
        echo "Build mode is debug"
        
    - name: "Install system dependencies"
      run: |
        sudo apt update -qq
        sudo apt install -y ninja-build cmake libgtk-3-dev libsecret-1-dev libgcrypt20-dev libsystemd-dev freeglut3-dev clang-12 nasm
        wget https://sdk.lunarg.com/sdk/download/${{ env.install_vulkan_version }}/linux/vulkansdk-linux-x86_64-${{ env.install_vulkan_version }}.tar.gz -q -O vulkansdk.tar.gz
        mkdir -p "${{ env.install_vulkan_folder }}"
        tar -xf vulkansdk.tar.gz --directory ${{ env.install_vulkan_folder }}

    - name: "Bootstrap vcpkg"
      run: |
        export VULKAN_SDK="${{ env.install_vulkan_folder }}/${{ env.install_vulkan_version }}/x86_64"
        bash ./dependencies/vcpkg/bootstrap-vcpkg.sh
        
    - name: 'Setup NuGet Credentials for vcpkg'
      shell: 'bash'
      run: |
        mono `./dependencies/vcpkg/vcpkg fetch nuget | tail -n 1` \
        sources add \
        -source "https://nuget.pkg.github.com/${{ github.repository_owner }}/index.json" \
        -storepasswordincleartext \
        -name "GitHub" \
        -username "${{ github.repository_owner }}" \
        -password "${{ secrets.GITHUB_TOKEN }}"
        mono `./dependencies/vcpkg/vcpkg fetch nuget | tail -n 1` \
        setapikey "${{ secrets.GITHUB_TOKEN }}" \
        -source "https://nuget.pkg.github.com/${{ github.repository_owner }}/index.json"
        
    - name: "cmake"
      run: |
        export VULKAN_SDK="${{ env.install_vulkan_folder }}/${{ env.install_vulkan_version }}/x86_64"
        mkdir -p build
        cd build
        cmake .. ${{ env.BUILD_FLAGS }} -DCMAKE_BUILD_TYPE=${{ env.BUILD_MODE }} -DCMAKE_C_COMPILER=/usr/bin/clang-12 -DCMAKE_CXX_COMPILER=/usr/bin/clang++-12 -G Ninja -DCMAKE_MAKE_PROGRAM=/usr/bin/ninja
        
    - name: "Build Cemu"
      run: |
        cd build
        ninja
        
    - name: Upload artifact
      uses: actions/upload-artifact@v3
      if: ${{ inputs.deploymode == 'release' }}
      with:
        name: cemu-bin-linux-x64
        path: ./bin/Cemu
        
        
  build-windows:
    runs-on: windows-2022
    env:
      install_vulkan_folder: "$GITHUB_WORKSPACE/vulkan_sdk"
      install_vulkan_version: "1.3.216.0"
    steps:
    - name: "Checkout repo"
      uses: actions/checkout@v3
      with:
        submodules: "recursive"
        
    - name: Setup release mode parameters (for deploy)
      if: ${{ inputs.deploymode == 'release' }}
      run: |
        echo "BUILD_MODE=release" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append
        echo "BUILD_FLAGS=-DPUBLIC_RELEASE=ON" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append
        echo "Build mode is release"
        
    - name: Setup debug mode parameters (for continous build)
      if: ${{ inputs.deploymode != 'release' }}
      run: |
        echo "BUILD_MODE=debug" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append
        echo "BUILD_FLAGS=" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append
        echo "Build mode is debug"
        
    - name: Prepare Vulkan SDK
      uses: humbletim/setup-vulkan-sdk@v1.2.0
      with:
        vulkan-query-version: 1.3.216.0
        vulkan-components: Vulkan-Headers, Vulkan-Loader
        vulkan-use-cache: false
    
    - name: Workaround
      run: |
        Set-Location "C:\Program Files (x86)\Microsoft Visual Studio\Installer\"
        $InstallPath = "C:\Program Files\Microsoft Visual Studio\2022\Enterprise"
        $componentsToRemove= @(
          "Microsoft.VisualStudio.Component.VC.14.32.17.2.ARM"
          "Microsoft.VisualStudio.Component.VC.14.32.17.2.ARM.Spectre"
          "Microsoft.VisualStudio.Component.VC.14.32.17.2.ARM64"
          "Microsoft.VisualStudio.Component.VC.14.32.17.2.ARM64.Spectre"
          "Microsoft.VisualStudio.Component.VC.14.32.17.2.x86.x64"
          "Microsoft.VisualStudio.Component.VC.14.32.17.2.x86.x64.Spectre"
          "Microsoft.VisualStudio.Component.VC.14.32.17.2.ATL"
          "Microsoft.VisualStudio.Component.VC.14.32.17.2.ATL.Spectre"
          "Microsoft.VisualStudio.Component.VC.14.32.17.2.ATL.ARM"
          "Microsoft.VisualStudio.Component.VC.14.32.17.2.ATL.ARM.Spectre"
          "Microsoft.VisualStudio.Component.VC.14.32.17.2.ATL.ARM64"
          "Microsoft.VisualStudio.Component.VC.14.32.17.2.ATL.ARM64.Spectre"
          "Microsoft.VisualStudio.Component.VC.14.32.17.2.MFC"
          "Microsoft.VisualStudio.Component.VC.14.32.17.2.MFC.Spectre"
          "Microsoft.VisualStudio.Component.VC.14.32.17.2.MFC.ARM"
          "Microsoft.VisualStudio.Component.VC.14.32.17.2.MFC.ARM.Spectre"
          "Microsoft.VisualStudio.Component.VC.14.32.17.2.MFC.ARM64"
          "Microsoft.VisualStudio.Component.VC.14.32.17.2.MFC.ARM64.Spectre"
        )
        [string]$workloadArgs = $componentsToRemove | ForEach-Object {" --remove " +  $_}
        $Arguments = ('/c', "vs_installer.exe", 'modify', '--installPath', "`"$InstallPath`"",$workloadArgs, '--quiet', '--norestart', '--nocache')
        # should be run twice
        $process = Start-Process -FilePath cmd.exe -ArgumentList $Arguments -Wait -PassThru -WindowStyle Hidden
        $process = Start-Process -FilePath cmd.exe -ArgumentList $Arguments -Wait -PassThru -WindowStyle Hidden

    - name: Configure MSVC
      uses: ilammy/msvc-dev-cmd@v1
      with:
        arch: amd64
        toolset: 14.33.31629
        spectre: false

    - name: "Bootstrap vcpkg"
      run: |
        ./dependencies/vcpkg/bootstrap-vcpkg.bat
        
    - name: 'Setup NuGet Credentials for vcpkg'
      shell: 'bash'
      run: |
        `./dependencies/vcpkg/vcpkg.exe fetch nuget | tail -n 1` \
        sources add \
        -source "https://nuget.pkg.github.com/${{ github.repository_owner }}/index.json" \
        -storepasswordincleartext \
        -name "GitHub" \
        -username "${{ github.repository_owner }}" \
        -password "${{ secrets.GITHUB_TOKEN }}"
        `./dependencies/vcpkg/vcpkg.exe fetch nuget | tail -n 1` \
        setapikey "${{ secrets.GITHUB_TOKEN }}" \
        -source "https://nuget.pkg.github.com/${{ github.repository_owner }}/index.json"
        
    - name: "cmake"
      run: |
        mkdir -p build
        cd build
        cmake .. ${{ env.BUILD_FLAGS }} -DCMAKE_BUILD_TYPE=${{ env.BUILD_MODE }}
        
    - name: "Free up space"
      run: |
        Remove-Item './dependencies/vcpkg/downloads' -Recurse
        
    - name: "Build Cemu"
      run: |
        cd build
        cmake --build . --config ${{ env.BUILD_MODE }} -j 2
        
    - name: Upload artifact
      uses: actions/upload-artifact@v3
      if: ${{ inputs.deploymode == 'release' }}
      with:
        name: cemu-bin-windows-x64
        path: ./bin/Cemu.exe
