From 3e26fd7e9df0bdc48588d0cb4040b596e5aee3ef Mon Sep 17 00:00:00 2001 From: Silia Taider Date: Wed, 22 Jul 2026 14:39:31 +0200 Subject: [PATCH 01/15] [ci] minimal refactor to use cibuildwheel --- .github/workflows/python_wheel_build.yml | 33 +++++++----------------- 1 file changed, 9 insertions(+), 24 deletions(-) diff --git a/.github/workflows/python_wheel_build.yml b/.github/workflows/python_wheel_build.yml index 3cd84480208ad..226e87fda3011 100644 --- a/.github/workflows/python_wheel_build.yml +++ b/.github/workflows/python_wheel_build.yml @@ -54,31 +54,16 @@ on: jobs: Build_Wheel: runs-on: macos-26 + strategy: + fail-fast: false + matrix: + target: [cp310-macosx_x86_64, cp311-macosx_x86_64, cp312-macosx_x86_64, cp313-macosx_x86_64, cp314-macosx_x86_64, + cp310-macosx_arm64, cp311-macosx_arm64, cp312-macosx_arm64, cp313-macosx_arm64, cp314-macosx_arm64] + name: ${{ matrix.target }} steps: - - name: Checkout the official ROOT repo - uses: actions/checkout@v6 - with: - path: root -# ref: v${{ inputs.major }}-${{ inputs.minor }}-${{ inputs.patch }} - - name: Make wheel + - uses: actions/checkout@v6 + - uses: ./.github/workflows/cibuildwheel-impl env: MACOSX_DEPLOYMENT_TARGET: 26.5 - run: | - mkdir wheel_creation && cd wheel_creation - cp -r ../root . - python3 -m venv root_build_env - source root_build_env/bin/activate - pip install --upgrade pip setuptools wheel build - cd root - pip install -r requirements.txt - python3 -m build --wheel - pip install delocate - mkdir fixed_wheels - delocate-wheel -v -w fixed_wheels/ dist/*.whl - - - name: Upload_wheel - uses: actions/upload-artifact@v6 with: - name: Wheel upload - path: /Users/runner/work/root/root/wheel_creation/root/fixed_wheels/*.whl - if-no-files-found: error + build-tag: ${{ matrix.target }} From 2c1dcf0695ac9d468d968d29b3300691ed89688b Mon Sep 17 00:00:00 2001 From: Silia Taider Date: Wed, 22 Jul 2026 15:03:08 +0200 Subject: [PATCH 02/15] fixup! [ci] minimal refactor to use cibuildwheel --- .github/workflows/python_wheel_build.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/python_wheel_build.yml b/.github/workflows/python_wheel_build.yml index 226e87fda3011..9b291e20dd05f 100644 --- a/.github/workflows/python_wheel_build.yml +++ b/.github/workflows/python_wheel_build.yml @@ -50,6 +50,8 @@ on: - "30" required: true default: "00" + pull_request: + types: [opened, synchronize, reopened] jobs: Build_Wheel: @@ -57,8 +59,7 @@ jobs: strategy: fail-fast: false matrix: - target: [cp310-macosx_x86_64, cp311-macosx_x86_64, cp312-macosx_x86_64, cp313-macosx_x86_64, cp314-macosx_x86_64, - cp310-macosx_arm64, cp311-macosx_arm64, cp312-macosx_arm64, cp313-macosx_arm64, cp314-macosx_arm64] + target: [cp310-macosx_arm64, cp311-macosx_arm64, cp312-macosx_arm64, cp313-macosx_arm64, cp314-macosx_arm64] name: ${{ matrix.target }} steps: - uses: actions/checkout@v6 From 4364d55968c7e938e43cf1d2bfd49a600bc83f3a Mon Sep 17 00:00:00 2001 From: Silia Taider Date: Wed, 22 Jul 2026 16:56:00 +0200 Subject: [PATCH 03/15] [ci] test the produced macos wheels --- .github/workflows/python_wheel_build.yml | 37 ++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/.github/workflows/python_wheel_build.yml b/.github/workflows/python_wheel_build.yml index 9b291e20dd05f..a0cbca5086fa2 100644 --- a/.github/workflows/python_wheel_build.yml +++ b/.github/workflows/python_wheel_build.yml @@ -68,3 +68,40 @@ jobs: MACOSX_DEPLOYMENT_TARGET: 26.5 with: build-tag: ${{ matrix.target }} + + Test_Wheels: + needs: Build_Wheel + runs-on: macos-26 + strategy: + fail-fast: false + matrix: + python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"] + name: test-wheel-cp${{ matrix.python-version }} + steps: + - uses: actions/checkout@v6 + - name: Download produced wheels + uses: actions/download-artifact@v4 + with: + path: wheels + merge-multiple: true + + - name: Setup Python + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + + - name: Install produced wheel + run: | + ls -R wheels + PY_VER=$(python -c "import sys; print(f'cp{sys.version_info.major}{sys.version_info.minor}')") + WHEEL=$(ls wheels/*${PY_VER}*macosx*.whl | head -n 1) + echo "Python version: ${PY_VER}, installing wheel: ${WHEEL}" + pip install "$WHEEL" + + - name: Install tutorials dependencies + run: | + python -m pip install --no-cache-dir -r test/wheels/requirements-ci.txt + + - name: Run tutorials + run: | + pytest -vv --verbosity="4" -rF test/wheels From c2faa8dbe5ae64c5a133bc81c2ddc08d0dcebeda Mon Sep 17 00:00:00 2001 From: Silia Taider Date: Wed, 22 Jul 2026 17:02:14 +0200 Subject: [PATCH 04/15] fixup! [ci] test the produced macos wheels --- .github/workflows/python_wheel_build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/python_wheel_build.yml b/.github/workflows/python_wheel_build.yml index a0cbca5086fa2..b7b1822670be5 100644 --- a/.github/workflows/python_wheel_build.yml +++ b/.github/workflows/python_wheel_build.yml @@ -69,7 +69,7 @@ jobs: with: build-tag: ${{ matrix.target }} - Test_Wheels: + Test_Wheels: needs: Build_Wheel runs-on: macos-26 strategy: From 7b4fe4549b17c889c101a0ef9f5f03eb10deb4b1 Mon Sep 17 00:00:00 2001 From: siliataider Date: Sat, 25 Jul 2026 19:59:37 +0200 Subject: [PATCH 05/15] remove stripping of symbols (aggressive for macos) --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 096eba25b8703..ccb3c0d861cfa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -18,6 +18,7 @@ dependencies = [ # Point backend to python packages and to explicitly use Ninja [tool.scikit-build] +install.strip = false wheel.packages = [ "bindings/pyroot/pythonizations/python/ROOT", "bindings/pyroot/cppyy/cppyy/python/cppyy", From 6e40d2f22fd3b228a04e26f30d6ddf5b4312a340 Mon Sep 17 00:00:00 2001 From: siliataider Date: Mon, 27 Jul 2026 11:34:17 +0200 Subject: [PATCH 06/15] try lowering deployment target to 15.0 --- .github/workflows/python_wheel_build.yml | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/.github/workflows/python_wheel_build.yml b/.github/workflows/python_wheel_build.yml index b7b1822670be5..e2078d41778d6 100644 --- a/.github/workflows/python_wheel_build.yml +++ b/.github/workflows/python_wheel_build.yml @@ -55,7 +55,7 @@ on: jobs: Build_Wheel: - runs-on: macos-26 + runs-on: macos-15 strategy: fail-fast: false matrix: @@ -65,18 +65,19 @@ jobs: - uses: actions/checkout@v6 - uses: ./.github/workflows/cibuildwheel-impl env: - MACOSX_DEPLOYMENT_TARGET: 26.5 + MACOSX_DEPLOYMENT_TARGET: 15.0 with: build-tag: ${{ matrix.target }} Test_Wheels: needs: Build_Wheel - runs-on: macos-26 + runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"] - name: test-wheel-cp${{ matrix.python-version }} + os: [macos-15, macos-26] + name: test-wheel-cp${{ matrix.python-version }}-${{ matrix.os }} steps: - uses: actions/checkout@v6 - name: Download produced wheels From c7284633078baabee02f9d4e3386f5e53e07617d Mon Sep 17 00:00:00 2001 From: siliataider Date: Mon, 27 Jul 2026 17:04:27 +0200 Subject: [PATCH 07/15] turn off runtime_cxxmodules --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index ccb3c0d861cfa..0e6967622ce65 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -45,7 +45,7 @@ CMAKE_INSTALL_TUTDIR = "ROOT/tutorials" gminimal="ON" asimage="ON" opengl="OFF" -runtime_cxxmodules="ON" +runtime_cxxmodules="OFF" fail-on-missing="ON" # Prevent CMake from producing its own .dist-info metadata From 24f8622b50faf10db3c2e61293d8dd2492e89824 Mon Sep 17 00:00:00 2001 From: Silia Taider Date: Tue, 28 Jul 2026 16:27:42 +0200 Subject: [PATCH 08/15] refactor to build and test on different runners --- .github/workflows/python_wheel_build.yml | 36 +++++++++++++++--------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/.github/workflows/python_wheel_build.yml b/.github/workflows/python_wheel_build.yml index e2078d41778d6..0309bc9704cb2 100644 --- a/.github/workflows/python_wheel_build.yml +++ b/.github/workflows/python_wheel_build.yml @@ -55,29 +55,40 @@ on: jobs: Build_Wheel: - runs-on: macos-15 + runs-on: ${{ matrix.config.runner }} strategy: fail-fast: false matrix: - target: [cp310-macosx_arm64, cp311-macosx_arm64, cp312-macosx_arm64, cp313-macosx_arm64, cp314-macosx_arm64] - name: ${{ matrix.target }} + python: [cp310, cp311, cp312, cp313, cp314] + config: + - runner: macos-15 + platform: macosx_arm64 + deployment_target: "15.0" + - runner: macos-26 + platform: macosx_arm64 + deployment_target: "26.0" + name: ${{ matrix.python }}-${{ matrix.config.platform }}-${{ matrix.config.runner }} steps: - uses: actions/checkout@v6 - uses: ./.github/workflows/cibuildwheel-impl env: - MACOSX_DEPLOYMENT_TARGET: 15.0 + MACOSX_DEPLOYMENT_TARGET: ${{ matrix.config.deployment_target }} with: - build-tag: ${{ matrix.target }} + build-tag: ${{ matrix.python }}-${{ matrix.config.platform }} Test_Wheels: needs: Build_Wheel - runs-on: ${{ matrix.os }} + runs-on: ${{ matrix.config.runner }} strategy: fail-fast: false matrix: - python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"] - os: [macos-15, macos-26] - name: test-wheel-cp${{ matrix.python-version }}-${{ matrix.os }} + python: ["3.10", "3.11", "3.12", "3.13", "3.14"] + config: + - runner: macos-15 + wheel_pattern: "macosx_15" + - runner: macos-26 + wheel_pattern: "macosx_26" + name: test-wheel-cp${{ matrix.python }}-${{ matrix.config.runner }} steps: - uses: actions/checkout@v6 - name: Download produced wheels @@ -85,20 +96,17 @@ jobs: with: path: wheels merge-multiple: true - - name: Setup Python uses: actions/setup-python@v5 with: - python-version: ${{ matrix.python-version }} - + python-version: ${{ matrix.python }} - name: Install produced wheel run: | ls -R wheels PY_VER=$(python -c "import sys; print(f'cp{sys.version_info.major}{sys.version_info.minor}')") - WHEEL=$(ls wheels/*${PY_VER}*macosx*.whl | head -n 1) + WHEEL=$(ls wheels/*${PY_VER}*${{ matrix.config.wheel_pattern }}*.whl | head -n 1) echo "Python version: ${PY_VER}, installing wheel: ${WHEEL}" pip install "$WHEEL" - - name: Install tutorials dependencies run: | python -m pip install --no-cache-dir -r test/wheels/requirements-ci.txt From 3e0a9865ef10f3a4663aba4ba7f26f6d7d0dd929 Mon Sep 17 00:00:00 2001 From: Silia Taider Date: Tue, 28 Jul 2026 18:02:29 +0200 Subject: [PATCH 09/15] refactor building and tetsing matrix --- .github/workflows/python_wheel_build.yml | 29 ++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/.github/workflows/python_wheel_build.yml b/.github/workflows/python_wheel_build.yml index 0309bc9704cb2..d588842042649 100644 --- a/.github/workflows/python_wheel_build.yml +++ b/.github/workflows/python_wheel_build.yml @@ -61,12 +61,18 @@ jobs: matrix: python: [cp310, cp311, cp312, cp313, cp314] config: + - runner: macos-14 + platform: macosx_arm64 + deployment_target: "14.0" - runner: macos-15 platform: macosx_arm64 deployment_target: "15.0" - runner: macos-26 platform: macosx_arm64 deployment_target: "26.0" + - runner: ubuntu-latest + platform: manylinux_x86_64 + deployment_target: "" name: ${{ matrix.python }}-${{ matrix.config.platform }}-${{ matrix.config.runner }} steps: - uses: actions/checkout@v6 @@ -84,11 +90,27 @@ jobs: matrix: python: ["3.10", "3.11", "3.12", "3.13", "3.14"] config: + # native tests: each runner tests its own wheel + - runner: macos-14 + wheel_pattern: "macosx_14" + label: "native" - runner: macos-15 wheel_pattern: "macosx_15" + label: "native" - runner: macos-26 wheel_pattern: "macosx_26" - name: test-wheel-cp${{ matrix.python }}-${{ matrix.config.runner }} + label: "native" + - runner: ubuntu-latest + wheel_pattern: "manylinux" + label: "native" + # portability tests: oldest wheel on newer runners + - runner: macos-15 + wheel_pattern: "macosx_14" + label: "port" + - runner: macos-26 + wheel_pattern: "macosx_14" + label: "port" + name: test-${{ matrix.python }}-${{ matrix.config.wheel_pattern }}-on-${{ matrix.config.runner }}-${{ matrix.config.label }} steps: - uses: actions/checkout@v6 - name: Download produced wheels @@ -105,12 +127,11 @@ jobs: ls -R wheels PY_VER=$(python -c "import sys; print(f'cp{sys.version_info.major}{sys.version_info.minor}')") WHEEL=$(ls wheels/*${PY_VER}*${{ matrix.config.wheel_pattern }}*.whl | head -n 1) - echo "Python version: ${PY_VER}, installing wheel: ${WHEEL}" + echo "Testing wheel: ${WHEEL} on ${{ matrix.config.runner }} (${{ matrix.config.label }})" pip install "$WHEEL" - name: Install tutorials dependencies run: | python -m pip install --no-cache-dir -r test/wheels/requirements-ci.txt - - name: Run tutorials run: | - pytest -vv --verbosity="4" -rF test/wheels + pytest -vv --verbosity="4" -rF test/wheels \ No newline at end of file From 7eb02b903399f405f278b979311dbd837b685edb Mon Sep 17 00:00:00 2001 From: siliataider Date: Wed, 29 Jul 2026 00:12:57 +0200 Subject: [PATCH 10/15] fixup matrix config --- .github/workflows/python_wheel_build.yml | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/.github/workflows/python_wheel_build.yml b/.github/workflows/python_wheel_build.yml index d588842042649..15e24241eda85 100644 --- a/.github/workflows/python_wheel_build.yml +++ b/.github/workflows/python_wheel_build.yml @@ -84,12 +84,12 @@ jobs: Test_Wheels: needs: Build_Wheel - runs-on: ${{ matrix.config.runner }} + runs-on: ${{ matrix.test_config.runner }} strategy: fail-fast: false matrix: python: ["3.10", "3.11", "3.12", "3.13", "3.14"] - config: + test_config: # native tests: each runner tests its own wheel - runner: macos-14 wheel_pattern: "macosx_14" @@ -104,13 +104,10 @@ jobs: wheel_pattern: "manylinux" label: "native" # portability tests: oldest wheel on newer runners - - runner: macos-15 - wheel_pattern: "macosx_14" - label: "port" - runner: macos-26 - wheel_pattern: "macosx_14" + wheel_pattern: "macosx_15" label: "port" - name: test-${{ matrix.python }}-${{ matrix.config.wheel_pattern }}-on-${{ matrix.config.runner }}-${{ matrix.config.label }} + name: test-${{ matrix.python }}-${{ matrix.test_config.wheel_pattern }}-on-${{ matrix.test_config.runner }}-${{ matrix.test_config.label }} steps: - uses: actions/checkout@v6 - name: Download produced wheels @@ -126,8 +123,8 @@ jobs: run: | ls -R wheels PY_VER=$(python -c "import sys; print(f'cp{sys.version_info.major}{sys.version_info.minor}')") - WHEEL=$(ls wheels/*${PY_VER}*${{ matrix.config.wheel_pattern }}*.whl | head -n 1) - echo "Testing wheel: ${WHEEL} on ${{ matrix.config.runner }} (${{ matrix.config.label }})" + WHEEL=$(ls wheels/*${PY_VER}*${{ matrix.test_config.wheel_pattern }}*.whl | head -n 1) + echo "Testing wheel: ${WHEEL} on ${{ matrix.test_config.runner }} (${{ matrix.test_config.label }})" pip install "$WHEEL" - name: Install tutorials dependencies run: | From b669c3aec7ed6bb92faf37a47718e57ebe23725e Mon Sep 17 00:00:00 2001 From: siliataider Date: Wed, 29 Jul 2026 00:13:13 +0200 Subject: [PATCH 11/15] use builtin gif --- pyproject.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/pyproject.toml b/pyproject.toml index 0e6967622ce65..18d0310af2492 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -76,6 +76,7 @@ ssl="ON" imt="ON" roofit="ON" mathmore="ON" +builtin_gif="ON" # Expose the ROOT cli as an executable command via _rootcli wrapper [project.scripts] From 6eb512bdf006e288e31564bd664f547634076eb8 Mon Sep 17 00:00:00 2001 From: Silia Taider Date: Wed, 29 Jul 2026 10:20:29 +0200 Subject: [PATCH 12/15] configure unique artifact name --- .github/workflows/cibuildwheel-impl/action.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/cibuildwheel-impl/action.yml b/.github/workflows/cibuildwheel-impl/action.yml index 9667e39c1ecbf..031c7a35398c9 100644 --- a/.github/workflows/cibuildwheel-impl/action.yml +++ b/.github/workflows/cibuildwheel-impl/action.yml @@ -4,6 +4,10 @@ inputs: build-tag: description: 'The tag for this build' required: true + artifact-name: + description: 'The name of the artifact to upload' + required: false + default: ${{ inputs.build-tag }} runs: using: "composite" @@ -16,5 +20,5 @@ runs: - name: Upload wheel uses: actions/upload-artifact@v6 with: - name: ${{ inputs.build-tag }} + name: ${{ inputs.artifact-name }} path: wheelhouse/* From 735003abf9ab52e5a0ab1e8987a4a0d82d5db610 Mon Sep 17 00:00:00 2001 From: Silia Taider Date: Wed, 29 Jul 2026 10:24:28 +0200 Subject: [PATCH 13/15] make artifact name required --- .github/workflows/cibuildwheel-impl/action.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/cibuildwheel-impl/action.yml b/.github/workflows/cibuildwheel-impl/action.yml index 031c7a35398c9..bf6b50bc2cb73 100644 --- a/.github/workflows/cibuildwheel-impl/action.yml +++ b/.github/workflows/cibuildwheel-impl/action.yml @@ -6,8 +6,7 @@ inputs: required: true artifact-name: description: 'The name of the artifact to upload' - required: false - default: ${{ inputs.build-tag }} + required: true runs: using: "composite" From 2f85e77d0528b41e9aedb748d851769e17b78620 Mon Sep 17 00:00:00 2001 From: Silia Taider Date: Wed, 29 Jul 2026 10:25:02 +0200 Subject: [PATCH 14/15] configure artifact name per runner --- .github/workflows/python_wheel_build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/python_wheel_build.yml b/.github/workflows/python_wheel_build.yml index 15e24241eda85..046f43f45c994 100644 --- a/.github/workflows/python_wheel_build.yml +++ b/.github/workflows/python_wheel_build.yml @@ -81,6 +81,7 @@ jobs: MACOSX_DEPLOYMENT_TARGET: ${{ matrix.config.deployment_target }} with: build-tag: ${{ matrix.python }}-${{ matrix.config.platform }} + artifact-name: ${{ matrix.python }}-${{ matrix.config.platform }}-${{ matrix.config.runner }} Test_Wheels: needs: Build_Wheel From 2d0a7cdd2f5534d4a1a22091de4f17802b70aef2 Mon Sep 17 00:00:00 2001 From: Silia Taider Date: Wed, 29 Jul 2026 10:45:11 +0200 Subject: [PATCH 15/15] update portability tests matrix --- .github/workflows/python_wheel_build.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/python_wheel_build.yml b/.github/workflows/python_wheel_build.yml index 046f43f45c994..5c186717f17a3 100644 --- a/.github/workflows/python_wheel_build.yml +++ b/.github/workflows/python_wheel_build.yml @@ -105,6 +105,12 @@ jobs: wheel_pattern: "manylinux" label: "native" # portability tests: oldest wheel on newer runners + - runner: macos-15 + wheel_pattern: "macosx_14" + label: "port" + - runner: macos-26 + wheel_pattern: "macosx_14" + label: "port" - runner: macos-26 wheel_pattern: "macosx_15" label: "port"