Skip to content

Commit 550612d

Browse files
henryiiimayeut
andcommitted
feat: Windows filtering and sets
Co-authored-by: Matthieu Darbois <[email protected]>
1 parent 2a73fee commit 550612d

File tree

6 files changed

+48
-31
lines changed

6 files changed

+48
-31
lines changed

cibuildwheel/__main__.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from configparser import ConfigParser
77
from pathlib import Path
88

9-
from typing import Any, Dict, List, Optional, overload
9+
from typing import Any, Dict, List, Optional, Set, overload
1010

1111
import cibuildwheel
1212
import cibuildwheel.linux
@@ -304,13 +304,13 @@ def print_preamble(platform: str, build_options: BuildOptions) -> None:
304304

305305

306306
def print_build_identifiers(
307-
platform: str, build_selector: BuildSelector, architectures: List[Architecture]
307+
platform: str, build_selector: BuildSelector, architectures: Set[Architecture]
308308
) -> None:
309309
python_configurations: List[Any] = []
310310
if platform == 'linux':
311311
python_configurations = cibuildwheel.linux.get_python_configurations(build_selector, architectures)
312312
elif platform == 'windows':
313-
python_configurations = cibuildwheel.windows.get_python_configurations(build_selector)
313+
python_configurations = cibuildwheel.windows.get_python_configurations(build_selector, architectures)
314314
elif platform == 'macos':
315315
python_configurations = cibuildwheel.macos.get_python_configurations(build_selector)
316316

cibuildwheel/linux.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import sys
33
import textwrap
44
from pathlib import Path, PurePath
5-
from typing import List, NamedTuple
5+
from typing import List, NamedTuple, Set
66

77
from .docker_container import DockerContainer
88
from .logger import log
@@ -24,7 +24,7 @@ def path(self) -> PurePath:
2424

2525

