diff --git a/.env b/.env index 44b9db8aef02..6051a4338739 100644 --- a/.env +++ b/.env @@ -98,5 +98,5 @@ VCPKG="9b965a116838c6cdcd36bca60d1b81b030c8ab8d" # 2026.05.27 (not release, u # ci/docker/python-*-windows-*.dockerfile or the vcpkg config. # This is a workaround for our CI problem that "archery docker build" doesn't # use pulled built images in dev/tasks/python-wheels/github.windows.yml. -PYTHON_WHEEL_WINDOWS_IMAGE_REVISION=2026-06-03 -PYTHON_WHEEL_WINDOWS_TEST_IMAGE_REVISION=2026-06-03 +PYTHON_WHEEL_WINDOWS_IMAGE_REVISION=2026-07-13 +PYTHON_WHEEL_WINDOWS_TEST_IMAGE_REVISION=2026-07-13 diff --git a/ci/conda_env_python.txt b/ci/conda_env_python.txt index dd16d66b725d..a0dca4eac172 100644 --- a/ci/conda_env_python.txt +++ b/ci/conda_env_python.txt @@ -29,5 +29,5 @@ numpy>=1.16.6 pytest pytest-faulthandler s3fs>=2023.10.0 -scikit-build-core +scikit-build-core>=1.0 setuptools_scm>=8 diff --git a/python/_build_backend/__init__.py b/python/_build_backend/__init__.py deleted file mode 100644 index 6e5c328a69ff..000000000000 --- a/python/_build_backend/__init__.py +++ /dev/null @@ -1,68 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -""" -Build backend wrapper that resolves license symlinks before delegating -to scikit-build-core. - -Arrow's LICENSE.txt and NOTICE.txt live at the repository root, one level -above python/. They are symlinked into python/ so that license-files in -pyproject.toml can reference them otherwise project metadata fails validation. -This is done before any build backend is invoked that's why symlinks are necessary. -But when building sdist tarballs symlinks are not copied and we end up with -broken LICENSE.txt and NOTICE.txt. - -This custom build backend replaces the symlinks with actual file copies before -scikit_build_core.build.build_sdist so that the sdist contains the real file content. -The symlinks are restored afterwards to keep the git working tree clean. -""" - -from contextlib import contextmanager -import os -from pathlib import Path -import shutil -import sys - -from scikit_build_core.build import * # noqa: F401,F403 -from scikit_build_core.build import build_sdist as scikit_build_sdist - -LICENSE_FILES = ("LICENSE.txt", "NOTICE.txt") -PYTHON_DIR = Path(__file__).resolve().parent.parent - - -@contextmanager -def prepare_licenses(): - # Temporarily copy the files so they are included on sdist. - for name in LICENSE_FILES: - parent_license = PYTHON_DIR.parent / name - pyarrow_license = PYTHON_DIR / name - pyarrow_license.unlink(missing_ok=True) - shutil.copy2(parent_license, pyarrow_license) - try: - yield - finally: - if sys.platform != "win32": - # Copy back the original symlinks so git status is clean. - for name in LICENSE_FILES: - filepath = PYTHON_DIR / name - os.unlink(filepath) - os.symlink(f"../{name}", filepath) - - -def build_sdist(sdist_directory, config_settings=None): - with prepare_licenses(): - return scikit_build_sdist(sdist_directory, config_settings) diff --git a/python/pyproject.toml b/python/pyproject.toml index 86c907a3db6f..ab6f2e6061c1 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -17,17 +17,14 @@ [build-system] requires = [ - "scikit-build-core", + "scikit-build-core >= 1.0", "cython >= 3.1", # Needed for build-time stub docstring extraction "libcst>=1.8.6", "numpy>=1.25", "setuptools_scm[toml]>=8", ] -# We use a really simple build backend wrapper over scikit-build-core -# to solve licenses to work around links not being included in sdists. -build-backend = "_build_backend" -backend-path = ["."] +build-backend = "scikit_build_core.build" [project] name = "pyarrow" @@ -94,6 +91,10 @@ wheel.install-dir = "pyarrow" # in-tree for CI type-checking. wheel.exclude = ["pyarrow/py.typed"] +[tool.scikit-build.sdist.force-include] +"../LICENSE.txt" = "LICENSE.txt" +"../NOTICE.txt" = "NOTICE.txt" + [tool.scikit-build.cmake.define] PYARROW_BUNDLE_ARROW_CPP = {env = "PYARROW_BUNDLE_ARROW_CPP", default = "OFF"} PYARROW_BUNDLE_CYTHON_CPP = {env = "PYARROW_BUNDLE_CYTHON_CPP", default = "OFF"} diff --git a/python/requirements-build.txt b/python/requirements-build.txt index fdd3e68a1b16..2ed711613b41 100644 --- a/python/requirements-build.txt +++ b/python/requirements-build.txt @@ -2,5 +2,5 @@ build cython>=3.1 libcst>=1.8.6 numpy>=1.25 -scikit-build-core +scikit-build-core>=1.0 setuptools_scm>=8 diff --git a/python/requirements-wheel-build.txt b/python/requirements-wheel-build.txt index a3ac13967729..3d1d1c9b8db8 100644 --- a/python/requirements-wheel-build.txt +++ b/python/requirements-wheel-build.txt @@ -3,6 +3,6 @@ cython>=3.1 # Needed for build-time stub docstring extraction libcst>=1.8.6 numpy>=2.0.0 -scikit-build-core +scikit-build-core>=1.0 setuptools_scm wheel