name: build-linux-wheels

on:
  workflow_dispatch:

env:
  PYTHONUNBUFFERED: 1
  WXPYTHON_BUILD_ARGS: '--release'

jobs:
  # Build a wxPython source archive, and save it as an artifact for use in the
  # job that builds the wheels.
  build-source-dist:
    runs-on: ubuntu-22.04

    outputs:
      VERSION: ${{ steps.generate.outputs.version }}

    steps:
      - name: Checkout repo
        uses: actions/checkout@v4
        with:
          submodules: 'recursive'
          fetch-depth: 0

      - name: Set up Python 3.10
        uses: actions/setup-python@v5
        with:
          python-version: '3.10'
          cache: 'pip'

      - name: Install dependencies
        run: |
          sudo apt-get install -y gettext
          python -m pip install --upgrade -r requirements.txt

      - name: Generate wrapper code
        id: generate
        run: |
          python build.py setrev dox etg sip --nodoc
          VERSION=$(python build.py --quiet version)
          echo "version=$VERSION" >> "$GITHUB_OUTPUT"

      - name: Create source distribution (sdist)
        run: |
          python build.py sdist

      - name: Save sdist as job artifact
        uses: actions/upload-artifact@v4
        with:
          name: wxPython-source
          path: dist/wxPython-${{ steps.generate.outputs.version }}.tar.gz

  build-wheels:
    # wait for prior job to complete
    needs: build-source-dist
    strategy:
      fail-fast: false
      matrix:
        os: [ ubuntu-20.04, ubuntu-22.04, ubuntu-24.04 ]
        python-version: [ '3.9', '3.10', '3.11', '3.12', '3.13' ]
        architecture: [ 'x64' ]

    env:
      VERSION: ${{ needs.build-source-dist.outputs.VERSION }}

    runs-on: ${{ matrix.os }}

    outputs:
      short_name: ${{ steps.init.outputs.short_name }}
      canonical_id: ${{ steps.init.outputs.canonical_id }}

    steps:
      - name: initialize variables
        id: init
        run: |
          build_opts=$WXPYTHON_BUILD_ARGS
          short_name=linux
          echo "short_name=$short_name" >> "$GITHUB_OUTPUT"
          echo "canonical_id=$short_name-py${{ matrix.python-version }}-${{ matrix.architecture}}" >> "$GITHUB_OUTPUT"
          echo "build_opts=$build_opts" >> "$GITHUB_OUTPUT"

      - name: Checkout repo
        uses: actions/checkout@v4
        with:
          submodules: 'recursive'

      - name: download CI source artifact
        uses: actions/download-artifact@v4
        with:
          name: wxPython-source
          path: dist

      - name: Set up Python ${{ matrix.python-version }}-${{ matrix.architecture }}
        uses: actions/setup-python@v5
        with:
          python-version: '${{ matrix.python-version }}'
          architecture: '${{ matrix.architecture }}'
          cache: 'pip'

      - name: Install Python dependencies
        run: |
          python -m pip install --upgrade -r requirements.txt

      - name: Install Ubuntu dependencies
        run: |
          ./buildtools/install_depends.sh

      - name: Build the wxPython wheel
        env:
          WXPYTHON_BUILD_ARGS: ${{ steps.init.outputs.build_opts }}
        run: |
          cd dist
          pip wheel -v wxPython-${{ env.VERSION }}.tar.gz

      - name: Simple smoke test
        run: |
          cd dist
          pip install wxPython-*.whl
          python -c "import wx; print(wx); print(wx.version()); print(wx.PlatformInfo)"
          pip uninstall --yes wxPython

      - name: Save wheel as job artifact
        uses: actions/upload-artifact@v4
        with:
          name: wxPython-wheel-${{ matrix.os }}-${{ steps.init.outputs.canonical_id }}
          path: dist/wxPython-*.whl

  upload-wheels-to-extras:
    name: Upload wheels to extras on wxpython.org
    needs: build-wheels
    strategy:
      fail-fast: false
      matrix:
        os: [ ubuntu-20.04, ubuntu-22.04, ubuntu-24.04 ]
    runs-on: ${{ matrix.os }}

    steps:
    - name: Download all the dists
      uses: actions/download-artifact@v4
      with:
        pattern: wxPython-wheel-${{ matrix.os }}-*
        path: dist/
        merge-multiple: true
    - name: Install SSH key
      uses: shimataro/ssh-key-action@v2
      with:
        key: ${{ secrets.RIOBU_SSH_KEY }}
        known_hosts: ${{ secrets.RIOBU_KNOWN_HOSTS }}
    - name: SCP wheels
      run: |
        scp -p dist/* rbot.wxpython@riobu.com:wxpython-extras/htdocs/wxPython4/extras/linux/gtk3/${{ matrix.os }}/
