Skip to content

Commit ff8f881

Browse files
committed
refactor: pull arch out into separate file
1 parent f5b8479 commit ff8f881

File tree

6 files changed

+94
-91
lines changed

6 files changed

+94
-91
lines changed

cibuildwheel/__main__.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,15 @@
1111
import cibuildwheel.linux
1212
import cibuildwheel.macos
1313
import cibuildwheel.windows
14+
from cibuildwheel.architecture import Architecture, allowed_architectures_check
1415
from cibuildwheel.environment import EnvironmentParseError, parse_environment
1516
from cibuildwheel.typing import PLATFORMS, PlatformName, assert_never
1617
from cibuildwheel.util import (
17-
Architecture,
1818
BuildOptions,
1919
BuildSelector,
2020
DependencyConstraints,
2121
TestSelector,
2222
Unbuffered,
23-
allowed_architectures_check,
2423
detect_ci_provider,
2524
resources_dir,
2625
)
@@ -259,7 +258,7 @@ def main() -> None:
259258
print_preamble(platform, build_options)
260259

261260
try:
262-
allowed_architectures_check(platform, build_options)
261+
allowed_architectures_check(platform, build_options.architectures)
263262
except ValueError as err:
264263
print("cibuildwheel:", *err.args, file=sys.stderr)
265264
sys.exit(4)

cibuildwheel/architecture.py

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
import functools
2+
import platform as platform_module
3+
import re
4+
from enum import Enum
5+
from typing import Set
6+
7+
from .typing import PlatformName, assert_never
8+
9+
PRETTY_NAMES = {'linux': 'Linux', 'macos': 'macOS', 'windows': 'Windows'}
10+
11+
12+
@functools.total_ordering
13+
class Architecture(Enum):
14+
value: str
15+
16+
# mac/linux archs
17+
x86_64 = 'x86_64'
18+
i686 = 'i686'
19+
aarch64 = 'aarch64'
20+
ppc64le = 'ppc64le'
21+
s390x = 's390x'
22+
23+
# windows archs
24+
x86 = 'x86'
25+
AMD64 = 'AMD64'
26+
27+
# Allow this to be sorted
28+
def __lt__(self, other: "Architecture") -> bool:
29+
return self.value < other.value
30+
31+
@staticmethod
32+
def parse_config(config: str, platform: PlatformName) -> 'Set[Architecture]':
33+
result = set()
34+
for arch_str in re.split(r'[\s,]+', config):
35+
if arch_str == 'auto':
36+
result |= Architecture.auto_archs(platform=platform)
37+
elif arch_str == 'native':
38+
result.add(Architecture(platform_module.machine()))
39+
elif arch_str == 'all':
40+
result |= Architecture.all_archs(platform=platform)
41+
else:
42+
result.add(Architecture(arch_str))
43+
return result
44+
45+
@staticmethod
46+
def auto_archs(platform: PlatformName) -> 'Set[Architecture]':
47+
native_architecture = Architecture(platform_module.machine())
48+
result = {native_architecture}
49+
if platform == 'linux' and native_architecture == Architecture.x86_64:
50+
# x86_64 machines can run i686 docker containers
51+
result.add(Architecture.i686)
52+
if platform == 'windows' and native_architecture == Architecture.AMD64:
53+
result.add(Architecture.x86)
54+
return result
55+
56+
@staticmethod
57+
def all_archs(platform: PlatformName) -> 'Set[Architecture]':
58+
if platform == 'linux':
59+
return {Architecture.x86_64, Architecture.i686, Architecture.aarch64, Architecture.ppc64le, Architecture.s390x}
60+
elif platform == 'macos':
61+
return {Architecture.x86_64}
62+
elif platform == 'windows':
63+
return {Architecture.x86, Architecture.AMD64}
64+
else:
65+
assert_never(platform)
66+
67+
68+
def allowed_architectures_check(
69+
platform: PlatformName,
70+
architectures: Set[Architecture],
71+
) -> None:
72+
73+
allowed_architectures = Architecture.all_archs(platform)
74+
75+
msg = f'{PRETTY_NAMES[platform]} only supports {sorted(allowed_architectures)} at the moment.'
76+
77+
if platform != 'linux':
78+
msg += ' If you want to set emulation architectures on Linux, use CIBW_ARCHS_LINUX instead.'
79+
80+
if not architectures <= allowed_architectures:
81+
msg = f'Invalid archs option {architectures}. ' + msg
82+
raise ValueError(msg)
83+
84+
if not architectures:
85+
msg = 'Empty archs option set. ' + msg
86+
raise ValueError(msg)

cibuildwheel/linux.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@
44
from pathlib import Path, PurePath
55
from typing import List, NamedTuple, Set
66

