From 8e8935bb30bc0d10e70c5e81ce8d7adf7f65dd4a Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Thu, 21 Jan 2021 12:55:42 -0500 Subject: [PATCH] feat: auto32/auto64 --- cibuildwheel/__main__.py | 2 +- cibuildwheel/util.py | 26 +++++++++++++++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/cibuildwheel/__main__.py b/cibuildwheel/__main__.py index f5a7ace99..6078aa2b2 100644 --- a/cibuildwheel/__main__.py +++ b/cibuildwheel/__main__.py @@ -77,7 +77,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/util.py b/cibuildwheel/util.py index 33435c16e..edbe36d43 100644 --- a/cibuildwheel/util.py +++ b/cibuildwheel/util.py @@ -18,7 +18,7 @@ import toml from .environment import ParsedEnvironment -from .typing import PathOrStr, PlatformName, assert_never +from .typing import Literal, PathOrStr, PlatformName, assert_never if sys.version_info < (3, 9): from importlib_resources import files @@ -192,6 +192,10 @@ def parse_config(config: str, platform: PlatformName) -> 'Set[Architecture]': result.add(Architecture(platform_module.machine())) elif arch_str == 'all': result |= Architecture.all_archs(platform=platform) + elif arch_str == "auto64": + result |= Architecture.bitiness_archs(platform=platform, bitiness="64") + elif arch_str == "auto32": + result |= Architecture.bitiness_archs(platform=platform, bitiness="32") else: result.add(Architecture(arch_str)) return result @@ -218,6 +222,26 @@ def all_archs(platform: PlatformName) -> 'Set[Architecture]': else: assert_never(platform) + @staticmethod + def bitiness_archs(platform: PlatformName, bitiness: Literal["64", "32"]) -> 'Set[Architecture]': + native_architecture = Architecture(platform_module.machine()) + + if native_architecture in {Architecture.x86_64, Architecture.aarch64, Architecture.ppc64le, Architecture.s390x, Architecture.AMD64}: + if bitiness == "64": + return {native_architecture} + else: + if native_architecture == Architecture.x86_64 and platform != "macos": + return {Architecture.i686} + elif native_architecture == Architecture.AMD64: + return {Architecture.x86} + else: + return set() + elif native_architecture in {Architecture.i686, Architecture.x86}: + return {native_architecture} if bitiness == "32" else set() + else: + # assert_never should work here + raise RuntimeError("Cannot be reached") + class BuildOptions(NamedTuple): package_dir: Path