name: Build Cemu

on:
  workflow_call:
    inputs:
      next_version_major:
        required: false
        type: string
      next_version_minor:
        required: false
        type: string

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

jobs:
  build-ubuntu:
    runs-on: ubuntu-22.04
    steps:
    - name: "Checkout repo"
      uses: actions/checkout@v4
      with:
        submodules: "recursive"
        fetch-depth: 0

    - name: Setup release mode parameters
      run: |
        echo "BUILD_MODE=release" >> $GITHUB_ENV
        echo "BUILD_FLAGS=" >> $GITHUB_ENV
        echo "Build mode is release"

    - name: Setup build flags for version
      if: ${{ inputs.next_version_major != '' }}
      run: |
        echo "[INFO] Version ${{ inputs.next_version_major }}.${{ inputs.next_version_minor }}"
        echo "BUILD_FLAGS=${{ env.BUILD_FLAGS }} -DEMULATOR_VERSION_MAJOR=${{ inputs.next_version_major }} -DEMULATOR_VERSION_MINOR=${{ inputs.next_version_minor }}" >> $GITHUB_ENV

    - name: "Install system dependencies"
      run: |
        sudo apt update -qq
        sudo apt install -y clang-15 cmake freeglut3-dev libgcrypt20-dev libglm-dev libgtk-3-dev libpulse-dev libsecret-1-dev libsystemd-dev libudev-dev nasm ninja-build libbluetooth-dev

    - name: "Setup cmake"
      uses: jwlawson/actions-setup-cmake@v2
      with:
        cmake-version: '3.29.0'

    - name: "Bootstrap vcpkg"
      run: |
        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: |
        cmake -S . -B build ${{ env.BUILD_FLAGS }} -DCMAKE_BUILD_TYPE=${{ env.BUILD_MODE }} -DCMAKE_C_COMPILER=/usr/bin/clang-15 -DCMAKE_CXX_COMPILER=/usr/bin/clang++-15 -G Ninja -DCMAKE_MAKE_PROGRAM=/usr/bin/ninja
        
    - name: "Build Cemu"
      run: |
        cmake --build build
        
    - name: Prepare artifact
      run: mv bin/Cemu_release bin/Cemu
              
    - name: Upload artifact
      uses: actions/upload-artifact@v4
      with:
        name: cemu-bin-linux-x64
        path: ./bin/Cemu

  build-appimage:
    runs-on: ubuntu-22.04
    needs: build-ubuntu
    steps:
    - name: Checkout Upstream Repo
      uses: actions/checkout@v4

    - uses: actions/download-artifact@v4
      with:
        name: cemu-bin-linux-x64
        path: bin

    - name: "Install system dependencies"
      run: |
        sudo apt update -qq
        sudo apt install -y clang-15 cmake freeglut3-dev libgcrypt20-dev libglm-dev libgtk-3-dev libpulse-dev libsecret-1-dev libsystemd-dev nasm ninja-build appstream libbluetooth-dev

    - name: "Build AppImage"
      run: |
        export LD_LIBRARY_PATH="/usr/local/lib:$LD_LIBRARY_PATH"
        export DEPLOY_GTK_VERSION=3
        dist/linux/appimage.sh

    - name: Upload artifact
      uses: actions/upload-artifact@v4
      with:
        name: cemu-appimage-x64
        path: artifacts

  build-windows:
    runs-on: windows-2022
    steps:
    - name: "Checkout repo"
      uses: actions/checkout@v4
      with:
        submodules: "recursive"

    - name: Setup release mode parameters
      run: |
        echo "BUILD_MODE=release" | 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 release"

    - name: Setup build flags for version
      if: ${{ inputs.next_version_major != '' }}
      run: |
        echo "[INFO] Version ${{ inputs.next_version_major }}.${{ inputs.next_version_minor }}"
        echo "BUILD_FLAGS=${{ env.BUILD_FLAGS }} -DEMULATOR_VERSION_MAJOR=${{ inputs.next_version_major }} -DEMULATOR_VERSION_MINOR=${{ inputs.next_version_minor }}" | Out-File -FilePath $Env:GITHUB_ENV -Encoding utf8 -Append

    - name: "Setup cmake"
      uses: jwlawson/actions-setup-cmake@v2
      with:
        cmake-version: '3.29.0'

    - 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
        echo "[INFO] BUILD_FLAGS: ${{ env.BUILD_FLAGS }}"
        echo "[INFO] BUILD_MODE: ${{ env.BUILD_MODE }}"
        cmake .. ${{ env.BUILD_FLAGS }} -DCMAKE_BUILD_TYPE=${{ env.BUILD_MODE }} -DVCPKG_INSTALL_OPTIONS="--clean-after-build"
        
    - name: "Build Cemu"
      run: |
        cd build
        cmake --build . --config ${{ env.BUILD_MODE }}

    - name: Prepare artifact
      run: Rename-Item bin/Cemu_release.exe Cemu.exe
      
    - name: Upload artifact
      uses: actions/upload-artifact@v4
      with:
        name: cemu-bin-windows-x64
        path: ./bin/Cemu.exe

  build-macos:
    runs-on: macos-14
    steps:
    - name: "Checkout repo"
      uses: actions/checkout@v4
      with:
        submodules: "recursive"
        
    - name: Setup release mode parameters
      run: |
        echo "BUILD_MODE=release" >> $GITHUB_ENV
        echo "BUILD_FLAGS=" >> $GITHUB_ENV
        echo "Build mode is release"

    - name: Setup build flags for version
      if: ${{ inputs.next_version_major != '' }}
      run: |
        echo "[INFO] Version ${{ inputs.next_version_major }}.${{ inputs.next_version_minor }}"
        echo "BUILD_FLAGS=${{ env.BUILD_FLAGS }} -DEMULATOR_VERSION_MAJOR=${{ inputs.next_version_major }} -DEMULATOR_VERSION_MINOR=${{ inputs.next_version_minor }}" >> $GITHUB_ENV
        
    - name: "Install system dependencies"
      run: |
        brew update
        brew install ninja nasm automake libtool

    - name: "Install molten-vk"
      run: |
        curl -L -O https://github.com/KhronosGroup/MoltenVK/releases/download/v1.2.9/MoltenVK-macos.tar
        tar xf MoltenVK-macos.tar
        sudo mkdir -p /usr/local/lib
        sudo cp MoltenVK/MoltenVK/dynamic/dylib/macOS/libMoltenVK.dylib /usr/local/lib

    - name: "Setup cmake"
      uses: jwlawson/actions-setup-cmake@v2
      with:
        cmake-version: '3.29.0'

    - name: "Bootstrap vcpkg"
      run: |
        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: |
        mkdir build
        cd build
        cmake .. ${{ env.BUILD_FLAGS }} \
        -DCMAKE_BUILD_TYPE=${{ env.BUILD_MODE }} \
        -DCMAKE_OSX_ARCHITECTURES=x86_64 \
        -DMACOS_BUNDLE=ON \
        -G Ninja
        
    - name: "Build Cemu"
      run: |
        cmake --build build

    - name: Prepare artifact
      run: |
        mkdir bin/Cemu_app
        mv bin/Cemu_release.app bin/Cemu_app/Cemu.app
        mv bin/Cemu_app/Cemu.app/Contents/MacOS/Cemu_release bin/Cemu_app/Cemu.app/Contents/MacOS/Cemu
        sed -i '' 's/Cemu_release/Cemu/g' bin/Cemu_app/Cemu.app/Contents/Info.plist
        chmod a+x bin/Cemu_app/Cemu.app/Contents/MacOS/{Cemu,update.sh}
        ln -s /Applications bin/Cemu_app/Applications
        hdiutil create ./bin/tmp.dmg -ov -volname "Cemu" -fs HFS+ -srcfolder "./bin/Cemu_app"
        hdiutil convert ./bin/tmp.dmg -format UDZO -o bin/Cemu.dmg
        rm bin/tmp.dmg
              
    - name: Upload artifact
      uses: actions/upload-artifact@v4
      with:
        name: cemu-bin-macos-x64
        path: ./bin/Cemu.dmg
