name: build

on:
  push:
    branches:
      - '*'
  pull_request:
    branches:
      - '*'
env:
  CACHE_VERSION: 20230704
  PAWPAW_VERSION: 6a3c6a65a89abe221858c3f7635140074506bfc3
  PAWPAW_SKIP_LTO: 1
  PAWPAW_SKIP_GLIB: 1
  PAWPAW_SKIP_LV2: 1

jobs:
  macos:
    strategy:
      matrix:
        target: [intel, universal]
    runs-on: macos-11
    steps:
    - uses: actions/checkout@v3
      with:
        submodules: recursive
    - name: Set up cache
      uses: actions/cache@v3
      with:
        path: |
          ~/PawPawBuilds
        key: macos-${{ matrix.target }}-v${{ env.CACHE_VERSION }}
    - name: Set up dependencies
      run: |
        brew install cmake jq meson
    - name: Bootstrap dependencies
      shell: bash
      run: |
        if [ ! -d PawPaw ]; then
          git clone https://github.com/DISTRHO/PawPaw.git
          git -C PawPaw checkout ${PAWPAW_VERSION}
        fi
        ./PawPaw/bootstrap-jack2.sh macos-${{ matrix.target }} && ./PawPaw/.cleanup.sh macos-${{ matrix.target }}
    - name: Build jack2
      shell: bash
      run: |
        pushd PawPaw && source local.env macos-${{ matrix.target }} && popd
        python ./waf configure --platform=darwin --prefix=/usr/local
        python ./waf build -j $(sysctl -n hw.logicalcpu)
        python ./waf install --destdir=$(pwd)/destdir
    - name: Set sha8 (non-release)
      if: startsWith(github.ref, 'refs/tags/') != true
      run: echo "SHA8=$(echo ${{ github.sha }} | cut -c1-8)" >> $GITHUB_ENV
    - name: Set sha8 (release)
      if: startsWith(github.ref, 'refs/tags/')
      run: echo "SHA8=$(echo ${{ github.ref_name }})" >> $GITHUB_ENV
    - name: Generate macOS package
      shell: bash
      run: |
        ./macosx/generate-pkg.sh $(pwd)/destdir/usr/local ${{ github.event.pull_request.number || env.SHA8 }}
    - uses: actions/upload-artifact@v3
      with:
        name: jack2-macOS-${{ matrix.target }}-${{ github.event.pull_request.number || env.SHA8 }}
        path: macosx/jack2-osx-*.pkg

  windows:
    strategy:
      matrix:
        target: [win32, win64]
    runs-on: ubuntu-22.04
    steps:
    - uses: actions/checkout@v3
      with:
        submodules: recursive
    - name: Set up cache
      uses: actions/cache@v3
      with:
        path: |
          ~/PawPawBuilds
        key: ${{ matrix.target }}-v${{ env.CACHE_VERSION }}
    - name: Restore debian packages cache
      run: |
        if [ -d ~/PawPawBuilds/debs ] && [ "$(ls ~/PawPawBuilds/debs | wc -l)" -ne 0 ]; then \
          sudo cp ~/PawPawBuilds/debs/*.deb /var/cache/apt/archives/; \
        fi
    - name: Fix GitHub's mess
      run: |
        sudo rm -f /etc/apt/sources.list.d/microsoft-prod.list
        sudo dpkg --add-architecture i386
        sudo apt-get update -qq
        sudo apt-get install -yqq --allow-downgrades libc6:i386 libgcc-s1:i386 libstdc++6:i386
    - name: Set up dependencies
      if: ${{ matrix.target == 'win32' }}
      run: |
        sudo apt-get install -y autopoint build-essential curl cmake jq llvm mingw-w64 xvfb \
          binutils-mingw-w64-i686 g++-mingw-w64-i686 mingw-w64 wine-stable:i386
    - name: Set up dependencies
      if: ${{ matrix.target == 'win64' }}
      run: |
        sudo apt-get install -y autopoint build-essential curl cmake jq llvm mingw-w64 xvfb \
          binutils-mingw-w64-x86-64 g++-mingw-w64-x86-64 mingw-w64 wine-stable
    - name: Cache debian packages
      run: |
        mkdir -p ~/PawPawBuilds/debs && \
        sudo mv /var/cache/apt/archives/*.deb ~/PawPawBuilds/debs/
    - name: Bootstrap dependencies
      shell: bash
      run: |
        if [ ! -d PawPaw ]; then
          git clone https://github.com/DISTRHO/PawPaw.git
          git -C PawPaw checkout ${PAWPAW_VERSION}
        fi
        ./PawPaw/bootstrap-jack2.sh ${{ matrix.target }} && ./PawPaw/.cleanup.sh ${{ matrix.target }}
    - name: Build jack2
      shell: bash
      run: |
        pushd PawPaw && source local.env ${{ matrix.target }} && popd
        export PATH+=":/usr/i686-w64-mingw32/bin"
        export LDFLAGS+="-L~/PawPawBuilds/targets/win64/lib32"
        ./waf configure --platform=win32 --prefix=$(pwd)/destdir --static ${{ matrix.target == 'win64' && '--mixed' || '' }}
        ./waf build -j $(nproc)
        ./waf install
    - name: Generate MSVC lib files
      if: ${{ matrix.target == 'win32' }}
      run: |
        pushd $(pwd)/destdir/lib
        llvm-dlltool -m i386 -D libjack.dll -d libjack.def -l libjack.lib
        llvm-dlltool -m i386 -D libjacknet.dll -d libjacknet.def -l libjacknet.lib
        llvm-dlltool -m i386 -D libjackserver.dll -d libjackserver.def -l libjackserver.lib
        popd
    - name: Generate MSVC lib files
      if: ${{ matrix.target == 'win64' }}
      run: |
        # 32bit
        pushd $(pwd)/destdir/lib32
        llvm-dlltool -m i386 -D libjack.dll -d libjack.def -l libjack.lib
        popd
        # 64bit
        pushd $(pwd)/destdir/lib
        llvm-dlltool -m i386:x86-64 -D libjack64.dll -d libjack64.def -l libjack64.lib
        llvm-dlltool -m i386:x86-64 -D libjacknet64.dll -d libjacknet64.def -l libjacknet64.lib
        llvm-dlltool -m i386:x86-64 -D libjackserver64.dll -d libjackserver64.def -l libjackserver64.lib
        popd
    - name: Set sha8 (non-release)
      if: startsWith(github.ref, 'refs/tags/') != true
      run: echo "SHA8=$(echo ${{ github.sha }} | cut -c1-8)" >> $GITHUB_ENV
    - name: Set sha8 (release)
      if: startsWith(github.ref, 'refs/tags/')
      run: echo "SHA8=$(echo ${{ github.ref_name }})" >> $GITHUB_ENV
    - name: Generate Windows installer
      shell: bash
      run: |
        # Setup wine
        export WINEDLLOVERRIDES="mscoree,mshtml="
        export WINEPREFIX=$(pwd)/innosetup
        xvfb-run wineboot -u
        # Download and install innosetup
        curl -L https://jrsoftware.org/download.php/is.exe?site=2 -o is.exe
        xvfb-run wine is.exe /allusers /dir=C:\\InnoSeup /nocancel /norestart /verysilent
        # create installer
        ln -sf $(pwd)/destdir windows/inno/${{ matrix.target }}
        pushd windows/inno
        echo "#define VERSION \"${{ github.event.pull_request.number || env.SHA8 }}\"" > version.iss
        xvfb-run wine ${WINEPREFIX}/drive_c/InnoSeup/ISCC.exe ${{ matrix.target }}-mini.iss
        popd
    - uses: actions/upload-artifact@v3
      with:
        name: jack2-${{ matrix.target }}-${{ github.event.pull_request.number || env.SHA8 }}
        path: windows/inno/jack2-*.exe
