Build macOS wheels, use Python 3.10-3.14 everywhere, fix dqrobotics resolution - #8
Merged
Merged
Conversation
…esolution - publish.yml: add macos-latest (arm64) to the matrix and build every platform for Python 3.10-3.14, the versions dqrobotics publishes wheels for. On macOS, Eigen comes from Homebrew and dqrobotics is built from source into the runner's temporary directory; delocate bundles libdqrobotics.dylib into the wheel and tags it for macOS 14.0 (MACOSX_DEPLOYMENT_TARGET). A smoke test installs each wheel in a clean environment and uses SerialManipulatorSimulatorFriendly. - CMakeLists.txt: the dqrobotics headers include <eigen3/Eigen/Dense>, which needs Eigen's include prefix on the search path; it is on Linux and Windows but not on macOS (Homebrew), so expose only Eigen through an include directory in the build tree. - pyproject.toml: require dqrobotics>=26.4.0a7. Only dqrobotics' pre-releases have wheels for Python >= 3.10, and with >=20.4.0 pip does not choose them (No matching distribution found for dqrobotics>=20.4.0). Also Python version and operating system classifiers. - README: PyPI installation and platforms, the macOS build from source, and DQ([1]) in the modeling example (the current dqrobotics rejects DQ(1)). Tested: on macOS (arm64, Python 3.14, Homebrew Eigen 5.0.1, dqrobotics/cpp master) the wheel builds, delocates to macosx_14_0_arm64, installs in a clean environment, and SerialManipulatorSimulatorFriendly, Clock and the examples run; on Ubuntu Noble, docker compose run marinholab_sas_core passes all checks. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
setup-python's python.org builds are universal2, so setuptools tagged the wheel universal2 while the extension (and the dqrobotics it links) is arm64 only, and delocate-wheel failed: Failed to find any binary with the required architecture: 'x86_64'. ARCHFLAGS=-arch arm64 passes the architecture to CMake (setup.py maps it to CMAKE_OSX_ARCHITECTURES) and _PYTHON_HOST_PLATFORM=macosx-14.0-arm64 tags the wheel. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
1 task
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
macos-latest(arm64) joins the build matrix. Eigen comes from Homebrew; dqrobotics is built from source into the runner's temporary directory;delocatebundleslibdqrobotics.dyliband tags the wheel for macOS 14.0 (MACOSX_DEPLOYMENT_TARGET).dqrobotics>=20.4.0could not be resolved. Only dqrobotics' pre-releases have wheels for Python ≥ 3.10, and pip does not choose pre-releases for that specifier (No matching distribution found for dqrobotics>=20.4.0). It is nowdqrobotics>=26.4.0a7.<eigen3/Eigen/Dense>, which needs Eigen's include prefix on the search path (true on Linux and Windows, not with Homebrew). Only Eigen is exposed, through an include directory in the build tree, so the rest of/opt/homebrew/include(e.g. a Homebrew pybind11) cannot shadow the submodules.SerialManipulatorSimulatorFriendly. It installs with--no-deps, since onlypapers.icra2019needsmarinholab-solvers-qpoases, whose wheels do not yet cover every platform and Python version.DQ([1])in the modeling example (the current dqrobotics rejectsDQ(1)), classifiers.Test plan
macosx_14_0_arm64, installs in a clean venv;SerialManipulatorSimulatorFriendly,Clockand the examples run.docker compose run marinholab_sas_corepasses all checks.🤖 Generated with Claude Code