7+
from .architecture import Architecture
78
from .docker_container import DockerContainer
89
from .logger import log
910
from .typing import PathOrStr
1011
from .util import (
11-
Architecture,
1212
BuildOptions,
1313
BuildSelector,
1414
NonPlatformWheelError,

cibuildwheel/util.py

Lines changed: 2 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
import fnmatch
2-
import functools
32
import itertools
43
import os
5-
import platform as platform_module
6-
import re
74
import ssl
85
import sys
96
import textwrap
@@ -17,8 +14,9 @@
1714
import certifi
1815
import toml
1916

17+
from .architecture import Architecture
2018
from .environment import ParsedEnvironment
21-
from .typing import PathOrStr, PlatformName, assert_never
19+
from .typing import PathOrStr, PlatformName
2220

2321
if sys.version_info < (3, 9):
2422
from importlib_resources import files
@@ -163,62 +161,6 @@ def __repr__(self) -> str:
163161
return f'{self.__class__.__name__}{self.base_file_path!r})'
164162

165163

166-
@functools.total_ordering
167-
class Architecture(Enum):
168-
value: str
169-
170-
# mac/linux archs
171-
x86_64 = 'x86_64'
172-
i686 = 'i686'
173-
aarch64 = 'aarch64'
174-
ppc64le = 'ppc64le'
175-
s390x = 's390x'
176-
177-
# windows archs
178-
x86 = 'x86'
179-
AMD64 = 'AMD64'
180-
181-
# Allow this to be sorted
182-
def __lt__(self, other: "Architecture") -> bool:
183-
return self.value < other.value
184-
185-
@staticmethod
186-
def parse_config(config: str, platform: PlatformName) -> 'Set[Architecture]':
187-
result = set()
188-
for arch_str in re.split(r'[\s,]+', config):
189-
if arch_str == 'auto':
190-
result |= Architecture.auto_archs(platform=platform)
191-
elif arch_str == 'native':
192-
result.add(Architecture(platform_module.machine()))
193-
elif arch_str == 'all':
194-
result |= Architecture.all_archs(platform=platform)
195-
else:
196-
result.add(Architecture(arch_str))
197-
return result
198-
199-
@staticmethod
200-
def auto_archs(platform: PlatformName) -> 'Set[Architecture]':
201-
native_architecture = Architecture(platform_module.machine())
202-
result = {native_architecture}
203-
if platform == 'linux' and native_architecture == Architecture.x86_64:
204-
# x86_64 machines can run i686 docker containers
205-
result.add(Architecture.i686)
206-
if platform == 'windows' and native_architecture == Architecture.AMD64:
207-
result.add(Architecture.x86)
208-
return result
209-
210-
@staticmethod
211-
def all_archs(platform: PlatformName) -> 'Set[Architecture]':
212-
if platform == 'linux':
213-
return {Architecture.x86_64, Architecture.i686, Architecture.aarch64, Architecture.ppc64le, Architecture.s390x}
214-
elif platform == 'macos':
215-
return {Architecture.x86_64}
216-
elif platform == 'windows':
217-
return {Architecture.x86, Architecture.AMD64}
218-
else:
219-
assert_never(platform)
220-
221-
222164
class BuildOptions(NamedTuple):
223165
package_dir: Path
224166
output_dir: Path
@@ -286,27 +228,3 @@ def detect_ci_provider() -> Optional[CIProvider]:
286228
return CIProvider.other
287229
else:
288230
return None
289-
290-
291-
PRETTY_NAMES = {'linux': 'Linux', 'macos': 'macOS', 'windows': 'Windows'}
292-
293-
294-
def allowed_architectures_check(
295-
platform: PlatformName,
296-
options: BuildOptions,
297-
) -> None:
298-
299-
allowed_architectures = Architecture.all_archs(platform)
300-
301-
msg = f'{PRETTY_NAMES[platform]} only supports {sorted(allowed_architectures)} at the moment.'
302-
303-
if platform != 'linux':
304-
msg += ' If you want to set emulation architectures on Linux, use CIBW_ARCHS_LINUX instead.'
305-
306-
if not options.architectures <= allowed_architectures:
307-
msg = f'Invalid archs option {options.architectures}. ' + msg
308-
raise ValueError(msg)
309-
310-
if not options.architectures:
311-
msg = 'Empty archs option set. ' + msg
312-
raise ValueError(msg)

cibuildwheel/windows.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@
99

1010
import toml
1111

12+
from .architecture import Architecture
1213
from .environment import ParsedEnvironment
1314
from .logger import log
1415
from .typing import PathOrStr
1516
from .util import (
16-
Architecture,
1717
BuildOptions,
1818
BuildSelector,
1919
NonPlatformWheelError,

unit_test/main_tests/main_platform_test.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,9 @@ def test_archs_argument(platform, intercepted_build_args, monkeypatch, use_env_v
8989
monkeypatch.setattr(sys, 'argv', sys.argv + ['--archs', 'ppc64le'])
9090

9191
if platform in {'macos', 'windows'}:
92-
with pytest.raises(SystemExit) as err:
92+
with pytest.raises(SystemExit) as exit:
9393
main()
94-
assert err.value.args == (4,)
94+
assert exit.value.args == (4,)
9595

9696
else:
9797
main()

0 commit comments

Comments
 (0)