2626
def get_python_configurations(
27-
build_selector: BuildSelector, architectures: List[Architecture]
27+
build_selector: BuildSelector, architectures: Set[Architecture]
2828
) -> List[PythonConfiguration]:
2929
python_configurations = [
3030
PythonConfiguration(version='2.7', identifier='cp27-manylinux_x86_64', path_str='/opt/python/cp27-cp27m'),
@@ -61,7 +61,7 @@ def get_python_configurations(
6161
PythonConfiguration(version='3.9', identifier='cp39-manylinux_s390x', path_str='/opt/python/cp39-cp39'),
6262
]
6363

64-
# return all configurations whose arch is in our `architectures` list,
64+
# return all configurations whose arch is in our `architectures` set,
6565
# and match the build/skip rules
6666
return [
6767
c for c in python_configurations

cibuildwheel/macos.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ def setup_python(python_configuration: PythonConfiguration,
187187

188188

189189
def build(options: BuildOptions) -> None:
190-
if options.architectures != [Architecture.x86_64]:
190+
if not options.architectures <= {Architecture.x86_64}:
191191
raise ValueError(textwrap.dedent(f'''
192192
Invalid archs option {options.architectures}. macOS only supports x86_64 for the moment.
193193
If you want to set emulation architectures on Linux, use CIBW_ARCHS_LINUX instead.

cibuildwheel/util.py

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@
22
import platform as platform_module
33
import re
44
import ssl
5+
import functools
56
import textwrap
67
import urllib.request
78
from enum import Enum
89
from fnmatch import fnmatch
910
from pathlib import Path
1011
from time import sleep
11-
from typing import Dict, List, NamedTuple, Optional
12+
from typing import Dict, List, NamedTuple, Optional, Set
1213

1314
import certifi
1415

@@ -124,7 +125,10 @@ def __repr__(self) -> str:
124125
return f'{self.__class__.__name__}{self.base_file_path!r})'
125126

126127

128+
@functools.total_ordering
127129
class Architecture(Enum):
130+
value: str
131+
128132
# mac/linux archs
129133
x86_64 = 'x86_64'
130134
i686 = 'i686'
@@ -136,33 +140,37 @@ class Architecture(Enum):
136140
x86 = 'x86'
137141
AMD64 = 'AMD64'
138142

143+
# Allow this to be sorted
144+
def __lt__(self, other: "Architecture") -> bool:
145+
return self.value < other.value
146+
139147
@staticmethod
140-
def parse_config(config: str, platform: str) -> 'List[Architecture]':
141-
result = []
148+
def parse_config(config: str, platform: str) -> 'Set[Architecture]':
149+
result = set()
142150
for arch_str in re.split(r'[\s,]+', config):
143151
if arch_str == 'auto':
144-
result += Architecture.auto_archs(platform=platform)
152+
result |= Architecture.auto_archs(platform=platform)
145153
else:
146-
result.append(Architecture(arch_str))
154+
result.add(Architecture(arch_str))
147155
return result
148156

149157
@staticmethod
150-
def auto_archs(platform: str) -> 'List[Architecture]':
158+
def auto_archs(platform: str) -> 'Set[Architecture]':
151159
native_architecture = Architecture(platform_module.machine())
152-
result = [native_architecture]
160+
result = {native_architecture}
153161
if platform == 'linux' and native_architecture == Architecture.x86_64:
154162
# x86_64 machines can run i686 docker containers
155-
result.append(Architecture.i686)
163+
result.add(Architecture.i686)
156164
if platform == 'windows' and native_architecture == Architecture.AMD64:
157-
result.append(Architecture.x86)
165+
result.add(Architecture.x86)
158166
return result
159167

160168

161169
class BuildOptions(NamedTuple):
162170
package_dir: Path
163171
output_dir: Path
164172
build_selector: BuildSelector
165-
architectures: List[Architecture]
173+
architectures: Set[Architecture]
166174
environment: ParsedEnvironment
167175
before_all: str
168176
before_build: Optional[str]

cibuildwheel/windows.py

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import tempfile
66
import textwrap
77
from pathlib import Path
8-
from typing import Dict, List, NamedTuple, Optional, Sequence
8+
from typing import Dict, List, NamedTuple, Optional, Sequence, Set
99
from zipfile import ZipFile
1010

1111
import toml
@@ -48,7 +48,12 @@ class PythonConfiguration(NamedTuple):
4848
url: Optional[str]
4949

5050

51-
def get_python_configurations(build_selector: BuildSelector) -> List[PythonConfiguration]:
51+
def get_python_configurations(build_selector: BuildSelector, architectures: Set[Architecture]) -> List[PythonConfiguration]:
52+
map_arch = {
53+
'32': Architecture.x86,
54+
'64': Architecture.AMD64,
55+
}
56+
5257
python_configurations = [
5358
# CPython
5459
PythonConfiguration(version='2.7.18', arch='32', identifier='cp27-win32', url=None),
@@ -75,7 +80,10 @@ def get_python_configurations(build_selector: BuildSelector) -> List[PythonConfi
7580
python_configurations = [c for c in python_configurations if not c.version.startswith('2.7')]
7681

7782
# skip builds as required
78-
python_configurations = [c for c in python_configurations if build_selector(c.identifier)]
83+
python_configurations = [
84+
c for c in python_configurations
85+
if build_selector(c.identifier) and map_arch[c.arch] in architectures
86+
]
7987

8088
return python_configurations
8189

@@ -202,11 +210,12 @@ def pep_518_cp35_workaround(package_dir: Path, env: Dict[str, str]) -> None:
202210

203211

204212
def build(options: BuildOptions) -> None:
205-
if options.architectures != [Architecture.AMD64, Architecture.x86]:
213+
allowed_architectures = {Architecture.AMD64, Architecture.x86}
214+
if not options.architectures <= allowed_architectures:
206215
raise ValueError(textwrap.dedent(f'''
207-
Invalid archs option {options.architectures}. Windows only supports 'amd64,x86' for the
208-
moment. If you want to set emulation architectures on Linux, use CIBW_ARCHS_LINUX
209-
instead.
216+
Invalid archs option {options.architectures}. Windows only supports
217+
{sorted(allowed_architectures)}. If you want to set emulation
218+
architectures on Linux, use CIBW_ARCHS_LINUX instead.
210219
'''))
211220

212221
temp_dir = Path(tempfile.mkdtemp(prefix='cibuildwheel'))
@@ -220,7 +229,7 @@ def build(options: BuildOptions) -> None:
220229
before_all_prepared = prepare_command(options.before_all, project='.', package=options.package_dir)
221230
shell(before_all_prepared, env=env)
222231

223-
python_configurations = get_python_configurations(options.build_selector)
232+
python_configurations = get_python_configurations(options.build_selector, options.architectures)
224233

225234
for config in python_configurations:
226235
log.build_start(config.identifier)

unit_test/main_tests/main_platform_test.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -75,9 +75,9 @@ def test_archs_default(platform, intercepted_build_args, monkeypatch):
7575
build_options = intercepted_build_args.args[0]
7676

7777
if platform == 'linux':
78-
assert build_options.architectures == [Architecture.x86_64, Architecture.i686]
78+
assert build_options.architectures == {Architecture.x86_64, Architecture.i686}
7979
else:
80-
assert build_options.architectures == [Architecture.x86_64]
80+
assert build_options.architectures == {Architecture.x86_64}
8181

8282

8383
@pytest.mark.parametrize('use_env_var', [False, True])
@@ -92,7 +92,7 @@ def test_archs_argument(platform, intercepted_build_args, monkeypatch, use_env_v
9292
main()
9393
build_options = intercepted_build_args.args[0]
9494

95-
assert build_options.architectures == [Architecture.ppc64le]
95+
assert build_options.architectures == {Architecture.ppc64le}
9696

9797

9898
def test_archs_platform_specific(platform, intercepted_build_args, monkeypatch):
@@ -106,8 +106,8 @@ def test_archs_platform_specific(platform, intercepted_build_args, monkeypatch):
106106
build_options = intercepted_build_args.args[0]
107107

108108
if platform == 'linux':
109-
assert build_options.architectures == [Architecture.ppc64le]
109+
assert build_options.architectures == {Architecture.ppc64le}
110110
elif platform == 'windows':
111-
assert build_options.architectures == [Architecture.x86]
111+
assert build_options.architectures == {Architecture.x86}
112112
elif platform == 'macos':
113-
assert build_options.architectures == [Architecture.x86_64]
113+
assert build_options.architectures == {Architecture.x86_64}

0 commit comments

Comments
 (0)