From f1672fc3668f74ade08a8ab84f1d27d53908e7c2 Mon Sep 17 00:00:00 2001 From: Joao-Dionisio Date: Sat, 9 May 2026 12:54:49 +0100 Subject: [PATCH] Lower macOS wheel deployment target to 11.0 and patch dylibs to match --- CHANGELOG.md | 1 + pyproject.toml | 32 ++++++++++++++++++++------------ 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 10ec1cec1..c95568040 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ - Return `MatrixGenExpr` in `buildGenExprObj` instead of `MatrixExpr` - Plugins now hold strong references to their `Model` instead of `weakref.proxy`, fixing `ReferenceError` during cleanup callbacks (#1193) - Made `test_tree` robust to SCIP solver improvements by asserting visited node depths instead of node count (#1206) +- Lower macOS wheel `MACOSX_DEPLOYMENT_TARGET` to 11.0 and patch bundled SCIP/SoPlex/GCG and GCC runtime dylibs to match, fixing `delocate-wheel` failures on macos-15 runners and broadening installability for downstream consumers (e.g. pixi/uv-based environments) ### Changed - Return NotImplemented for `Expr` and `GenExpr` operators if they can't handle input types in the calculation - Speed up `constant * Expr` via C-level API diff --git a/pyproject.toml b/pyproject.toml index 0045a72ac..8c6c8d9fb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -64,28 +64,36 @@ skip="pp* cp36* cp37*" before-all = ''' #!/bin/bash brew install wget zlib gcc +export MACOSX_DEPLOYMENT_TARGET=11.0 if [[ $CIBW_ARCHS == *"arm"* ]]; then wget https://github.com/scipopt/scipoptsuite-deploy/releases/download/v0.12.0/libscip-macos-arm.zip -O scip.zip - export MACOSX_DEPLOYMENT_TARGET=14.0 else wget https://github.com/scipopt/scipoptsuite-deploy/releases/download/v0.12.0/libscip-macos-intel.zip -O scip.zip - export MACOSX_DEPLOYMENT_TARGET=14.0 fi unzip scip.zip mv scip_install src/scip +# The bundled SCIP/SoPlex/GCG dylibs are stamped with LC_BUILD_VERSION 14.0 and +# Homebrew gcc runtime libs on macos-15 runners with 15.0. delocate refuses to +# bundle libs whose minos exceeds the wheel's deployment target. Rewrite the +# load command to MACOSX_DEPLOYMENT_TARGET; these libs do not use OS-version- +# gated APIs, so the rewrite is safe in practice. +find src/scip/lib -type f -name "*.dylib" 2>/dev/null | while read lib; do + vtool -set-build-version macos "$MACOSX_DEPLOYMENT_TARGET" "$MACOSX_DEPLOYMENT_TARGET" -replace -output "$lib" "$lib" 2>/dev/null || true + codesign --force --sign - "$lib" 2>/dev/null || true +done +for prefix in /usr/local /opt/homebrew; do + find "$prefix/Cellar" -type f \( -name "libgfortran.*.dylib" -o -name "libquadmath.*.dylib" -o -name "libstdc++.*.dylib" -o -name "libgcc_s.*.dylib" \) 2>/dev/null | while read lib; do + vtool -set-build-version macos "$MACOSX_DEPLOYMENT_TARGET" "$MACOSX_DEPLOYMENT_TARGET" -replace -output "$lib" "$lib" 2>/dev/null || true + codesign --force --sign - "$lib" 2>/dev/null || true + done +done ''' -environment = {SCIPOPTDIR="$(pwd)/src/scip", LD_LIBRARY_PATH="$(pwd)/src/scip/lib:LD_LIBRARY_PATH", DYLD_LIBRARY_PATH="$(pwd)/src/scip/lib:$DYLD_LIBRARY_PATH", PATH="$(pwd)/src/scip/bin:$PATH", PKG_CONFIG_PATH="$(pwd)/src/scip/lib/pkgconfig:$PKG_CONFIG_PATH", RELEASE="true"} +environment = {SCIPOPTDIR="$(pwd)/src/scip", LD_LIBRARY_PATH="$(pwd)/src/scip/lib:LD_LIBRARY_PATH", DYLD_LIBRARY_PATH="$(pwd)/src/scip/lib:$DYLD_LIBRARY_PATH", PATH="$(pwd)/src/scip/bin:$PATH", PKG_CONFIG_PATH="$(pwd)/src/scip/lib/pkgconfig:$PKG_CONFIG_PATH", MACOSX_DEPLOYMENT_TARGET="11.0", RELEASE="true"} repair-wheel-command = ''' bash -c ' - if [[ $CIBW_ARCHS == *"arm"* ]]; then - export MACOSX_DEPLOYMENT_TARGET=14.0 - delocate-listdeps {wheel} - delocate-wheel --require-archs {delocate_archs} -w {dest_dir} {wheel} - else - export MACOSX_DEPLOYMENT_TARGET=14.0 - delocate-listdeps {wheel} - delocate-wheel --require-archs {delocate_archs} -w {dest_dir} {wheel} - fi + export MACOSX_DEPLOYMENT_TARGET=11.0 + delocate-listdeps {wheel} + delocate-wheel --require-archs {delocate_archs} -w {dest_dir} {wheel} ' '''