209 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			YAML
		
	
	
			
		
		
	
	
			209 lines
		
	
	
		
			7.4 KiB
		
	
	
	
		
			YAML
		
	
	
# This workflow builds the Python wheels using cibuildwheel and uploads them to TestPyPI.
 | 
						|
# It can be triggered on push to the develop branch or manually via Github Actions.
 | 
						|
 | 
						|
name: Build Wheels (cibuildwheel)
 | 
						|
 | 
						|
on:
 | 
						|
  push:
 | 
						|
    branches:
 | 
						|
      - develop
 | 
						|
  workflow_dispatch:
 | 
						|
 | 
						|
jobs:
 | 
						|
  # Get the system time and store it in an output. This is used to tag the wheels.
 | 
						|
  # This needs to be done in a separate job so that each matrix job in build_wheels can
 | 
						|
  # access the same timestamp.
 | 
						|
  get_system_time:
 | 
						|
    name: Get System Time
 | 
						|
    runs-on: ubuntu-latest
 | 
						|
    outputs:
 | 
						|
      timestamp: ${{ steps.get_time.outputs.timestamp }}
 | 
						|
    steps:
 | 
						|
      - name: Get system time
 | 
						|
        id: get_time
 | 
						|
        run: echo "timestamp=$(date +'%Y%m%d%H%M')" >> "$GITHUB_OUTPUT"
 | 
						|
 | 
						|
  build_wheels:
 | 
						|
    name: Build Wheels
 | 
						|
    needs: get_system_time
 | 
						|
    runs-on: ${{ matrix.os }}
 | 
						|
    strategy:
 | 
						|
      fail-fast: false
 | 
						|
      matrix:
 | 
						|
        include:
 | 
						|
          # Linux x86_64
 | 
						|
          - os: ubuntu-latest
 | 
						|
            python_version: "3.10"
 | 
						|
            cibw_python_version: 310
 | 
						|
            platform_id: manylinux_x86_64
 | 
						|
            manylinux_image: manylinux2014
 | 
						|
          - os: ubuntu-latest
 | 
						|
            python_version: "3.11"
 | 
						|
            cibw_python_version: 311
 | 
						|
            platform_id: manylinux_x86_64
 | 
						|
            manylinux_image: manylinux2014
 | 
						|
          - os: ubuntu-latest
 | 
						|
            python_version: "3.12"
 | 
						|
            cibw_python_version: 312
 | 
						|
            platform_id: manylinux_x86_64
 | 
						|
            manylinux_image: manylinux2014
 | 
						|
          - os: ubuntu-latest
 | 
						|
            python_version: "3.13"
 | 
						|
            cibw_python_version: 313
 | 
						|
            platform_id: manylinux_x86_64
 | 
						|
            manylinux_image: manylinux2014
 | 
						|
 | 
						|
          # Linux aarch64
 | 
						|
          - os: ubuntu-24.04-arm
 | 
						|
            python_version: "3.10"
 | 
						|
            cibw_python_version: 310
 | 
						|
            platform_id: manylinux_aarch64
 | 
						|
            manylinux_image: manylinux2014
 | 
						|
          - os: ubuntu-24.04-arm
 | 
						|
            python_version: "3.11"
 | 
						|
            cibw_python_version: 311
 | 
						|
            platform_id: manylinux_aarch64
 | 
						|
            manylinux_image: manylinux2014
 | 
						|
          - os: ubuntu-24.04-arm
 | 
						|
            python_version: "3.12"
 | 
						|
            cibw_python_version: 312
 | 
						|
            platform_id: manylinux_aarch64
 | 
						|
            manylinux_image: manylinux2014
 | 
						|
          - os: ubuntu-24.04-arm
 | 
						|
            python_version: "3.13"
 | 
						|
            cibw_python_version: 313
 | 
						|
            platform_id: manylinux_aarch64
 | 
						|
            manylinux_image: manylinux2014
 | 
						|
 | 
						|
          # MacOS x86_64
 | 
						|
          - os: macos-13
 | 
						|
            python_version: "3.10"
 | 
						|
            cibw_python_version: 310
 | 
						|
            platform_id: macosx_x86_64
 | 
						|
          - os: macos-13
 | 
						|
            python_version: "3.11"
 | 
						|
            cibw_python_version: 311
 | 
						|
            platform_id: macosx_x86_64
 | 
						|
          - os: macos-13
 | 
						|
            python_version: "3.12"
 | 
						|
            cibw_python_version: 312
 | 
						|
            platform_id: macosx_x86_64
 | 
						|
          - os: macos-13
 | 
						|
            python_version: "3.13"
 | 
						|
            cibw_python_version: 313
 | 
						|
            platform_id: macosx_x86_64
 | 
						|
 | 
						|
          # MacOS arm64
 | 
						|
          - os: macos-14
 | 
						|
            python_version: "3.10"
 | 
						|
            cibw_python_version: 310
 | 
						|
            platform_id: macosx_arm64
 | 
						|
          - os: macos-14
 | 
						|
            python_version: "3.11"
 | 
						|
            cibw_python_version: 311
 | 
						|
            platform_id: macosx_arm64
 | 
						|
          - os: macos-14
 | 
						|
            python_version: "3.12"
 | 
						|
            cibw_python_version: 312
 | 
						|
            platform_id: macosx_arm64
 | 
						|
          - os: macos-14
 | 
						|
            python_version: "3.13"
 | 
						|
            cibw_python_version: 313
 | 
						|
            platform_id: macosx_arm64
 | 
						|
 | 
						|
    steps:
 | 
						|
      - name: Checkout
 | 
						|
        uses: actions/checkout@v4
 | 
						|
 | 
						|
      - name: Set up Python ${{ matrix.python_version }}
 | 
						|
        uses: actions/setup-python@v5
 | 
						|
        with:
 | 
						|
          python-version: ${{ matrix.python_version }}
 | 
						|
 | 
						|
      # Set the DEVELOP flag and the TIMESTAMP environment variables. This is used in the
 | 
						|
      # top-level CMakeLists.txt to generate the GTSAM_VERSION_STRING.
 | 
						|
      - name: Set Develop Flag
 | 
						|
        run: |
 | 
						|
          echo "DEVELOP=1" >> $GITHUB_ENV
 | 
						|
          echo "TIMESTAMP=${{ needs.get_system_time.outputs.timestamp }}" >> $GITHUB_ENV          
 | 
						|
 | 
						|
      - name: Install Dependencies
 | 
						|
        run: |
 | 
						|
          python3 -m pip install -r python/dev_requirements.txt
 | 
						|
          if [ "$RUNNER_OS" == "Linux" ]; then
 | 
						|
            sudo apt-get install -y wget libicu-dev python3-pip python3-setuptools libboost-all-dev ninja-build
 | 
						|
          elif [ "$RUNNER_OS" == "macOS" ]; then
 | 
						|
            brew install wget icu4c boost ninja python-setuptools
 | 
						|
          else
 | 
						|
            echo "$RUNNER_OS not supported"
 | 
						|
            exit 1
 | 
						|
          fi          
 | 
						|
 | 
						|
      # We first build the Python wrapper module on the host machine. This is done because cibuildwheel
 | 
						|
      # expects a setup.py file to be present in the project directory.
 | 
						|
      #
 | 
						|
      # The Python wrapper module is then rebuilt within the cibuildwheel container before building
 | 
						|
      # the wheels to ensure platform compatibility.
 | 
						|
      - name: Run CMake
 | 
						|
        run: |
 | 
						|
          cmake . -B build -DGTSAM_BUILD_PYTHON=1 -DGTSAM_PYTHON_VERSION=${{ matrix.python_version }}          
 | 
						|
 | 
						|
      # If on macOS, we previously installed boost using homebrew for the first build.
 | 
						|
      # We need to uninstall it before building the wheels with cibuildwheel, which will
 | 
						|
      # install boost from source.
 | 
						|
      - name: Uninstall Boost (MacOS)
 | 
						|
        if: runner.os == 'macOS'
 | 
						|
        run: |
 | 
						|
          brew uninstall boost          
 | 
						|
 | 
						|
      - name: Build and test wheels
 | 
						|
        env:
 | 
						|
          # Generate the platform identifier. See https://cibuildwheel.pypa.io/en/stable/options/#build-skip.
 | 
						|
          CIBW_BUILD: cp${{ matrix.cibw_python_version }}-${{ matrix.platform_id }}
 | 
						|
          CIBW_MANYLINUX_X86_64_IMAGE: ${{ matrix.manylinux_image }}
 | 
						|
          CIBW_MANYLINUX_AARCH64_IMAGE: ${{ matrix.manylinux_image }}
 | 
						|
          CIBW_ARCHS: all
 | 
						|
          CIBW_ENVIRONMENT_PASS_LINUX: DEVELOP TIMESTAMP
 | 
						|
 | 
						|
          # Set the minimum required MacOS version for the wheels.
 | 
						|
          MACOSX_DEPLOYMENT_TARGET: 10.15
 | 
						|
 | 
						|
          # Set DYLD_LIBRARY_PATH to REPAIR_LIBRARY_PATH, which is set in cibw_before_all.sh. REPAIR_LIBRARY_PATH
 | 
						|
          # simply appends BOOST_LIBRARYDIR to the path, which is required during during link-time repair.
 | 
						|
          CIBW_REPAIR_WHEEL_COMMAND_MACOS: DYLD_LIBRARY_PATH=$REPAIR_LIBRARY_PATH delocate-wheel --require-archs {delocate_archs} -w {dest_dir} -v {wheel}
 | 
						|
 | 
						|
          # Use build instead of pip wheel to build the wheels. This is recommended by PyPA.
 | 
						|
          # See https://cibuildwheel.pypa.io/en/stable/options/#build-frontend.
 | 
						|
          CIBW_BUILD_FRONTEND: "build"
 | 
						|
          CIBW_BEFORE_ALL: bash .github/scripts/python_wheels/cibw_before_all.sh ${{ matrix.python_version }} {project}
 | 
						|
 | 
						|
          CIBW_BUILD_VERBOSITY: 1
 | 
						|
 | 
						|
        run: bash .github/scripts/python_wheels/build_wheels.sh
 | 
						|
 | 
						|
      - name: Store artifacts
 | 
						|
        uses: actions/upload-artifact@v4
 | 
						|
        with:
 | 
						|
          name: cibw-wheels-cp${{ matrix.cibw_python_version }}-${{ matrix.platform_id }}
 | 
						|
          path: wheelhouse/*.whl
 | 
						|
 | 
						|
  upload_all:
 | 
						|
    name: Upload All
 | 
						|
    needs: build_wheels
 | 
						|
    runs-on: ubuntu-latest
 | 
						|
    permissions:
 | 
						|
      id-token: write
 | 
						|
    steps:
 | 
						|
      - name: Download Artifacts
 | 
						|
        uses: actions/download-artifact@v4
 | 
						|
        with:
 | 
						|
          path: dist/
 | 
						|
          merge-multiple: true
 | 
						|
 | 
						|
      - name: Publish to PyPI
 | 
						|
        uses: pypa/gh-action-pypi-publish@release/v1
 | 
						|
        with:
 | 
						|
          verbose: true
 | 
						|
          packages-dir: dist/
 | 
						|
          # repository-url: https://test.pypi.org/legacy/
 |