fix: drop Python 2.7 on Windows using 2008 compiler

This commit is contained in:
Henry Schreiner
2021-04-25 00:55:16 -04:00
committed by Henry Schreiner
parent f27943608b
commit 22d473acc0
12 changed files with 21 additions and 57 deletions
-5
View File
@@ -39,11 +39,6 @@ jobs:
run: | run: |
python -m pip install -e ".[dev]" python -m pip install -e ".[dev]"
- name: Install Visual C++ for Python 2.7
if: runner.os == 'Windows'
run: |
choco upgrade vcpython27 -y
- name: Get PR labels - name: Get PR labels
id: pr-labels id: pr-labels
uses: joerick/pr-labels-action@v1.0.6 uses: joerick/pr-labels-action@v1.0.6
+1 -1
View File
@@ -34,7 +34,7 @@ What does it do?
| PyPy 3.6 v7.3.3 | ✅ | | | ✅ | ✅ | | | | | | PyPy 3.6 v7.3.3 | ✅ | | | ✅ | ✅ | | | | |
| PyPy 3.7 (beta) v7.3.3 | ✅ | | | ✅ | ✅ | | | | | | PyPy 3.7 (beta) v7.3.3 | ✅ | | | ✅ | ✅ | | | | |
<sup>¹ Not supported on Travis</sup><br> <sup>¹ Only using a workaround with a newer compiler; Microsoft removed the 2008 compiler for Python 2.7 in April 2021.</sup><br>
- Builds manylinux, macOS 10.9+, and Windows wheels for CPython and PyPy - Builds manylinux, macOS 10.9+, and Windows wheels for CPython and PyPy
- Works on GitHub Actions, Azure Pipelines, Travis CI, AppVeyor, CircleCI, and GitLab CI - Works on GitHub Actions, Azure Pipelines, Travis CI, AppVeyor, CircleCI, and GitLab CI
-4
View File
@@ -26,8 +26,6 @@ jobs:
- task: UsePythonVersion@0 - task: UsePythonVersion@0
inputs: inputs:
versionSpec: '3.6' versionSpec: '3.6'
- script: choco upgrade vcpython27 -y
displayName: Install Visual C++ for Python 2.7
- bash: | - bash: |
python -m pip install -e ".[dev]" pytest-azurepipelines python -m pip install -e ".[dev]" pytest-azurepipelines
python ./bin/run_tests.py python ./bin/run_tests.py
@@ -39,8 +37,6 @@ jobs:
- task: UsePythonVersion@0 - task: UsePythonVersion@0
inputs: inputs:
versionSpec: '3.8' versionSpec: '3.8'
- script: choco upgrade vcpython27 -y
displayName: Install Visual C++ for Python 2.7
- bash: | - bash: |
python -m pip install -e ".[dev]" pytest-azurepipelines python -m pip install -e ".[dev]" pytest-azurepipelines
python ./bin/run_tests.py python ./bin/run_tests.py
+2 -4
View File
@@ -25,7 +25,6 @@ from .util import (
) )
IS_RUNNING_ON_AZURE = Path('C:\\hostedtoolcache').exists() IS_RUNNING_ON_AZURE = Path('C:\\hostedtoolcache').exists()
IS_RUNNING_ON_TRAVIS = os.environ.get('TRAVIS_OS_NAME') == 'windows'
def call(args: Sequence[PathOrStr], env: Optional[Dict[str, str]] = None, def call(args: Sequence[PathOrStr], env: Optional[Dict[str, str]] = None,
@@ -69,10 +68,9 @@ def get_python_configurations(
'64': Architecture.AMD64, '64': Architecture.AMD64,
} }
# Only supported with custom compiler, since MS removed the 2008 compiler download
custom_compiler = os.environ.get('DISTUTILS_USE_SDK') and os.environ.get('MSSdk') custom_compiler = os.environ.get('DISTUTILS_USE_SDK') and os.environ.get('MSSdk')
if IS_RUNNING_ON_TRAVIS and not custom_compiler: if not custom_compiler:
# cannot install VCForPython27.msi which is needed for compiling C software
# try with (and similar): msiexec /i VCForPython27.msi ALLUSERS=1 ACCEPT=YES /passive
python_configurations = [c for c in python_configurations if not c.version.startswith('2.7')] python_configurations = [c for c in python_configurations if not c.version.startswith('2.7')]
# skip builds as required # skip builds as required
+2 -2
View File
@@ -30,9 +30,9 @@ For more details see https://en.cppreference.com/w/cpp/compiler_support, https:/
## Windows and Python 2.7 ## Windows and Python 2.7
Visual C++ for Python 2.7 does not support modern C++ standards (i.e., C++11 and later). When building on Appveyor, you will need to either use the "Visual Studio 2017" or "Visual Studio 2019" image, but Python 2.7 is not supported on these images - skip it by setting `CIBW_SKIP=cp27-win*`. Visual C++ for Python 2.7 does not support modern C++ standards (i.e., C++11 and later), and Microsoft has removed the download for the required Visual Studio 2008 needed to build a native extension in April, 2021.
There is an optional workaround for this, though: the pybind11 project argues and shows that it is [possible to compile Python 2.7 extension with a newer compiler](https://pybind11.readthedocs.io/en/stable/faq.html#working-with-ancient-visual-studio-2008-builds-on-windows) and has an example project showing how to do this: https://github.com/pybind/python_example. The main catch is that a user might need to install [a newer "Microsoft Visual C++ Redistributable"](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads), since the newer C++ standard library's binaries are not included by default with the Python 2.7 installation. There is an optional workaround, though: the pybind11 project argues and shows that it is [possible to compile Python 2.7 extension with a newer compiler](https://pybind11.readthedocs.io/en/stable/faq.html#working-with-ancient-visual-studio-2008-builds-on-windows) and has an example project showing how to do this: https://github.com/pybind/python_example. The main catch is that a user might need to install [a newer "Microsoft Visual C++ Redistributable"](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads), since the newer C++ standard library's binaries are not included by default with the Python 2.7 installation.
Forcing `distutils` or `setuptools` to use a more recent version of MSVC that supports modern C++ can be done in the following way: Forcing `distutils` or `setuptools` to use a more recent version of MSVC that supports modern C++ can be done in the following way:
-8
View File
@@ -45,10 +45,6 @@ To build Linux, Mac, and Windows wheels using GitHub Actions, create a `.github/
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: Install Visual C++ for Python 2.7
if: runner.os == 'Windows'
run: choco upgrade vcpython27 -y
- name: Build wheels - name: Build wheels
run: pipx run cibuildwheel==1.10.0 run: pipx run cibuildwheel==1.10.0
@@ -87,10 +83,6 @@ To build Linux, Mac, and Windows wheels using GitHub Actions, create a `.github/
- name: Install cibuildwheel - name: Install cibuildwheel
run: python -m pip install cibuildwheel==1.10.0 run: python -m pip install cibuildwheel==1.10.0
- name: Install Visual C++ for Python 2.7
if: runner.os == 'Windows'
run: choco upgrade vcpython27 -y
- name: Build wheels - name: Build wheels
run: python -m cibuildwheel --output-dir wheelhouse run: python -m cibuildwheel --output-dir wheelhouse
-2
View File
@@ -31,8 +31,6 @@ jobs:
pool: {vmImage: 'vs2017-win2016'} pool: {vmImage: 'vs2017-win2016'}
steps: steps:
- task: UsePythonVersion@0 - task: UsePythonVersion@0
- script: choco upgrade vcpython27 -y
displayName: Install Visual C++ for Python 2.7
- bash: | - bash: |
set -o errexit set -o errexit
python -m pip install --upgrade pip python -m pip install --upgrade pip
-4
View File
@@ -26,10 +26,6 @@ jobs:
with: with:
python-version: '3.8' python-version: '3.8'
- name: Install Visual C++ for Python 2.7
if: runner.os == 'Windows'
run: choco upgrade vcpython27 -y
- name: Build wheels - name: Build wheels
uses: joerick/cibuildwheel@v1.10.0 uses: joerick/cibuildwheel@v1.10.0
-4
View File
@@ -13,10 +13,6 @@ jobs:
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: Install Visual C++ for Python 2.7
if: runner.os == 'Windows'
run: choco upgrade vcpython27 -y
- name: Build wheels - name: Build wheels
uses: joerick/cibuildwheel@v1.10.0 uses: joerick/cibuildwheel@v1.10.0
# to supply options, put them in 'env', like: # to supply options, put them in 'env', like:
-4
View File
@@ -18,10 +18,6 @@ jobs:
with: with:
python-version: '3.7' python-version: '3.7'
- name: Install Visual C++ for Python 2.7
if: runner.os == 'Windows'
run: choco upgrade vcpython27 -y
- name: Set up QEMU - name: Set up QEMU
if: runner.os == 'Linux' if: runner.os == 'Linux'
uses: docker/setup-qemu-action@v1 uses: docker/setup-qemu-action@v1
+3 -3
View File
@@ -51,8 +51,8 @@ def test_pinned_versions(tmp_path, python_version):
if utils.platform == 'linux': if utils.platform == 'linux':
pytest.skip('linux doesn\'t pin individual tool versions, it pins manylinux images instead') pytest.skip('linux doesn\'t pin individual tool versions, it pins manylinux images instead')
if utils.IS_WINDOWS_RUNNING_ON_TRAVIS and python_version == '2.7': if utils.platform == 'windows' and python_version == '2.7':
pytest.skip('Windows + Travis CI requires a workaround') pytest.skip('Windows requires a workaround')
is_running_on_macos_11_or_later = ( is_running_on_macos_11_or_later = (
utils.platform == 'macos' and utils.get_macos_version() >= (10, 16) utils.platform == 'macos' and utils.get_macos_version() >= (10, 16)
@@ -123,7 +123,7 @@ def test_dependency_constraints_file(tmp_path, python_version):
if utils.platform == 'linux': if utils.platform == 'linux':
pytest.skip('linux doesn\'t pin individual tool versions, it pins manylinux images instead') pytest.skip('linux doesn\'t pin individual tool versions, it pins manylinux images instead')
if utils.IS_WINDOWS_RUNNING_ON_TRAVIS and python_version == '2.7': if utils.platform == 'windows' and python_version == '2.7':
pytest.skip('Windows + Travis CI requires a workaround') pytest.skip('Windows + Travis CI requires a workaround')
project_dir = tmp_path / 'project' project_dir = tmp_path / 'project'
+13 -16
View File
@@ -12,7 +12,18 @@ import sys
from contextlib import contextmanager from contextlib import contextmanager
from tempfile import mkdtemp from tempfile import mkdtemp
IS_WINDOWS_RUNNING_ON_TRAVIS = os.environ.get('TRAVIS_OS_NAME') == 'windows' platform: str
if 'CIBW_PLATFORM' in os.environ:
platform = os.environ['CIBW_PLATFORM']
elif sys.platform.startswith('linux'):
platform = 'linux'
elif sys.platform.startswith('darwin'):
platform = 'macos'
elif sys.platform in ['win32', 'cygwin']:
platform = 'windows'
else:
raise Exception('Unsupported platform')
# Python 2 does not have a tempfile.TemporaryDirectory context manager # Python 2 does not have a tempfile.TemporaryDirectory context manager
@@ -91,7 +102,7 @@ def _get_arm64_macosx_deployment_target(macosx_deployment_target: str) -> str:
def expected_wheels(package_name, package_version, manylinux_versions=None, def expected_wheels(package_name, package_version, manylinux_versions=None,
macosx_deployment_target='10.9', machine_arch=None, *, macosx_deployment_target='10.9', machine_arch=None, *,
exclude_27=IS_WINDOWS_RUNNING_ON_TRAVIS): exclude_27=platform == 'windows'):
''' '''
Returns a list of expected wheels from a run of cibuildwheel. Returns a list of expected wheels from a run of cibuildwheel.
''' '''
@@ -187,17 +198,3 @@ def get_macos_version():
''' '''
version_str, _, _ = pm.mac_ver() version_str, _, _ = pm.mac_ver()
return tuple(map(int, version_str.split(".")[:2])) return tuple(map(int, version_str.split(".")[:2]))
platform = None
if 'CIBW_PLATFORM' in os.environ:
platform = os.environ['CIBW_PLATFORM']
elif sys.platform.startswith('linux'):
platform = 'linux'
elif sys.platform.startswith('darwin'):
platform = 'macos'
elif sys.platform in ['win32', 'cygwin']:
platform = 'windows'
else:
raise Exception('Unsupported platform')