From 8a307031a92354d3432c5d508b50fd4270a36ae7 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Fri, 7 Apr 2023 15:51:12 -0700 Subject: [PATCH 1/2] Set the defualt build_frontend to be "default" (which is still "pip") Instead of using pip as the default, set it to default. This way each platform can choose independently what to do as the default behavior. This is intended as part of adding Pyodide support. Pyodide cannot use pip as the build frontend. It always uses a modified pypa/build. So if the build_frontend is explicitly set to pip we want to raise an error. But if it's unset, then we should be able to tell and just do what we want. --- cibuildwheel/linux.py | 12 ++++++------ cibuildwheel/macos.py | 14 +++++++------- cibuildwheel/options.py | 6 ++++-- cibuildwheel/resources/defaults.toml | 2 +- cibuildwheel/util.py | 9 +++++++++ cibuildwheel/windows.py | 14 +++++++------- 6 files changed, 34 insertions(+), 23 deletions(-) diff --git a/cibuildwheel/linux.py b/cibuildwheel/linux.py index 1a1f7103..43777126 100644 --- a/cibuildwheel/linux.py +++ b/cibuildwheel/linux.py @@ -17,6 +17,7 @@ from .util import ( AlreadyBuiltWheelError, BuildSelector, NonPlatformWheelError, + build_frontend_or_default, find_compatible_wheel, get_build_verbosity_extra_flags, prepare_command, @@ -175,6 +176,7 @@ def build_in_container( for config in platform_configs: log.build_start(config.identifier) build_options = options.build_options(config.identifier) + build_frontend = build_frontend_or_default(build_options.build_frontend, "pip") dependency_constraint_flags: list[PathOrStr] = [] @@ -241,11 +243,9 @@ def build_in_container( container.call(["mkdir", "-p", built_wheel_dir]) verbosity_flags = get_build_verbosity_extra_flags(build_options.build_verbosity) - extra_flags = split_config_settings( - build_options.config_settings, build_options.build_frontend - ) + extra_flags = split_config_settings(build_options.config_settings, build_frontend) - if build_options.build_frontend == "pip": + if build_frontend == "pip": extra_flags += verbosity_flags container.call( [ @@ -260,7 +260,7 @@ def build_in_container( ], env=env, ) - elif build_options.build_frontend == "build": + elif build_frontend == "build": verbosity_setting = " ".join(verbosity_flags) extra_flags += (f"--config-setting={verbosity_setting}",) container.call( @@ -276,7 +276,7 @@ def build_in_container( env=env, ) else: - assert_never(build_options.build_frontend) + assert_never(build_frontend) built_wheel = container.glob(built_wheel_dir, "*.whl")[0] diff --git a/cibuildwheel/macos.py b/cibuildwheel/macos.py index 6047b1ee..719a0317 100644 --- a/cibuildwheel/macos.py +++ b/cibuildwheel/macos.py @@ -26,6 +26,7 @@ from .util import ( BuildFrontend, BuildSelector, NonPlatformWheelError, + build_frontend_or_default, call, detect_ci_provider, download, @@ -331,6 +332,7 @@ def build(options: Options, tmp_path: Path) -> None: for config in python_configurations: build_options = options.build_options(config.identifier) + build_frontend = build_frontend_or_default(build_options.build_frontend, "pip") log.build_start(config.identifier) identifier_tmp_dir = tmp_path / config.identifier @@ -353,7 +355,7 @@ def build(options: Options, tmp_path: Path) -> None: config, dependency_constraint_flags, build_options.environment, - build_options.build_frontend, + build_frontend, ) compatible_wheel = find_compatible_wheel(built_wheels, config.identifier) @@ -375,11 +377,9 @@ def build(options: Options, tmp_path: Path) -> None: built_wheel_dir.mkdir() verbosity_flags = get_build_verbosity_extra_flags(build_options.build_verbosity) - extra_flags = split_config_settings( - build_options.config_settings, build_options.build_frontend - ) + extra_flags = split_config_settings(build_options.config_settings, build_frontend) - if build_options.build_frontend == "pip": + if build_frontend == "pip": extra_flags += verbosity_flags # Path.resolve() is needed. Without it pip wheel may try to fetch package from pypi.org # see https://github.com/pypa/cibuildwheel/pull/369 @@ -394,7 +394,7 @@ def build(options: Options, tmp_path: Path) -> None: *extra_flags, env=env, ) - elif build_options.build_frontend == "build": + elif build_frontend == "build": verbosity_setting = " ".join(verbosity_flags) extra_flags += (f"--config-setting={verbosity_setting}",) build_env = env.copy() @@ -417,7 +417,7 @@ def build(options: Options, tmp_path: Path) -> None: env=build_env, ) else: - assert_never(build_options.build_frontend) + assert_never(build_frontend) built_wheel = next(built_wheel_dir.glob("*.whl")) diff --git a/cibuildwheel/options.py b/cibuildwheel/options.py index 9380077e..3469dce8 100644 --- a/cibuildwheel/options.py +++ b/cibuildwheel/options.py @@ -94,7 +94,7 @@ class BuildOptions: test_requires: list[str] test_extras: str build_verbosity: int - build_frontend: BuildFrontend + build_frontend: BuildFrontend | Literal["default"] config_settings: str @property @@ -499,11 +499,13 @@ class Options: test_extras = self.reader.get("test-extras", sep=",") build_verbosity_str = self.reader.get("build-verbosity") - build_frontend: BuildFrontend + build_frontend: BuildFrontend | Literal["default"] if build_frontend_str == "build": build_frontend = "build" elif build_frontend_str == "pip": build_frontend = "pip" + elif build_frontend_str == "default": + build_frontend = "default" else: msg = f"cibuildwheel: Unrecognised build frontend {build_frontend_str!r}, only 'pip' and 'build' are supported" print(msg, file=sys.stderr) diff --git a/cibuildwheel/resources/defaults.toml b/cibuildwheel/resources/defaults.toml index d16a3147..40b42f6e 100644 --- a/cibuildwheel/resources/defaults.toml +++ b/cibuildwheel/resources/defaults.toml @@ -4,7 +4,7 @@ skip = "" test-skip = "" archs = ["auto"] -build-frontend = "pip" +build-frontend = "default" config-settings = {} dependency-versions = "pinned" environment = {} diff --git a/cibuildwheel/util.py b/cibuildwheel/util.py index 72cff326..3d4e7ff5 100644 --- a/cibuildwheel/util.py +++ b/cibuildwheel/util.py @@ -71,6 +71,15 @@ test_fail_cwd_file: Final[Path] = resources_dir / "testing_temp_dir_file.py" BuildFrontend = Literal["pip", "build"] + +def build_frontend_or_default( + setting: BuildFrontend | Literal["default"], default: BuildFrontend +) -> BuildFrontend: + if setting == "default": + return default + return setting + + MANYLINUX_ARCHS: Final[tuple[str, ...]] = ( "x86_64", "i686", diff --git a/cibuildwheel/windows.py b/cibuildwheel/windows.py index e0f16d81..38106925 100644 --- a/cibuildwheel/windows.py +++ b/cibuildwheel/windows.py @@ -27,6 +27,7 @@ from .util import ( BuildFrontend, BuildSelector, NonPlatformWheelError, + build_frontend_or_default, call, download, find_compatible_wheel, @@ -367,6 +368,7 @@ def build(options: Options, tmp_path: Path) -> None: for config in python_configurations: build_options = options.build_options(config.identifier) + build_frontend = build_frontend_or_default(build_options.build_frontend, "pip") log.build_start(config.identifier) identifier_tmp_dir = tmp_path / config.identifier @@ -387,7 +389,7 @@ def build(options: Options, tmp_path: Path) -> None: config, dependency_constraint_flags, build_options.environment, - build_options.build_frontend, + build_frontend, ) compatible_wheel = find_compatible_wheel(built_wheels, config.identifier) @@ -412,11 +414,9 @@ def build(options: Options, tmp_path: Path) -> None: built_wheel_dir.mkdir() verbosity_flags = get_build_verbosity_extra_flags(build_options.build_verbosity) - extra_flags = split_config_settings( - build_options.config_settings, build_options.build_frontend - ) + extra_flags = split_config_settings(build_options.config_settings, build_frontend) - if build_options.build_frontend == "pip": + if build_frontend == "pip": extra_flags += verbosity_flags # Path.resolve() is needed. Without it pip wheel may try to fetch package from pypi.org # see https://github.com/pypa/cibuildwheel/pull/369 @@ -431,7 +431,7 @@ def build(options: Options, tmp_path: Path) -> None: *extra_flags, env=env, ) - elif build_options.build_frontend == "build": + elif build_frontend == "build": verbosity_setting = " ".join(verbosity_flags) extra_flags += (f"--config-setting={verbosity_setting}",) build_env = env.copy() @@ -464,7 +464,7 @@ def build(options: Options, tmp_path: Path) -> None: env=build_env, ) else: - assert_never(build_options.build_frontend) + assert_never(build_frontend) built_wheel = next(built_wheel_dir.glob("*.whl")) From 374d786812903f4f70e395a2be8f29f49a72708b Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Sat, 8 Apr 2023 18:26:09 -0700 Subject: [PATCH 2/2] Set pip as the default value of default --- cibuildwheel/linux.py | 2 +- cibuildwheel/macos.py | 2 +- cibuildwheel/util.py | 2 +- cibuildwheel/windows.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/cibuildwheel/linux.py b/cibuildwheel/linux.py index 43777126..8c584b20 100644 --- a/cibuildwheel/linux.py +++ b/cibuildwheel/linux.py @@ -176,7 +176,7 @@ def build_in_container( for config in platform_configs: log.build_start(config.identifier) build_options = options.build_options(config.identifier) - build_frontend = build_frontend_or_default(build_options.build_frontend, "pip") + build_frontend = build_frontend_or_default(build_options.build_frontend) dependency_constraint_flags: list[PathOrStr] = [] diff --git a/cibuildwheel/macos.py b/cibuildwheel/macos.py index 719a0317..3cf4ec53 100644 --- a/cibuildwheel/macos.py +++ b/cibuildwheel/macos.py @@ -332,7 +332,7 @@ def build(options: Options, tmp_path: Path) -> None: for config in python_configurations: build_options = options.build_options(config.identifier) - build_frontend = build_frontend_or_default(build_options.build_frontend, "pip") + build_frontend = build_frontend_or_default(build_options.build_frontend) log.build_start(config.identifier) identifier_tmp_dir = tmp_path / config.identifier diff --git a/cibuildwheel/util.py b/cibuildwheel/util.py index 3d4e7ff5..38622c70 100644 --- a/cibuildwheel/util.py +++ b/cibuildwheel/util.py @@ -73,7 +73,7 @@ BuildFrontend = Literal["pip", "build"] def build_frontend_or_default( - setting: BuildFrontend | Literal["default"], default: BuildFrontend + setting: BuildFrontend | Literal["default"], default: BuildFrontend = "pip" ) -> BuildFrontend: if setting == "default": return default diff --git a/cibuildwheel/windows.py b/cibuildwheel/windows.py index 38106925..08cab532 100644 --- a/cibuildwheel/windows.py +++ b/cibuildwheel/windows.py @@ -368,7 +368,7 @@ def build(options: Options, tmp_path: Path) -> None: for config in python_configurations: build_options = options.build_options(config.identifier) - build_frontend = build_frontend_or_default(build_options.build_frontend, "pip") + build_frontend = build_frontend_or_default(build_options.build_frontend) log.build_start(config.identifier) identifier_tmp_dir = tmp_path / config.identifier