name: Build

on: push

jobs:
  build:
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        include:
          - description: Windows - Visual Studio
            os: windows-2019
            cmakeOptions: '-G "Visual Studio 16 2019" -A x64'
            publish: true
          - description: macOS - Xcode
            os: macos-13
            cmakeOptions: ""
            publish: true
          - description: Linux - GCC
            os: ubuntu-20.04
            cmakeOptions: "-D CMAKE_C_COMPILER=gcc-10 -D CMAKE_CXX_COMPILER=g++-10"
            publish: true
          - description: Linux - Clang
            os: ubuntu-20.04
            cmakeOptions: "-D CMAKE_C_COMPILER=clang-12 -D CMAKE_CXX_COMPILER=clang++-12"
            publish: false
    env:
      BOOST_ROOT: ${{ github.workspace }}/lib/boost
      BOOST_URL: https://sourceforge.net/projects/boost/files/boost/1.86.0/boost_1_86_0.tar.bz2/download
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          lfs: true
      - name: Restore Boost from cache
        uses: actions/cache@v4
        id: cache-boost
        with:
          path: ${{ env.BOOST_ROOT }}
          key: ${{ env.BOOST_URL }}
      - name: Download Boost
        if: steps.cache-boost.outputs.cache-hit != 'true'
        shell: bash
        run: |
          if [ "$RUNNER_OS" == "Windows" ]; then
            # use forward slashes only
            BOOST_ROOT=$(echo $BOOST_ROOT | sed 's/\\/\//g')
          fi
          mkdir -p $BOOST_ROOT
          curl --insecure -L $BOOST_URL | tar -xj --strip-components=1 -C $BOOST_ROOT
      - name: Build Rhubarb
        shell: bash
        run: |
          JAVA_HOME=$JAVA_HOME_11_X64
          mkdir build
          cd build
          cmake ${{ matrix.cmakeOptions }} ..
          cmake --build . --config Release --target package
      - name: Run tests
        shell: bash
        run: |
          if [ "$RUNNER_OS" == "Windows" ]; then
            ./build/rhubarb/Release/runTests.exe
          else
            ./build/rhubarb/runTests
          fi
      - name: Upload artifacts
        if: ${{ matrix.publish }}
        uses: actions/upload-artifact@v4
        with:
          name: ${{ matrix.description }}
          path: build/*.zip
  release:
    needs: build
    runs-on: ubuntu-latest
    if: startsWith(github.ref, 'refs/tags/v')
    steps:
      - name: Download artifacts
        uses: actions/download-artifact@v4
      - name: Create GitHub release draft
        uses: softprops/action-gh-release@v2
        with:
          draft: true
          files: "*.zip"
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}