This is an automated email from the ASF dual-hosted git repository.

apitrou pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow.git


The following commit(s) were added to refs/heads/main by this push:
     new 3752109d64 GH-44855: [Python][Packaging] Use delvewheel to repair 
Windows wheels (#35323)
3752109d64 is described below

commit 3752109d64e3a02eaaa636a037141a51fae46819
Author: Raúl Cumplido <[email protected]>
AuthorDate: Sat Jan 4 10:55:40 2025 +0100

    GH-44855: [Python][Packaging] Use delvewheel to repair Windows wheels 
(#35323)
    
    ### Rationale for this change
    
    We need to ship the C++ standard library with our Windows wheels, as it is 
not guaranteed that a recent enough version is present on the system. However, 
some other Python libraries may require an even more recent version than the 
one we ship. This may incur crashes when PyArrow is imported before such other 
Python library, as the older version of the C++ standard library would be used 
by both.
    
    ### What changes are included in this PR?
    
    Use a [fixed-up version](https://github.com/adang1345/delvewheel/pull/59) 
of delvewheel that allows us to name-mangle an individual DLL, and name-mangle 
`msvcp140.dll` to ensure that other Python libraries do not reuse the version 
we ship.
    
    ### Are these changes tested?
    
    By regular wheel build tests.
    
    * Closes: #44855
    * GitHub Issue: #33981
    * GitHub Issue: #44855
    
    Lead-authored-by: Antoine Pitrou <[email protected]>
    Co-authored-by: Raúl Cumplido <[email protected]>
    Co-authored-by: Antoine Pitrou <[email protected]>
    Signed-off-by: Antoine Pitrou <[email protected]>
---
 ci/scripts/python_wheel_windows_build.bat  | 30 ++++++++++++++++++++++++++++--
 ci/scripts/python_wheel_windows_test.bat   |  4 ++--
 dev/tasks/python-wheels/github.windows.yml |  8 ++++----
 3 files changed, 34 insertions(+), 8 deletions(-)

diff --git a/ci/scripts/python_wheel_windows_build.bat 
b/ci/scripts/python_wheel_windows_build.bat
index 1f1d5dca72..fe079e1862 100644
--- a/ci/scripts/python_wheel_windows_build.bat
+++ b/ci/scripts/python_wheel_windows_build.bat
@@ -20,6 +20,12 @@
 echo "Building windows wheel..."
 
 call "C:\Program Files (x86)\Microsoft Visual 
Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"
+@echo on
+
+@REM Install a more recent msvcp140.dll in C:\Windows\System32
+choco install -r -y --no-progress vcredist140
+choco upgrade -r -y --no-progress vcredist140
+dir C:\Windows\System32\msvcp140.dll
 
 echo "=== (%PYTHON_VERSION%) Clear output directories and leftovers ==="
 del /s /q C:\arrow-build
@@ -121,7 +127,27 @@ set ARROW_HOME=C:\arrow-dist
 set CMAKE_PREFIX_PATH=C:\arrow-dist
 
 pushd C:\arrow\python
-@REM bundle the msvc runtime
-cp "C:\Program Files (x86)\Microsoft Visual 
Studio\2019\Community\VC\Redist\MSVC\14.28.29325\x64\Microsoft.VC142.CRT\msvcp140.dll"
 pyarrow\
+
+@REM Bundle the C++ runtime
+cp C:\Windows\System32\msvcp140.dll pyarrow\
+
+@REM Build wheel
 python setup.py bdist_wheel || exit /B 1
+
+@REM Repair the wheel with delvewheel
+@REM
+@REM Since we bundled the Arrow C++ libraries ourselves, we only need to
+@REM mangle msvcp140.dll so as to avoid ABI issues when msvcp140.dll is
+@REM required by multiple Python libraries in the same process.
+@REM
+@REM For now this requires a custom version of delvewheel:
+@REM https://github.com/adang1345/delvewheel/pull/59
+pip install 
https://github.com/pitrou/delvewheel/archive/refs/heads/fixes-for-arrow.zip || 
exit /B 1
+
+for /f %%i in ('dir dist\pyarrow-*.whl /B') do (set WHEEL_NAME=%cd%\dist\%%i) 
|| exit /B 1
+echo "Wheel name: %WHEEL_NAME%"
+
+delvewheel repair -vv --mangle-only=msvcp140.dll --no-patch ^
+    -w repaired_wheels %WHEEL_NAME% || exit /B 1
+
 popd
diff --git a/ci/scripts/python_wheel_windows_test.bat 
b/ci/scripts/python_wheel_windows_test.bat
index ae5b7e36ad..12d35216b1 100755
--- a/ci/scripts/python_wheel_windows_test.bat
+++ b/ci/scripts/python_wheel_windows_test.bat
@@ -48,7 +48,7 @@ set PYTHON_CMD=py -%PYTHON%
 %PYTHON_CMD% -m pip install -r C:\arrow\python\requirements-wheel-test.txt || 
exit /B 1
 
 @REM Install the built wheels
-%PYTHON_CMD% -m pip install --no-index --find-links=C:\arrow\python\dist\ 
pyarrow || exit /B 1
+%PYTHON_CMD% -m pip install --no-index 
--find-links=C:\arrow\python\repaired_wheels pyarrow || exit /B 1
 
 @REM Test that the modules are importable
 %PYTHON_CMD% -c "import pyarrow" || exit /B 1
@@ -65,7 +65,7 @@ set PYTHON_CMD=py -%PYTHON%
 %PYTHON_CMD% -c "import pyarrow.substrait" || exit /B 1
 
 @REM Validate wheel contents
-%PYTHON_CMD% C:\arrow\ci\scripts\python_wheel_validate_contents.py --path 
C:\arrow\python\dist || exit /B 1
+%PYTHON_CMD% C:\arrow\ci\scripts\python_wheel_validate_contents.py --path 
C:\arrow\python\repaired_wheels || exit /B 1
 
 @rem Download IANA Timezone Database for ORC C++
 curl https://cygwin.osuosl.org/noarch/release/tzdata/tzdata-2024a-1.tar.xz 
--output tzdata.tar.xz || exit /B
diff --git a/dev/tasks/python-wheels/github.windows.yml 
b/dev/tasks/python-wheels/github.windows.yml
index 41585045f6..de0efedbff 100644
--- a/dev/tasks/python-wheels/github.windows.yml
+++ b/dev/tasks/python-wheels/github.windows.yml
@@ -63,7 +63,7 @@ jobs:
       - uses: actions/upload-artifact@v4
         with:
           name: wheel
-          path: arrow/python/dist/*.whl
+          path: arrow/python/repaired_wheels/*.whl
 
       - name: Test wheel
         shell: cmd
@@ -71,9 +71,9 @@ jobs:
           cd arrow
           archery docker run python-wheel-windows-test
 
-      {{ macros.github_upload_releases("arrow/python/dist/*.whl")|indent }}
-      {{ macros.github_upload_gemfury("arrow/python/dist/*.whl")|indent }}
-      {{ 
macros.github_upload_wheel_scientific_python("arrow/python/dist/*.whl")|indent 
}}
+      {{ 
macros.github_upload_releases("arrow/python/repaired_wheels/*.whl")|indent }}
+      {{ 
macros.github_upload_gemfury("arrow/python/repaired_wheels/*.whl")|indent }}
+      {{ 
macros.github_upload_wheel_scientific_python("arrow/repaired_wheels/repaired_wheels/*.whl")|indent
 }}
 
       {% if arrow.is_default_branch() %}
       - name: Push Docker Image

Reply via email to