Skip to content

ci: build wheel

ci: build wheel #42

Workflow file for this run

name: Release
on:
pull_request:
branches: [ main, master, develop ]
push:
tags:
- 'v*.*.*'
workflow_dispatch:
inputs:
tag:
description: 'Tag to release (e.g., v4.2.0)'
required: true
type: string
jobs:
extract-version:
runs-on: ubuntu-latest
outputs:
version: ${{ steps.version.outputs.version }}
version_number: ${{ steps.version.outputs.version_number }}
steps:
- name: Extract version from tag
id: version
run: |
if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then
VERSION=${{ inputs.tag }}
else
VERSION=${GITHUB_REF#refs/tags/}
fi
echo "version=${VERSION}" >> $GITHUB_OUTPUT
echo "version_number=${VERSION#v}" >> $GITHUB_OUTPUT
build-wheels:
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, macos-15-intel]
runs-on: ${{ matrix.os }}
permissions:
contents: write
steps:
- name: Checkout code
uses: actions/checkout@v6
with:
submodules: recursive
- name: Install cibuildwheel
run: |
python -m pip install --upgrade pip
pip install cibuildwheel
- name: Setup Mapnik build environment
uses: ./.github/actions/setup-mapnik
- name: Build wheels
env:
CIBW_BUILD_VERBOSITY: 1
CIBW_BEFORE_BUILD: "pip install uv && uv sync --frozen --no-dev || uv sync --no-dev"
# Ensure pkg-config & mapnik-config are available during build requirements resolution.
CIBW_ENVIRONMENT_MACOS: |
PATH=/usr/local/bin:/opt/homebrew/bin:/usr/local/opt/mapnik/bin:/opt/homebrew/opt/mapnik/bin:$PATH
PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:/usr/local/share/pkgconfig:/opt/homebrew/lib/pkgconfig:/opt/homebrew/share/pkgconfig:/usr/local/opt/icu4c@78/lib/pkgconfig:/usr/local/opt/icu4c@78/share/pkgconfig:/opt/homebrew/opt/icu4c@78/lib/pkgconfig:/opt/homebrew/opt/icu4c@78/share/pkgconfig:/usr/local/opt/icu4c/lib/pkgconfig:/usr/local/opt/icu4c/share/pkgconfig:/opt/homebrew/opt/icu4c/lib/pkgconfig:/opt/homebrew/opt/icu4c/share/pkgconfig:/usr/local/opt/mapnik/lib/pkgconfig:/opt/homebrew/opt/mapnik/lib/pkgconfig:$PKG_CONFIG_PATH
PKG_CONFIG_LIBDIR=/usr/local/opt/icu4c@78/lib/pkgconfig:/usr/local/opt/icu4c@78/share/pkgconfig:/opt/homebrew/opt/icu4c@78/lib/pkgconfig:/opt/homebrew/opt/icu4c@78/share/pkgconfig:/usr/local/opt/icu4c/lib/pkgconfig:/usr/local/opt/icu4c/share/pkgconfig:/opt/homebrew/opt/icu4c/lib/pkgconfig:/opt/homebrew/opt/icu4c/share/pkgconfig:/usr/local/opt/mapnik/lib/pkgconfig:/opt/homebrew/opt/mapnik/lib/pkgconfig:/usr/local/lib/pkgconfig:/usr/local/share/pkgconfig:/opt/homebrew/lib/pkgconfig:/opt/homebrew/share/pkgconfig
CXXFLAGS="-I/usr/local/opt/boost/include -I/opt/homebrew/opt/boost/include -I/usr/local/opt/harfbuzz/include -I/opt/homebrew/opt/harfbuzz/include -I/usr/local/opt/icu4c/include -I/opt/homebrew/opt/icu4c/include -I/usr/local/opt/gdal/include -I/opt/homebrew/opt/gdal/include -I/usr/local/opt/proj/include -I/opt/homebrew/opt/proj/include"
CPPFLAGS="-I/usr/local/opt/boost/include -I/opt/homebrew/opt/boost/include -I/usr/local/opt/harfbuzz/include -I/opt/homebrew/opt/harfbuzz/include -I/usr/local/opt/icu4c/include -I/opt/homebrew/opt/icu4c/include -I/usr/local/opt/gdal/include -I/opt/homebrew/opt/gdal/include -I/usr/local/opt/proj/include -I/opt/homebrew/opt/proj/include"
CPLUS_INCLUDE_PATH=/usr/local/opt/boost/include:/opt/homebrew/opt/boost/include:$CPLUS_INCLUDE_PATH
LDFLAGS="-L/usr/local/opt/boost/lib -L/opt/homebrew/opt/boost/lib -L/usr/local/opt/harfbuzz/lib -L/opt/homebrew/opt/harfbuzz/lib -L/usr/local/opt/icu4c/lib -L/opt/homebrew/opt/icu4c/lib -L/usr/local/opt/gdal/lib -L/opt/homebrew/opt/gdal/lib -L/usr/local/opt/proj/lib -L/opt/homebrew/opt/proj/lib"
# macOS: install dependencies via Homebrew
CIBW_BEFORE_ALL_MACOS: |
brew install mapnik pkg-config boost gdal proj harfbuzz libx11 xorgproto libxext libxrender libxau libxdmcp xtrans
brew install icu4c@78 || brew install icu4c
ICU_PREFIX=$(brew --prefix icu4c@78 || brew --prefix icu4c)
mkdir -p /usr/local/lib/pkgconfig /opt/homebrew/lib/pkgconfig
for dir in "$ICU_PREFIX/lib/pkgconfig" "$ICU_PREFIX/share/pkgconfig"; do
[ -d "$dir" ] || continue
for pc in "$dir"/icu-*.pc; do
[ -f "$pc" ] || continue
ln -sf "$pc" /usr/local/lib/pkgconfig/ 2>/dev/null || true
ln -sf "$pc" /opt/homebrew/lib/pkgconfig/ 2>/dev/null || true
done
done
# macOS: set up build environment
CIBW_BEFORE_BUILD_MACOS: |
eval $(brew shellenv)
HOMEBREW_PREFIX=$(brew --prefix)
ICU4C_PREFIX=$(brew --prefix icu4c)
BOOST_PREFIX=$(brew --prefix boost)
GDAL_PREFIX=$(brew --prefix gdal)
PROJ_PREFIX=$(brew --prefix proj)
HARFBUZZ_PREFIX=$(brew --prefix harfbuzz)
XORGPROTO_PREFIX=$(brew --prefix xorgproto)
LIBX11_PREFIX=$(brew --prefix libx11)
LIBXEXT_PREFIX=$(brew --prefix libxext)
LIBXRENDER_PREFIX=$(brew --prefix libxrender)
LIBXAU_PREFIX=$(brew --prefix libxau)
LIBXDMCP_PREFIX=$(brew --prefix libxdmcp)
XTRANS_PREFIX=$(brew --prefix xtrans)
XORGPROTO_PKGCONFIG_DIR=$(find "$HOMEBREW_PREFIX/Cellar/xorgproto" -type d -name "pkgconfig" 2>/dev/null | head -1)
[ -z "$XORGPROTO_PKGCONFIG_DIR" ] && XORGPROTO_PKGCONFIG_DIR="$XORGPROTO_PREFIX/share/pkgconfig"
export PKG_CONFIG_PATH="$HOMEBREW_PREFIX/lib/pkgconfig:$HOMEBREW_PREFIX/share/pkgconfig:$ICU4C_PREFIX/lib/pkgconfig:$GDAL_PREFIX/lib/pkgconfig:$PROJ_PREFIX/lib/pkgconfig:$HARFBUZZ_PREFIX/lib/pkgconfig:$LIBX11_PREFIX/lib/pkgconfig:$LIBXEXT_PREFIX/lib/pkgconfig:$LIBXRENDER_PREFIX/lib/pkgconfig:$LIBXAU_PREFIX/lib/pkgconfig:$LIBXDMCP_PREFIX/lib/pkgconfig:$XTRANS_PREFIX/share/pkgconfig:$XORGPROTO_PKGCONFIG_DIR:$XORGPROTO_PREFIX/share/pkgconfig:$XORGPROTO_PREFIX/lib/pkgconfig:$PKG_CONFIG_PATH"
export CXXFLAGS="-I$BOOST_PREFIX/include -I$GDAL_PREFIX/include -I$PROJ_PREFIX/include -I$HARFBUZZ_PREFIX/include $CXXFLAGS"
export LDFLAGS="-L$BOOST_PREFIX/lib -L$GDAL_PREFIX/lib -L$PROJ_PREFIX/lib -L$HARFBUZZ_PREFIX/lib $LDFLAGS"
run: |
cibuildwheel --output-dir wheelhouse
- name: Upload wheels
uses: actions/upload-artifact@v4
with:
name: wheels-${{ matrix.os }}
path: wheelhouse/*.whl
retention-days: 7
release:
needs:
- extract-version
- build-wheels
runs-on: ubuntu-latest
permissions:
contents: write
if: (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/')) || github.event_name == 'workflow_dispatch'
steps:
- name: Download all artifacts
uses: actions/download-artifact@v4
with:
path: dist-all
- name: Combine artifacts
run: |
mkdir -p dist
# Copy all wheels
find dist-all -name "*.whl" -exec cp {} dist/ \;
# Copy sdist (should be only one)
find dist-all -name "*.tar.gz" -exec cp {} dist/ \;
echo "Artifacts in dist/:"
ls -lh dist/
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
token: ${{ secrets.GITHUB_TOKEN }}
tag_name: ${{ needs.extract-version.outputs.version }}
name: Release ${{ needs.extract-version.outputs.version }}
body: |
## Python Mapnik ${{ needs.extract-version.outputs.version_number }}
### Installation
Download the wheel file for your platform and install:
```bash
pip install mapnik-${{ needs.extract-version.outputs.version_number }}-*.whl
```
Or install directly from GitHub (replace platform tag as needed):
```bash
pip install https://github.com/${{ github.repository }}/releases/download/${{ needs.extract-version.outputs.version }}/mapnik-${{ needs.extract-version.outputs.version_number }}-cp312-cp312-linux_x86_64.whl
```
Or install from source:
```bash
pip install git+https://github.com/${{ github.repository }}.git@${{ needs.extract-version.outputs.version }}
```
### Requirements
- Python >= 3.12
- Mapnik >= 4.2.0
### Changes
See [CHANGELOG.md](https://github.com/${{ github.repository }}/blob/${{ needs.extract-version.outputs.version }}/CHANGELOG.md) for details.
files: |
dist/*.whl
dist/*.tar.gz
draft: false
prerelease: false
- name: Summary
run: |
echo "## Release Summary" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "✅ Released version: **${{ needs.extract-version.outputs.version }}**" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### Artifacts Built:" >> $GITHUB_STEP_SUMMARY
ls -lh dist/ >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### Supported Platforms:" >> $GITHUB_STEP_SUMMARY
echo "- Linux x86_64: ✅" >> $GITHUB_STEP_SUMMARY
echo "- Linux arm64: ✅" >> $GITHUB_STEP_SUMMARY
echo "- macOS x86_64: ✅" >> $GITHUB_STEP_SUMMARY
echo "- macOS arm64: ✅" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### Distribution:" >> $GITHUB_STEP_SUMMARY
echo "- GitHub Release: ✅" >> $GITHUB_STEP_SUMMARY