feat: auto32/auto64 (#553)
* feat: auto32/auto64 * refactor: cleanup from @joerick * refactor: spelling fix
This commit is contained in:
@@ -102,7 +102,7 @@ Options
|
|||||||
|---|--------|-------------|
|
|---|--------|-------------|
|
||||||
| **Build selection** | [`CIBW_PLATFORM`](https://cibuildwheel.readthedocs.io/en/stable/options/#platform) | Override the auto-detected target platform |
|
| **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) <br> [`CIBW_SKIP`](https://cibuildwheel.readthedocs.io/en/stable/options/#build-skip) | Choose the Python versions to build |
|
| | [`CIBW_BUILD`](https://cibuildwheel.readthedocs.io/en/stable/options/#build-skip) <br> [`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 |
|
| | [`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 |
|
| **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. |
|
| | [`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. |
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ def main() -> None:
|
|||||||
on this machine. Set this option to build an architecture
|
on this machine. Set this option to build an architecture
|
||||||
via emulation, for example, using binfmt_misc and QEMU.
|
via emulation, for example, using binfmt_misc and QEMU.
|
||||||
Default: auto.
|
Default: auto.
|
||||||
Choices: auto, native, all, {}
|
Choices: auto, auto64, auto32, native, all, {}
|
||||||
'''.format(", ".join(a.name for a in Architecture)))
|
'''.format(", ".join(a.name for a in Architecture)))
|
||||||
parser.add_argument('--output-dir',
|
parser.add_argument('--output-dir',
|
||||||
default=os.environ.get('CIBW_OUTPUT_DIR', 'wheelhouse'),
|
default=os.environ.get('CIBW_OUTPUT_DIR', 'wheelhouse'),
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import re
|
|||||||
from enum import Enum
|
from enum import Enum
|
||||||
from typing import Set
|
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'}
|
PRETTY_NAMES = {'linux': 'Linux', 'macos': 'macOS', 'windows': 'Windows'}
|
||||||
|
|
||||||
@@ -44,6 +44,10 @@ class Architecture(Enum):
|
|||||||
result.add(Architecture(platform_module.machine()))
|
result.add(Architecture(platform_module.machine()))
|
||||||
elif arch_str == 'all':
|
elif arch_str == 'all':
|
||||||
result |= Architecture.all_archs(platform=platform)
|
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:
|
else:
|
||||||
result.add(Architecture(arch_str))
|
result.add(Architecture(arch_str))
|
||||||
return result
|
return result
|
||||||
@@ -77,6 +81,18 @@ class Architecture(Enum):
|
|||||||
else:
|
else:
|
||||||
assert_never(platform)
|
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(
|
def allowed_architectures_check(
|
||||||
platform: PlatformName,
|
platform: PlatformName,
|
||||||
|
|||||||
+13
-10
@@ -172,6 +172,8 @@ Options:
|
|||||||
- macOS: `x86_64` `arm64` `universal2`
|
- macOS: `x86_64` `arm64` `universal2`
|
||||||
- Windows: `AMD64` `x86`
|
- Windows: `AMD64` `x86`
|
||||||
- `auto`: The default archs for your machine - see the table below.
|
- `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).
|
- `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
|
- `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
|
to use [CIBW_BUILD](#build-skip) with this option to target specific
|
||||||
@@ -179,18 +181,23 @@ Options:
|
|||||||
|
|
||||||
Default: `auto`
|
Default: `auto`
|
||||||
|
|
||||||
| Runner | `native` | `auto`
|
| Runner | `native` | `auto` | `auto64` | `auto32` |
|
||||||
|---|---|---
|
|---|---|---|---|---|
|
||||||
| Linux / Intel | `x86_64` | `x86_64` `i686`
|
| Linux / Intel | `x86_64` | `x86_64` `i686` | `x86_64` | `i686` |
|
||||||
| Windows / Intel | `AMD64` | `AMD64` `x86`
|
| Windows / Intel | `AMD64` | `AMD64` `x86` | `AMD64` | `x86` |
|
||||||
| macOS / Intel | `x86_64` | `x86_64`
|
| macOS / Intel | `x86_64` | `x86_64` | `x86_64` | |
|
||||||
| macOS / Apple Silicon | `arm64` | `arm64` `universal2`
|
| macOS / Apple Silicon | `arm64` | `arm64` `universal2` | `arm64` `universal2`| |
|
||||||
|
|
||||||
If not listed above, `auto` is the same as `native`.
|
If not listed above, `auto` is the same as `native`.
|
||||||
|
|
||||||
[setup-qemu-action]: https://github.com/docker/setup-qemu-action
|
[setup-qemu-action]: https://github.com/docker/setup-qemu-action
|
||||||
[binfmt]: https://hub.docker.com/r/tonistiigi/binfmt
|
[binfmt]: https://hub.docker.com/r/tonistiigi/binfmt
|
||||||
|
|
||||||
|
Platform-specific variants also available:<br/>
|
||||||
|
`CIBW_ARCHS_MACOS` | `CIBW_ARCHS_WINDOWS` | `CIBW_ARCHS_LINUX`
|
||||||
|
|
||||||
|
This option can also be set using the [command-line option](#command-line) `--archs`.
|
||||||
|
|
||||||
#### Examples
|
#### Examples
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
@@ -203,10 +210,6 @@ CIBW_ARCHS_MACOS: "x86_64 universal2 arm64"
|
|||||||
CIBW_ARCHS_LINUX: "auto aarch64"
|
CIBW_ARCHS_LINUX: "auto aarch64"
|
||||||
```
|
```
|
||||||
|
|
||||||
Platform-specific variants also available:<br/>
|
|
||||||
`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}
|
### `CIBW_PROJECT_REQUIRES_PYTHON` {: #requires-python}
|
||||||
> Manually set the Python compatibility of your project
|
> Manually set the Python compatibility of your project
|
||||||
|
|||||||
@@ -131,6 +131,39 @@ def test_archs_platform_native(platform, intercepted_build_args, monkeypatch):
|
|||||||
assert build_options.architectures == {Architecture.x86_64}
|
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):
|
def test_archs_platform_all(platform, intercepted_build_args, monkeypatch):
|
||||||
monkeypatch.setenv('CIBW_ARCHS', 'all')
|
monkeypatch.setenv('CIBW_ARCHS', 'all')
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user