Allow architecture selection

This commit is contained in:
Pavel Savchenko
2020-12-16 23:20:10 +00:00
parent 90a14b9dd2
commit ec99c01b2f
3 changed files with 46 additions and 11 deletions
+23 -3
View File
@@ -17,6 +17,7 @@ from cibuildwheel.environment import (
parse_environment, parse_environment,
) )
from cibuildwheel.util import ( from cibuildwheel.util import (
Architecture,
BuildOptions, BuildOptions,
BuildSelector, BuildSelector,
DependencyConstraints, DependencyConstraints,
@@ -67,6 +68,22 @@ def main() -> None:
run in Windows, and it will build and test for all versions of run in Windows, and it will build and test for all versions of
Python. Default: auto. Python. Default: auto.
''') ''')
parser.add_argument(
'-a',
'--architectures',
choices=[arch.value for arch in Architecture],
default=[],
help='''
Comma-separated list of CPU architectures to build for.
If unspecified, builds the architectures natively supported
on this machine. Set this option to build an architecture
via emulation, for example, using binfmt_misc and qemu.
''',
action="extend",
nargs="+",
type=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'),
help='Destination folder for the wheels.') help='Destination folder for the wheels.')
@@ -169,7 +186,7 @@ def main() -> None:
exit(2) exit(2)
if args.print_build_identifiers: if args.print_build_identifiers:
print_build_identifiers(platform, build_selector) print_build_identifiers(platform, build_selector, args.architectures)
exit(0) exit(0)
manylinux_images: Optional[Dict[str, str]] = None manylinux_images: Optional[Dict[str, str]] = None
@@ -202,6 +219,7 @@ def main() -> None:
manylinux_images[build_platform] = image manylinux_images[build_platform] = image
build_options = BuildOptions( build_options = BuildOptions(
architectures=args.architectures,
package_dir=package_dir, package_dir=package_dir,
output_dir=output_dir, output_dir=output_dir,
test_command=test_command, test_command=test_command,
@@ -284,10 +302,12 @@ def print_preamble(platform: str, build_options: BuildOptions) -> None:
print('\nHere we go!\n') print('\nHere we go!\n')
def print_build_identifiers(platform: str, build_selector: BuildSelector) -> None: def print_build_identifiers(
platform: str, build_selector: BuildSelector, architectures: List[Architecture]
) -> None:
python_configurations: List[Any] = [] python_configurations: List[Any] = []
if platform == 'linux': if platform == 'linux':
python_configurations = cibuildwheel.linux.get_python_configurations(build_selector) python_configurations = cibuildwheel.linux.get_python_configurations(build_selector, architectures)
elif platform == 'windows': elif platform == 'windows':
python_configurations = cibuildwheel.windows.get_python_configurations(build_selector) python_configurations = cibuildwheel.windows.get_python_configurations(build_selector)
elif platform == 'macos': elif platform == 'macos':
+14 -8
View File
@@ -9,18 +9,18 @@ from typing import List, NamedTuple, Union
from .docker_container import DockerContainer from .docker_container import DockerContainer
from .logger import log from .logger import log
from .util import (BuildOptions, BuildSelector, NonPlatformWheelError, from .util import (
get_build_verbosity_extra_flags, prepare_command) Architecture, BuildOptions, BuildSelector, NonPlatformWheelError,
get_build_verbosity_extra_flags, prepare_command,
)
re_pattern = re.compile(r'[cp]p\d{2}-manylinux_(\w*)') re_pattern = re.compile(r'[cp]p\d{2}-manylinux_(\w*)')
def matches_platform(identifier: str, supported_platforms: List[str]) -> bool: def matches_platform(identifier: str, supported_platforms: List[Architecture]) -> bool:
matched_architecture = re_pattern.search(identifier) matched_architecture = re_pattern.search(identifier)
id_architecture = matched_architecture.group(1) if matched_architecture else '' id_architecture = matched_architecture.group(1) if matched_architecture else ''
# x86_64 machines can run i686 docker containers
id_architecture = id_architecture if id_architecture == 'i686' else 'x86_64'
return id_architecture in supported_platforms return id_architecture in supported_platforms
@@ -34,7 +34,9 @@ class PythonConfiguration(NamedTuple):
return PurePath(self.path_str) return PurePath(self.path_str)
def get_python_configurations(build_selector: BuildSelector) -> List[PythonConfiguration]: def get_python_configurations(
build_selector: BuildSelector, architectures: List[Architecture]
) -> List[PythonConfiguration]:
python_configurations = [ python_configurations = [
PythonConfiguration(version='2.7', identifier='cp27-manylinux_x86_64', path_str='/opt/python/cp27-cp27m'), PythonConfiguration(version='2.7', identifier='cp27-manylinux_x86_64', path_str='/opt/python/cp27-cp27m'),
PythonConfiguration(version='2.7', identifier='cp27-manylinux_x86_64', path_str='/opt/python/cp27-cp27mu'), PythonConfiguration(version='2.7', identifier='cp27-manylinux_x86_64', path_str='/opt/python/cp27-cp27mu'),
@@ -71,7 +73,11 @@ def get_python_configurations(build_selector: BuildSelector) -> List[PythonConfi
] ]
# skip builds as required # skip builds as required
target_archs = [platform.machine()] target_archs = architectures or [Architecture(platform.machine())]
# x86_64 machines can run i686 docker containers
if Architecture.i686 not in target_archs and Architecture.x86_64 in target_archs:
target_archs.append(Architecture.i686)
print("matching platforms to architectures: ", target_archs)
return [ return [
c for c in python_configurations c for c in python_configurations
if matches_platform(c.identifier, target_archs) if matches_platform(c.identifier, target_archs)
@@ -90,7 +96,7 @@ def build(options: BuildOptions) -> None:
exit(2) exit(2)
assert options.manylinux_images is not None assert options.manylinux_images is not None
python_configurations = get_python_configurations(options.build_selector) python_configurations = get_python_configurations(options.build_selector, options.architectures)
platforms = [ platforms = [
('cp', 'manylinux_x86_64', options.manylinux_images['x86_64']), ('cp', 'manylinux_x86_64', options.manylinux_images['x86_64']),
('cp', 'manylinux_i686', options.manylinux_images['i686']), ('cp', 'manylinux_i686', options.manylinux_images['i686']),
+9
View File
@@ -121,7 +121,16 @@ class DependencyConstraints:
return f'{self.__class__.__name__}{self.base_file_path!r})' return f'{self.__class__.__name__}{self.base_file_path!r})'
class Architecture(str, Enum):
x86_64 = 'x86_64'
i686 = 'i686'
aarch64 = 'aarch64'
ppc64le = 'ppc64le'
s390x = 's390x'
class BuildOptions(NamedTuple): class BuildOptions(NamedTuple):
architectures: List[Architecture]
package_dir: Path package_dir: Path
output_dir: Path output_dir: Path
build_selector: BuildSelector build_selector: BuildSelector