From 70d9e1d9699d24c99926ab6586869a92452991a7 Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Sun, 31 Jan 2021 20:41:18 -0500 Subject: [PATCH] feat: auto32/auto64 (#553) * feat: auto32/auto64 * refactor: cleanup from @joerick * refactor: spelling fix --- README.md | 2 +- cibuildwheel/__main__.py | 2 +- cibuildwheel/architecture.py | 18 +++++++++++- docs/options.md | 23 ++++++++------- unit_test/main_tests/main_platform_test.py | 33 ++++++++++++++++++++++ 5 files changed, 65 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 841b4f3a..6b46c70e 100644 --- a/README.md +++ b/README.md @@ -102,7 +102,7 @@ Options |---|--------|-------------| | **Build selection** | [`CIBW_PLATFORM`](https://cibuildwheel.readthedocs.io/en/stable/options/#platform) | Override the auto-detected target platform | | | [`CIBW_BUILD`](https://cibuildwheel.readthedocs.io/en/stable/options/#build-skip)
[`CIBW_SKIP`](https://cibuildwheel.readthedocs.io/en/stable/options/#build-skip) | Choose the Python versions to build | -| | [`CIBW_ARCHS_LINUX`](https://cibuildwheel.readthedocs.io/en/stable/options/#archs) | Build non-native architectures | +| | [`CIBW_ARCHS`](https://cibuildwheel.readthedocs.io/en/stable/options/#archs) | Change the architectures built on your machine by default | | | [`CIBW_PROJECT_REQUIRES_PYTHON`](https://cibuildwheel.readthedocs.io/en/stable/options/#requires-python) | Manually set the Python compatibility of your project | | **Build customization** | [`CIBW_ENVIRONMENT`](https://cibuildwheel.readthedocs.io/en/stable/options/#environment) | Set environment variables needed during the build | | | [`CIBW_BEFORE_ALL`](https://cibuildwheel.readthedocs.io/en/stable/options/#before-all) | Execute a shell command on the build system before any wheels are built. | diff --git a/cibuildwheel/__main__.py b/cibuildwheel/__main__.py index 33a570c7..bebaf1eb 100644 --- a/cibuildwheel/__main__.py +++ b/cibuildwheel/__main__.py @@ -80,7 +80,7 @@ def main() -> None: on this machine. Set this option to build an architecture via emulation, for example, using binfmt_misc and QEMU. Default: auto. - Choices: auto, native, all, {} + Choices: auto, auto64, auto32, native, all, {} '''.format(", ".join(a.name for a in Architecture))) parser.add_argument('--output-dir', default=os.environ.get('CIBW_OUTPUT_DIR', 'wheelhouse'), diff --git a/cibuildwheel/architecture.py b/cibuildwheel/architecture.py index 63e3a8bc..7aeb7be3 100644 --- a/cibuildwheel/architecture.py +++ b/cibuildwheel/architecture.py @@ -4,7 +4,7 @@ import re from enum import Enum from typing import Set -from .typing import PlatformName, assert_never +from .typing import Literal, PlatformName, assert_never PRETTY_NAMES = {'linux': 'Linux', 'macos': 'macOS', 'windows': 'Windows'} @@ -44,6 +44,10 @@ class Architecture(Enum): result.add(Architecture(platform_module.machine())) elif arch_str == 'all': result |= Architecture.all_archs(platform=platform) + elif arch_str == 'auto64': + result |= Architecture.bitness_archs(platform=platform, bitness="64") + elif arch_str == 'auto32': + result |= Architecture.bitness_archs(platform=platform, bitness="32") else: result.add(Architecture(arch_str)) return result @@ -77,6 +81,18 @@ class Architecture(Enum): else: assert_never(platform) + @staticmethod + def bitness_archs(platform: PlatformName, bitness: Literal['64', '32']) -> 'Set[Architecture]': + archs_32 = {Architecture.i686, Architecture.x86} + auto_archs = Architecture.auto_archs(platform) + + if bitness == '64': + return auto_archs - archs_32 + elif bitness == '32': + return auto_archs & archs_32 + else: + assert_never(bitness) + def allowed_architectures_check( platform: PlatformName, diff --git a/docs/options.md b/docs/options.md index 78ffce92..e55facaf 100644 --- a/docs/options.md +++ b/docs/options.md @@ -172,6 +172,8 @@ Options: - macOS: `x86_64` `arm64` `universal2` - Windows: `AMD64` `x86` - `auto`: The default archs for your machine - see the table below. + - `auto64`: Just the 64-bit auto archs + - `auto32`: Just the 32-bit auto archs - `native`: the native arch of the build machine - Matches [`platform.machine()`](https://docs.python.org/3/library/platform.html#platform.machine). - `all` : expands to all the architectures supported on this OS. You may want to use [CIBW_BUILD](#build-skip) with this option to target specific @@ -179,18 +181,23 @@ Options: Default: `auto` -| Runner | `native` | `auto` -|---|---|--- -| Linux / Intel | `x86_64` | `x86_64` `i686` -| Windows / Intel | `AMD64` | `AMD64` `x86` -| macOS / Intel | `x86_64` | `x86_64` -| macOS / AppleĀ Silicon | `arm64` | `arm64` `universal2` +| Runner | `native` | `auto` | `auto64` | `auto32` | +|---|---|---|---|---| +| Linux / Intel | `x86_64` | `x86_64` `i686` | `x86_64` | `i686` | +| Windows / Intel | `AMD64` | `AMD64` `x86` | `AMD64` | `x86` | +| macOS / Intel | `x86_64` | `x86_64` | `x86_64` | | +| macOS / AppleĀ Silicon | `arm64` | `arm64` `universal2` | `arm64` `universal2`| | If not listed above, `auto` is the same as `native`. [setup-qemu-action]: https://github.com/docker/setup-qemu-action [binfmt]: https://hub.docker.com/r/tonistiigi/binfmt +Platform-specific variants also available:
+ `CIBW_ARCHS_MACOS` | `CIBW_ARCHS_WINDOWS` | `CIBW_ARCHS_LINUX` + +This option can also be set using the [command-line option](#command-line) `--archs`. + #### Examples ```yaml @@ -203,10 +210,6 @@ CIBW_ARCHS_MACOS: "x86_64 universal2 arm64" CIBW_ARCHS_LINUX: "auto aarch64" ``` -Platform-specific variants also available:
-`CIBW_ARCHS_MACOS` | `CIBW_ARCHS_WINDOWS` | `CIBW_ARCHS_LINUX` - -This option can also be set using the [command-line option](#command-line) `--archs`. ### `CIBW_PROJECT_REQUIRES_PYTHON` {: #requires-python} > Manually set the Python compatibility of your project diff --git a/unit_test/main_tests/main_platform_test.py b/unit_test/main_tests/main_platform_test.py index 98bcfcdd..1b37663e 100644 --- a/unit_test/main_tests/main_platform_test.py +++ b/unit_test/main_tests/main_platform_test.py @@ -131,6 +131,39 @@ def test_archs_platform_native(platform, intercepted_build_args, monkeypatch): assert build_options.architectures == {Architecture.x86_64} +def test_archs_platform_auto64(platform, intercepted_build_args, monkeypatch): + monkeypatch.setenv('CIBW_ARCHS', 'auto64') + + main() + build_options = intercepted_build_args.args[0] + + if platform == 'linux': + assert build_options.architectures == {Architecture.x86_64} + elif platform == 'windows': + assert build_options.architectures == {Architecture.AMD64} + elif platform == 'macos': + assert build_options.architectures == {Architecture.x86_64} + + +def test_archs_platform_auto32(platform, intercepted_build_args, monkeypatch): + monkeypatch.setenv('CIBW_ARCHS', 'auto32') + + if platform == 'macos': + with pytest.raises(SystemExit) as exit: + main() + assert exit.value.args == (4,) + + else: + main() + + build_options = intercepted_build_args.args[0] + + if platform == 'linux': + assert build_options.architectures == {Architecture.i686} + elif platform == 'windows': + assert build_options.architectures == {Architecture.x86} + + def test_archs_platform_all(platform, intercepted_build_args, monkeypatch): monkeypatch.setenv('CIBW_ARCHS', 'all')