@@ -176,28 +176,102 @@ jobs:
176176 - name : Install and cache Homebrew tools
177177 uses : tecolicom/actions-use-homebrew-tools@v1
178178 with :
179- tools : mapnik icu4c pkg-config boost gdal proj harfbuzz
179+ tools : mapnik icu4c pkg-config boost gdal proj harfbuzz xorgproto
180180 key : mapnik-${{ matrix.arch_label }}
181181
182182 - name : Setup pkg-config and build environment
183183 run : |
184+ # Ensure Homebrew environment is available
185+ eval $(brew shellenv)
186+ # Get package-specific prefixes using brew --prefix and save to GITHUB_ENV for reuse
187+ HOMEBREW_PREFIX=$(brew --prefix)
188+ MAPNIK_PREFIX=$(brew --prefix mapnik)
189+ ICU4C_PREFIX=$(brew --prefix icu4c)
190+ BOOST_PREFIX=$(brew --prefix boost)
191+ GDAL_PREFIX=$(brew --prefix gdal)
192+ PROJ_PREFIX=$(brew --prefix proj)
193+ HARFBUZZ_PREFIX=$(brew --prefix harfbuzz)
194+ XORGPROTO_PREFIX=$(brew --prefix xorgproto)
195+ # Save prefixes to GITHUB_ENV for reuse in subsequent steps
196+ echo "HOMEBREW_PREFIX=$HOMEBREW_PREFIX" >> $GITHUB_ENV
197+ echo "MAPNIK_PREFIX=$MAPNIK_PREFIX" >> $GITHUB_ENV
198+ echo "ICU4C_PREFIX=$ICU4C_PREFIX" >> $GITHUB_ENV
199+ echo "BOOST_PREFIX=$BOOST_PREFIX" >> $GITHUB_ENV
200+ echo "GDAL_PREFIX=$GDAL_PREFIX" >> $GITHUB_ENV
201+ echo "PROJ_PREFIX=$PROJ_PREFIX" >> $GITHUB_ENV
202+ echo "HARFBUZZ_PREFIX=$HARFBUZZ_PREFIX" >> $GITHUB_ENV
203+ echo "XORGPROTO_PREFIX=$XORGPROTO_PREFIX" >> $GITHUB_ENV
204+ echo "Homebrew prefix: $HOMEBREW_PREFIX"
205+ echo "Mapnik prefix: $MAPNIK_PREFIX"
184206 # Set PKG_CONFIG_PATH to include Homebrew's pkg-config directories
185- # This ensures pkg-config can find Mapnik and its dependencies (ICU, Boost, GDAL, PROJ, HarfBuzz, etc.)
186- echo "PKG_CONFIG_PATH=$(brew --prefix)/lib/pkgconfig:$(brew --prefix)/opt/icu4c/lib/pkgconfig:$(brew --prefix)/opt/boost/lib/pkgconfig:$(brew --prefix)/opt/gdal/lib/pkgconfig:$(brew --prefix)/opt/proj/lib/pkgconfig:$(brew --prefix)/opt/harfbuzz/lib/pkgconfig:$PKG_CONFIG_PATH" >> $GITHUB_ENV
207+ # This ensures pkg-config can find Mapnik and its dependencies (ICU, Boost, GDAL, PROJ, HarfBuzz, X11 proto, etc.)
208+ # Note: xorgproto installs .pc files in the main Homebrew share/pkgconfig directory
209+ echo "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:$XORGPROTO_PREFIX/share/pkgconfig:$PKG_CONFIG_PATH" >> $GITHUB_ENV
187210 # Set CXXFLAGS and LDFLAGS to include Boost, GDAL, PROJ, and HarfBuzz headers and libraries
188- echo "CXXFLAGS=-I$(brew --prefix)/opt/boost/include -I$(brew --prefix)/opt/gdal/include -I$(brew --prefix)/opt/proj/include -I$(brew --prefix)/opt/harfbuzz/include $CXXFLAGS" >> $GITHUB_ENV
189- echo "LDFLAGS=-L$(brew --prefix)/opt/boost/lib -L$(brew --prefix)/opt/gdal/lib -L$(brew --prefix)/opt/proj/lib -L$(brew --prefix)/opt/harfbuzz/lib $LDFLAGS" >> $GITHUB_ENV
190- echo "PKG_CONFIG_PATH set to: $PKG_CONFIG_PATH"
191- echo "CXXFLAGS set to: $CXXFLAGS"
192- echo "LDFLAGS set to: $LDFLAGS"
211+ echo "CXXFLAGS=-I$BOOST_PREFIX/include -I$GDAL_PREFIX/include -I$PROJ_PREFIX/include -I$HARFBUZZ_PREFIX/include $CXXFLAGS" >> $GITHUB_ENV
212+ echo "LDFLAGS=-L$BOOST_PREFIX/lib -L$GDAL_PREFIX/lib -L$PROJ_PREFIX/lib -L$HARFBUZZ_PREFIX/lib $LDFLAGS" >> $GITHUB_ENV
213+ # Verify the paths exist
214+ echo "Checking PKG_CONFIG_PATH directories:"
215+ for dir in "$HOMEBREW_PREFIX/lib/pkgconfig" "$HOMEBREW_PREFIX/share/pkgconfig" "$ICU4C_PREFIX/lib/pkgconfig" "$GDAL_PREFIX/lib/pkgconfig" "$PROJ_PREFIX/lib/pkgconfig" "$HARFBUZZ_PREFIX/lib/pkgconfig" "$XORGPROTO_PREFIX/share/pkgconfig"; do
216+ if [ -d "$dir" ]; then
217+ echo " ✓ $dir exists"
218+ else
219+ echo " ✗ $dir does not exist"
220+ fi
221+ done
222+ # Check if libmapnik.pc exists
223+ if [ -f "$HOMEBREW_PREFIX/lib/pkgconfig/libmapnik.pc" ]; then
224+ echo " ✓ libmapnik.pc found at $HOMEBREW_PREFIX/lib/pkgconfig/libmapnik.pc"
225+ else
226+ echo " ✗ libmapnik.pc not found at $HOMEBREW_PREFIX/lib/pkgconfig/libmapnik.pc"
227+ echo " Searching for libmapnik.pc..."
228+ find "$HOMEBREW_PREFIX" -name "libmapnik.pc" 2>/dev/null || echo " Not found anywhere"
229+ fi
230+ # Check for X11 proto files
231+ echo "Checking for X11 proto .pc files:"
232+ for pc_file in xproto kbproto xextproto renderproto; do
233+ if pkg-config --exists "$pc_file" 2>/dev/null; then
234+ echo " ✓ $pc_file.pc found"
235+ else
236+ echo " ✗ $pc_file.pc not found"
237+ # Try to find it manually
238+ found=$(find "$HOMEBREW_PREFIX" -name "${pc_file}.pc" 2>/dev/null | head -1)
239+ if [ -n "$found" ]; then
240+ echo " Found at: $found"
241+ fi
242+ fi
243+ done
193244
194245 - name : Install uv
195246 uses : astral-sh/setup-uv@v7
196247 with :
197248 enable-cache : false
198249
250+ - name : Verify pkg-config can find libmapnik
251+ run : |
252+ eval $(brew shellenv)
253+ echo "Current PKG_CONFIG_PATH: $PKG_CONFIG_PATH"
254+ echo "Testing pkg-config --variable=prefix libmapnik:"
255+ pkg-config --variable=prefix libmapnik || echo "ERROR: pkg-config cannot find libmapnik"
256+ echo "Testing pkg-config --print-errors --libs libmapnik:"
257+ pkg-config --print-errors --libs libmapnik || echo "ERROR: pkg-config --libs failed (see errors above)"
258+ echo "Testing pkg-config --print-errors --cflags libmapnik:"
259+ pkg-config --print-errors --cflags libmapnik || echo "ERROR: pkg-config --cflags failed (see errors above)"
260+ # Check what dependencies libmapnik.pc requires
261+ echo "Checking libmapnik.pc dependencies:"
262+ if [ -f "$HOMEBREW_PREFIX/lib/pkgconfig/libmapnik.pc" ]; then
263+ grep -E "^Requires|^Libs.private" "$HOMEBREW_PREFIX/lib/pkgconfig/libmapnik.pc" || true
264+ fi
265+
199266 - name : Install Python dependencies and build package
200267 run : |
268+ # Ensure Homebrew environment is available
269+ eval $(brew shellenv)
270+ # Re-export environment variables (already set in previous step via GITHUB_ENV)
271+ # This ensures they're available in the current shell session for subprocess calls
272+ export PKG_CONFIG_PATH="$PKG_CONFIG_PATH"
273+ export CXXFLAGS="$CXXFLAGS"
274+ export LDFLAGS="$LDFLAGS"
201275 # Use lockfile when present; avoid doing two full syncs (which can rebuild twice).
202276 if [ -f uv.lock ]; then
203277 uv sync --extra test --frozen --verbose
@@ -231,7 +305,7 @@ jobs:
231305 uses : actions/upload-artifact@v4
232306 if : always()
233307 with :
234- name : coverage-reports-macos-${{ matrix.arch_label }}
308+ name : coverage-reports-macos-${{ matrix.os }}-${{ matrix. arch_label }}
235309 path : |
236310 coverage.xml
237311 htmlcov/
@@ -246,7 +320,7 @@ jobs:
246320 if : always()
247321 with :
248322 files : coverage.xml
249- flags : unittests-macos-${{ matrix.arch_label }}
250- name : python-mapnik-coverage-macos-${{ matrix.arch_label }}
323+ flags : unittests-macos-${{ matrix.os }}-${{ matrix. arch_label }}
324+ name : python-mapnik-coverage-macos-${{ matrix.os }}-${{ matrix. arch_label }}
251325 fail_ci_if_error : false
252326 token : ${{ secrets.CODECOV_TOKEN }}
0 commit comments