Merge remote-tracking branch 'upstream/main' into arm64

This commit is contained in:
Steve Dower
2022-09-09 11:51:13 +01:00
24 changed files with 344 additions and 182 deletions
+1 -1
View File
@@ -36,7 +36,7 @@ repos:
exclude: ^cibuildwheel/resources/.*py$ exclude: ^cibuildwheel/resources/.*py$
- repo: https://github.com/psf/black - repo: https://github.com/psf/black
rev: 22.6.0 rev: 22.8.0
hooks: hooks:
- id: black - id: black
+1
View File
@@ -50,6 +50,7 @@ images = [
Image("manylinux_2_28", "x86_64", "quay.io/pypa/manylinux_2_28_x86_64", None), Image("manylinux_2_28", "x86_64", "quay.io/pypa/manylinux_2_28_x86_64", None),
Image("manylinux_2_28", "aarch64", "quay.io/pypa/manylinux_2_28_aarch64", None), Image("manylinux_2_28", "aarch64", "quay.io/pypa/manylinux_2_28_aarch64", None),
Image("manylinux_2_28", "ppc64le", "quay.io/pypa/manylinux_2_28_ppc64le", None), Image("manylinux_2_28", "ppc64le", "quay.io/pypa/manylinux_2_28_ppc64le", None),
Image("manylinux_2_28", "s390x", "quay.io/pypa/manylinux_2_28_s390x", None),
Image("manylinux_2_28", "pypy_x86_64", "quay.io/pypa/manylinux_2_28_x86_64", None), Image("manylinux_2_28", "pypy_x86_64", "quay.io/pypa/manylinux_2_28_x86_64", None),
Image("manylinux_2_28", "pypy_aarch64", "quay.io/pypa/manylinux_2_28_aarch64", None), Image("manylinux_2_28", "pypy_aarch64", "quay.io/pypa/manylinux_2_28_aarch64", None),
# musllinux_1_1 images # musllinux_1_1 images
+10 -3
View File
@@ -5,7 +5,6 @@ import os
import shutil import shutil
import sys import sys
import tarfile import tarfile
import tempfile
import textwrap import textwrap
from pathlib import Path from pathlib import Path
from tempfile import mkdtemp from tempfile import mkdtemp
@@ -130,8 +129,8 @@ def main() -> None:
return return
# Tarfile builds require extraction and changing the directory # Tarfile builds require extraction and changing the directory
with tempfile.TemporaryDirectory(prefix="cibw-sdist-") as temp_dir_str: temp_dir = Path(mkdtemp(prefix="cibw-sdist-")).resolve(strict=True)
temp_dir = Path(temp_dir_str) try:
with tarfile.open(args.package_dir) as tar: with tarfile.open(args.package_dir) as tar:
tar.extractall(path=temp_dir) tar.extractall(path=temp_dir)
@@ -146,6 +145,12 @@ def main() -> None:
with chdir(temp_dir): with chdir(temp_dir):
build_in_directory(args) build_in_directory(args)
finally:
# avoid https://github.com/python/cpython/issues/86962 by performing
# cleanup manually
shutil.rmtree(temp_dir, ignore_errors=sys.platform.startswith("win"))
if temp_dir.exists():
log.warning(f"Can't delete temporary folder '{str(temp_dir)}'")
def build_in_directory(args: CommandLineArguments) -> None: def build_in_directory(args: CommandLineArguments) -> None:
@@ -253,6 +258,8 @@ def build_in_directory(args: CommandLineArguments) -> None:
else: else:
assert_never(platform) assert_never(platform)
finally: finally:
# avoid https://github.com/python/cpython/issues/86962 by performing
# cleanup manually
shutil.rmtree(tmp_path, ignore_errors=sys.platform.startswith("win")) shutil.rmtree(tmp_path, ignore_errors=sys.platform.startswith("win"))
if tmp_path.exists(): if tmp_path.exists():
log.warning(f"Can't delete temporary folder '{str(tmp_path)}'") log.warning(f"Can't delete temporary folder '{str(tmp_path)}'")
+7 -3
View File
@@ -20,6 +20,7 @@ from .util import (
get_build_verbosity_extra_flags, get_build_verbosity_extra_flags,
prepare_command, prepare_command,
read_python_configs, read_python_configs,
split_config_settings,
unwrap, unwrap,
) )
@@ -212,8 +213,10 @@ def build_in_container(
container.call(["mkdir", "-p", built_wheel_dir]) container.call(["mkdir", "-p", built_wheel_dir])
verbosity_flags = get_build_verbosity_extra_flags(build_options.build_verbosity) verbosity_flags = get_build_verbosity_extra_flags(build_options.build_verbosity)
extra_flags = split_config_settings(build_options.config_settings)
if build_options.build_frontend == "pip": if build_options.build_frontend == "pip":
extra_flags += verbosity_flags
container.call( container.call(
[ [
"python", "python",
@@ -223,12 +226,13 @@ def build_in_container(
container_package_dir, container_package_dir,
f"--wheel-dir={built_wheel_dir}", f"--wheel-dir={built_wheel_dir}",
"--no-deps", "--no-deps",
*verbosity_flags, *extra_flags,
], ],
env=env, env=env,
) )
elif build_options.build_frontend == "build": elif build_options.build_frontend == "build":
config_setting = " ".join(verbosity_flags) verbosity_setting = " ".join(verbosity_flags)
extra_flags += (f"--config-setting={verbosity_setting}",)
container.call( container.call(
[ [
"python", "python",
@@ -237,7 +241,7 @@ def build_in_container(
container_package_dir, container_package_dir,
"--wheel", "--wheel",
f"--outdir={built_wheel_dir}", f"--outdir={built_wheel_dir}",
f"--config-setting={config_setting}", *extra_flags,
], ],
env=env, env=env,
) )
+7 -3
View File
@@ -34,6 +34,7 @@ from .util import (
prepare_command, prepare_command,
read_python_configs, read_python_configs,
shell, shell,
split_config_settings,
unwrap, unwrap,
virtualenv, virtualenv,
) )
@@ -345,8 +346,10 @@ def build(options: Options, tmp_path: Path) -> None:
built_wheel_dir.mkdir() built_wheel_dir.mkdir()
verbosity_flags = get_build_verbosity_extra_flags(build_options.build_verbosity) verbosity_flags = get_build_verbosity_extra_flags(build_options.build_verbosity)
extra_flags = split_config_settings(build_options.config_settings)
if build_options.build_frontend == "pip": if build_options.build_frontend == "pip":
extra_flags += verbosity_flags
# Path.resolve() is needed. Without it pip wheel may try to fetch package from pypi.org # Path.resolve() is needed. Without it pip wheel may try to fetch package from pypi.org
# see https://github.com/pypa/cibuildwheel/pull/369 # see https://github.com/pypa/cibuildwheel/pull/369
call( call(
@@ -357,11 +360,12 @@ def build(options: Options, tmp_path: Path) -> None:
build_options.package_dir.resolve(), build_options.package_dir.resolve(),
f"--wheel-dir={built_wheel_dir}", f"--wheel-dir={built_wheel_dir}",
"--no-deps", "--no-deps",
*verbosity_flags, *extra_flags,
env=env, env=env,
) )
elif build_options.build_frontend == "build": elif build_options.build_frontend == "build":
config_setting = " ".join(verbosity_flags) verbosity_setting = " ".join(verbosity_flags)
extra_flags += (f"--config-setting={verbosity_setting}",)
build_env = env.copy() build_env = env.copy()
if build_options.dependency_constraints: if build_options.dependency_constraints:
constraint_path = ( constraint_path = (
@@ -378,7 +382,7 @@ def build(options: Options, tmp_path: Path) -> None:
build_options.package_dir, build_options.package_dir,
"--wheel", "--wheel",
f"--outdir={built_wheel_dir}", f"--outdir={built_wheel_dir}",
f"--config-setting={config_setting}", *extra_flags,
env=build_env, env=build_env,
) )
else: else:
+24 -5
View File
@@ -3,13 +3,14 @@ from __future__ import annotations
import difflib import difflib
import functools import functools
import os import os
import shlex
import sys import sys
import traceback import traceback
from configparser import ConfigParser from configparser import ConfigParser
from contextlib import contextmanager from contextlib import contextmanager
from dataclasses import asdict, dataclass from dataclasses import asdict, dataclass
from pathlib import Path from pathlib import Path
from typing import Any, Dict, Generator, List, Mapping, Union, cast from typing import Any, Dict, Generator, Iterator, List, Mapping, Union, cast
if sys.version_info >= (3, 11): if sys.version_info >= (3, 11):
import tomllib import tomllib
@@ -77,6 +78,7 @@ class BuildOptions:
test_extras: str test_extras: str
build_verbosity: int build_verbosity: int
build_frontend: BuildFrontend build_frontend: BuildFrontend
config_settings: str
@property @property
def package_dir(self) -> Path: def package_dir(self) -> Path:
@@ -293,8 +295,9 @@ class OptionsReader:
accept platform versions of the environment variable. If this is an accept platform versions of the environment variable. If this is an
array it will be merged with "sep" before returning. If it is a table, array it will be merged with "sep" before returning. If it is a table,
it will be formatted with "table['item']" using {k} and {v} and merged it will be formatted with "table['item']" using {k} and {v} and merged
with "table['sep']". Empty variables will not override if ignore_empty with "table['sep']". If sep is also given, it will be used for arrays
is True. inside the table (must match table['sep']). Empty variables will not
override if ignore_empty is True.
""" """
if name not in self.default_options and name not in self.default_platform_options: if name not in self.default_options and name not in self.default_platform_options:
@@ -324,7 +327,9 @@ class OptionsReader:
if isinstance(result, dict): if isinstance(result, dict):
if table is None: if table is None:
raise ConfigOptionError(f"{name!r} does not accept a table") raise ConfigOptionError(f"{name!r} does not accept a table")
return table["sep"].join(table["item"].format(k=k, v=v) for k, v in result.items()) return table["sep"].join(
item for k, v in result.items() for item in _inner_fmt(k, v, table["item"])
)
if isinstance(result, list): if isinstance(result, list):
if sep is None: if sep is None:
@@ -337,6 +342,16 @@ class OptionsReader:
return result return result
def _inner_fmt(k: str, v: Any, table_item: str) -> Iterator[str]:
if isinstance(v, list):
for inner_v in v:
qv = shlex.quote(inner_v)
yield table_item.format(k=k, v=qv)
else:
qv = shlex.quote(v)
yield table_item.format(k=k, v=qv)
class Options: class Options:
def __init__(self, platform: PlatformName, command_line_arguments: CommandLineArguments): def __init__(self, platform: PlatformName, command_line_arguments: CommandLineArguments):
self.platform = platform self.platform = platform
@@ -427,11 +442,14 @@ class Options:
build_frontend_str = self.reader.get("build-frontend", env_plat=False) build_frontend_str = self.reader.get("build-frontend", env_plat=False)
environment_config = self.reader.get( environment_config = self.reader.get(
"environment", table={"item": '{k}="{v}"', "sep": " "} "environment", table={"item": "{k}={v}", "sep": " "}
) )
environment_pass = self.reader.get("environment-pass", sep=" ").split() environment_pass = self.reader.get("environment-pass", sep=" ").split()
before_build = self.reader.get("before-build", sep=" && ") before_build = self.reader.get("before-build", sep=" && ")
repair_command = self.reader.get("repair-wheel-command", sep=" && ") repair_command = self.reader.get("repair-wheel-command", sep=" && ")
config_settings = self.reader.get(
"config-settings", table={"item": "{k}={v}", "sep": " "}
)
dependency_versions = self.reader.get("dependency-versions") dependency_versions = self.reader.get("dependency-versions")
test_command = self.reader.get("test-command", sep=" && ") test_command = self.reader.get("test-command", sep=" && ")
@@ -537,6 +555,7 @@ class Options:
manylinux_images=manylinux_images or None, manylinux_images=manylinux_images or None,
musllinux_images=musllinux_images or None, musllinux_images=musllinux_images or None,
build_frontend=build_frontend, build_frontend=build_frontend,
config_settings=config_settings,
) )
def check_for_invalid_configuration(self, identifiers: list[str]) -> None: def check_for_invalid_configuration(self, identifiers: list[str]) -> None:
@@ -6,7 +6,7 @@
# #
delocate==0.10.2 delocate==0.10.2
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
distlib==0.3.5 distlib==0.3.6
# via virtualenv # via virtualenv
filelock==3.8.0 filelock==3.8.0
# via virtualenv # via virtualenv
@@ -14,7 +14,7 @@ platformdirs==2.5.2
# via virtualenv # via virtualenv
typing-extensions==4.3.0 typing-extensions==4.3.0
# via delocate # via delocate
virtualenv==20.16.3 virtualenv==20.16.4
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
wheel==0.37.1 wheel==0.37.1
# via # via
@@ -24,5 +24,5 @@ wheel==0.37.1
# The following packages are considered to be unsafe in a requirements file: # The following packages are considered to be unsafe in a requirements file:
pip==22.2.2 pip==22.2.2
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
setuptools==65.2.0 setuptools==65.3.0
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
@@ -6,7 +6,7 @@
# #
delocate==0.10.2 delocate==0.10.2
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
distlib==0.3.5 distlib==0.3.6
# via virtualenv # via virtualenv
filelock==3.8.0 filelock==3.8.0
# via virtualenv # via virtualenv
@@ -14,7 +14,7 @@ platformdirs==2.5.2
# via virtualenv # via virtualenv
typing-extensions==4.3.0 typing-extensions==4.3.0
# via delocate # via delocate
virtualenv==20.16.3 virtualenv==20.16.4
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
wheel==0.37.1 wheel==0.37.1
# via # via
@@ -24,5 +24,5 @@ wheel==0.37.1
# The following packages are considered to be unsafe in a requirements file: # The following packages are considered to be unsafe in a requirements file:
pip==22.2.2 pip==22.2.2
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
setuptools==65.2.0 setuptools==65.3.0
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
@@ -6,7 +6,7 @@
# #
delocate==0.10.2 delocate==0.10.2
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
distlib==0.3.5 distlib==0.3.6
# via virtualenv # via virtualenv
filelock==3.4.1 filelock==3.4.1
# via virtualenv # via virtualenv
@@ -20,7 +20,7 @@ typing-extensions==4.1.1
# via # via
# delocate # delocate
# importlib-metadata # importlib-metadata
virtualenv==20.16.3 virtualenv==20.16.4
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
wheel==0.37.1 wheel==0.37.1
# via # via
@@ -6,7 +6,7 @@
# #
delocate==0.10.2 delocate==0.10.2
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
distlib==0.3.5 distlib==0.3.6
# via virtualenv # via virtualenv
filelock==3.8.0 filelock==3.8.0
# via virtualenv # via virtualenv
@@ -18,7 +18,7 @@ typing-extensions==4.3.0
# via # via
# delocate # delocate
# importlib-metadata # importlib-metadata
virtualenv==20.16.3 virtualenv==20.16.4
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
wheel==0.37.1 wheel==0.37.1
# via # via
@@ -30,5 +30,5 @@ zipp==3.8.1
# The following packages are considered to be unsafe in a requirements file: # The following packages are considered to be unsafe in a requirements file:
pip==22.2.2 pip==22.2.2
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
setuptools==65.2.0 setuptools==65.3.0
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
@@ -6,7 +6,7 @@
# #
delocate==0.10.2 delocate==0.10.2
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
distlib==0.3.5 distlib==0.3.6
# via virtualenv # via virtualenv
filelock==3.8.0 filelock==3.8.0
# via virtualenv # via virtualenv
@@ -14,7 +14,7 @@ platformdirs==2.5.2
# via virtualenv # via virtualenv
typing-extensions==4.3.0 typing-extensions==4.3.0
# via delocate # via delocate
virtualenv==20.16.3 virtualenv==20.16.4
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
wheel==0.37.1 wheel==0.37.1
# via # via
@@ -24,5 +24,5 @@ wheel==0.37.1
# The following packages are considered to be unsafe in a requirements file: # The following packages are considered to be unsafe in a requirements file:
pip==22.2.2 pip==22.2.2
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
setuptools==65.2.0 setuptools==65.3.0
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
@@ -6,7 +6,7 @@
# #
delocate==0.10.2 delocate==0.10.2
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
distlib==0.3.5 distlib==0.3.6
# via virtualenv # via virtualenv
filelock==3.8.0 filelock==3.8.0
# via virtualenv # via virtualenv
@@ -14,7 +14,7 @@ platformdirs==2.5.2
# via virtualenv # via virtualenv
typing-extensions==4.3.0 typing-extensions==4.3.0
# via delocate # via delocate
virtualenv==20.16.3 virtualenv==20.16.4
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
wheel==0.37.1 wheel==0.37.1
# via # via
@@ -24,5 +24,5 @@ wheel==0.37.1
# The following packages are considered to be unsafe in a requirements file: # The following packages are considered to be unsafe in a requirements file:
pip==22.2.2 pip==22.2.2
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
setuptools==65.2.0 setuptools==65.3.0
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
+3 -3
View File
@@ -6,7 +6,7 @@
# #
delocate==0.10.2 delocate==0.10.2
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
distlib==0.3.5 distlib==0.3.6
# via virtualenv # via virtualenv
filelock==3.8.0 filelock==3.8.0
# via virtualenv # via virtualenv
@@ -14,7 +14,7 @@ platformdirs==2.5.2
# via virtualenv # via virtualenv
typing-extensions==4.3.0 typing-extensions==4.3.0
# via delocate # via delocate
virtualenv==20.16.3 virtualenv==20.16.4
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
wheel==0.37.1 wheel==0.37.1
# via # via
@@ -24,5 +24,5 @@ wheel==0.37.1
# The following packages are considered to be unsafe in a requirements file: # The following packages are considered to be unsafe in a requirements file:
pip==22.2.2 pip==22.2.2
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
setuptools==65.2.0 setuptools==65.3.0
# via -r cibuildwheel/resources/constraints.in # via -r cibuildwheel/resources/constraints.in
+1
View File
@@ -5,6 +5,7 @@ test-skip = ""
archs = ["auto"] archs = ["auto"]
build-frontend = "pip" build-frontend = "pip"
config-settings = {}
dependency-versions = "pinned" dependency-versions = "pinned"
environment = {} environment = {}
environment-pass = [] environment-pass = []
+29 -28
View File
@@ -1,48 +1,49 @@
[x86_64] [x86_64]
manylinux1 = quay.io/pypa/manylinux1_x86_64:2022-08-21-7492cb5 manylinux1 = quay.io/pypa/manylinux1_x86_64:2022-09-04-d1c2903
manylinux2010 = quay.io/pypa/manylinux2010_x86_64:2022-08-05-4535177 manylinux2010 = quay.io/pypa/manylinux2010_x86_64:2022-08-05-4535177
manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2022-08-21-92d3131 manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2022-09-04-870f6a2
manylinux_2_24 = quay.io/pypa/manylinux_2_24_x86_64:2022-08-21-92d3131 manylinux_2_24 = quay.io/pypa/manylinux_2_24_x86_64:2022-09-04-870f6a2
manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2022-08-21-92d3131 manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2022-09-04-870f6a2
musllinux_1_1 = quay.io/pypa/musllinux_1_1_x86_64:2022-08-21-92d3131 musllinux_1_1 = quay.io/pypa/musllinux_1_1_x86_64:2022-09-04-870f6a2
[i686] [i686]
manylinux1 = quay.io/pypa/manylinux1_i686:2022-08-21-7492cb5 manylinux1 = quay.io/pypa/manylinux1_i686:2022-09-04-d1c2903
manylinux2010 = quay.io/pypa/manylinux2010_i686:2022-08-05-4535177 manylinux2010 = quay.io/pypa/manylinux2010_i686:2022-08-05-4535177
manylinux2014 = quay.io/pypa/manylinux2014_i686:2022-08-21-92d3131 manylinux2014 = quay.io/pypa/manylinux2014_i686:2022-09-04-870f6a2
manylinux_2_24 = quay.io/pypa/manylinux_2_24_i686:2022-08-21-92d3131 manylinux_2_24 = quay.io/pypa/manylinux_2_24_i686:2022-09-04-870f6a2
musllinux_1_1 = quay.io/pypa/musllinux_1_1_i686:2022-08-21-92d3131 musllinux_1_1 = quay.io/pypa/musllinux_1_1_i686:2022-09-04-870f6a2
[pypy_x86_64] [pypy_x86_64]
manylinux2010 = quay.io/pypa/manylinux2010_x86_64:2022-08-05-4535177 manylinux2010 = quay.io/pypa/manylinux2010_x86_64:2022-08-05-4535177
manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2022-08-21-92d3131 manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2022-09-04-870f6a2
manylinux_2_24 = quay.io/pypa/manylinux_2_24_x86_64:2022-08-21-92d3131 manylinux_2_24 = quay.io/pypa/manylinux_2_24_x86_64:2022-09-04-870f6a2
manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2022-08-21-92d3131 manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2022-09-04-870f6a2
[pypy_i686] [pypy_i686]
manylinux2010 = quay.io/pypa/manylinux2010_i686:2022-08-05-4535177 manylinux2010 = quay.io/pypa/manylinux2010_i686:2022-08-05-4535177
manylinux2014 = quay.io/pypa/manylinux2014_i686:2022-08-21-92d3131 manylinux2014 = quay.io/pypa/manylinux2014_i686:2022-09-04-870f6a2
manylinux_2_24 = quay.io/pypa/manylinux_2_24_i686:2022-08-21-92d3131 manylinux_2_24 = quay.io/pypa/manylinux_2_24_i686:2022-09-04-870f6a2
[aarch64] [aarch64]
manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2022-08-21-92d3131 manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2022-09-04-870f6a2
manylinux_2_24 = quay.io/pypa/manylinux_2_24_aarch64:2022-08-21-92d3131 manylinux_2_24 = quay.io/pypa/manylinux_2_24_aarch64:2022-09-04-870f6a2
manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2022-08-21-92d3131 manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2022-09-04-870f6a2
musllinux_1_1 = quay.io/pypa/musllinux_1_1_aarch64:2022-08-21-92d3131 musllinux_1_1 = quay.io/pypa/musllinux_1_1_aarch64:2022-09-04-870f6a2
[ppc64le] [ppc64le]
manylinux2014 = quay.io/pypa/manylinux2014_ppc64le:2022-08-21-92d3131 manylinux2014 = quay.io/pypa/manylinux2014_ppc64le:2022-09-04-870f6a2
manylinux_2_24 = quay.io/pypa/manylinux_2_24_ppc64le:2022-08-21-92d3131 manylinux_2_24 = quay.io/pypa/manylinux_2_24_ppc64le:2022-09-04-870f6a2
manylinux_2_28 = quay.io/pypa/manylinux_2_28_ppc64le:2022-08-21-92d3131 manylinux_2_28 = quay.io/pypa/manylinux_2_28_ppc64le:2022-09-04-870f6a2
musllinux_1_1 = quay.io/pypa/musllinux_1_1_ppc64le:2022-08-21-92d3131 musllinux_1_1 = quay.io/pypa/musllinux_1_1_ppc64le:2022-09-04-870f6a2
[s390x] [s390x]
manylinux2014 = quay.io/pypa/manylinux2014_s390x:2022-08-21-92d3131 manylinux2014 = quay.io/pypa/manylinux2014_s390x:2022-09-04-870f6a2
manylinux_2_24 = quay.io/pypa/manylinux_2_24_s390x:2022-08-21-92d3131 manylinux_2_24 = quay.io/pypa/manylinux_2_24_s390x:2022-09-04-870f6a2
musllinux_1_1 = quay.io/pypa/musllinux_1_1_s390x:2022-08-21-92d3131 manylinux_2_28 = quay.io/pypa/manylinux_2_28_s390x:2022-09-04-870f6a2
musllinux_1_1 = quay.io/pypa/musllinux_1_1_s390x:2022-09-04-870f6a2
[pypy_aarch64] [pypy_aarch64]
manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2022-08-21-92d3131 manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2022-09-04-870f6a2
manylinux_2_24 = quay.io/pypa/manylinux_2_24_aarch64:2022-08-21-92d3131 manylinux_2_24 = quay.io/pypa/manylinux_2_24_aarch64:2022-09-04-870f6a2
manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2022-08-21-92d3131 manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2022-09-04-870f6a2
+2 -2
View File
@@ -1,2 +1,2 @@
version = "20.16.3" version = "20.16.4"
url = "https://github.com/pypa/get-virtualenv/blob/20.16.3/public/virtualenv.pyz?raw=true" url = "https://github.com/pypa/get-virtualenv/blob/20.16.4/public/virtualenv.pyz?raw=true"
+6
View File
@@ -60,6 +60,7 @@ __all__ = [
"strtobool", "strtobool",
"cached_property", "cached_property",
"chdir", "chdir",
"split_config_settings",
] ]
resources_dir: Final = Path(__file__).parent / "resources" resources_dir: Final = Path(__file__).parent / "resources"
@@ -205,6 +206,11 @@ def get_build_verbosity_extra_flags(level: int) -> list[str]:
return [] return []
def split_config_settings(config_settings: str) -> list[str]:
config_settings_list = shlex.split(config_settings)
return [f"--config-setting={setting}" for setting in config_settings_list]
def read_python_configs(config: PlatformName) -> list[dict[str, str]]: def read_python_configs(config: PlatformName) -> list[dict[str, str]]:
input_file = resources_dir / "build-platforms.toml" input_file = resources_dir / "build-platforms.toml"
with input_file.open("rb") as f: with input_file.open("rb") as f:
+7 -3
View File
@@ -34,6 +34,7 @@ from .util import (
prepare_command, prepare_command,
read_python_configs, read_python_configs,
shell, shell,
split_config_settings,
unwrap, unwrap,
virtualenv, virtualenv,
) )
@@ -407,8 +408,10 @@ def build(options: Options, tmp_path: Path) -> None:
built_wheel_dir.mkdir() built_wheel_dir.mkdir()
verbosity_flags = get_build_verbosity_extra_flags(build_options.build_verbosity) verbosity_flags = get_build_verbosity_extra_flags(build_options.build_verbosity)
extra_flags = split_config_settings(build_options.config_settings)
if build_options.build_frontend == "pip": if build_options.build_frontend == "pip":
extra_flags += verbosity_flags
# Path.resolve() is needed. Without it pip wheel may try to fetch package from pypi.org # Path.resolve() is needed. Without it pip wheel may try to fetch package from pypi.org
# see https://github.com/pypa/cibuildwheel/pull/369 # see https://github.com/pypa/cibuildwheel/pull/369
call( call(
@@ -419,11 +422,12 @@ def build(options: Options, tmp_path: Path) -> None:
options.globals.package_dir.resolve(), options.globals.package_dir.resolve(),
f"--wheel-dir={built_wheel_dir}", f"--wheel-dir={built_wheel_dir}",
"--no-deps", "--no-deps",
*get_build_verbosity_extra_flags(build_options.build_verbosity), *extra_flags,
env=env, env=env,
) )
elif build_options.build_frontend == "build": elif build_options.build_frontend == "build":
config_setting = " ".join(verbosity_flags) verbosity_setting = " ".join(verbosity_flags)
extra_flags += (f"--config-setting={verbosity_setting}",)
build_env = env.copy() build_env = env.copy()
if build_options.dependency_constraints: if build_options.dependency_constraints:
constraints_path = ( constraints_path = (
@@ -450,7 +454,7 @@ def build(options: Options, tmp_path: Path) -> None:
build_options.package_dir, build_options.package_dir,
"--wheel", "--wheel",
f"--outdir={built_wheel_dir}", f"--outdir={built_wheel_dir}",
f"--config-setting={config_setting}", *extra_flags,
env=build_env, env=build_env,
) )
else: else:
+31 -1
View File
@@ -529,6 +529,36 @@ Choose which build backend to use. Can either be "pip", which will run
build-frontend = "pip" build-frontend = "pip"
``` ```
### `CIBW_CONFIG_SETTINGS` {: #config-settings}
> Specify config-settings for the build backend.
Specify config settings for the build backend. Each space separated
item will be passed via `--config-setting`. In TOML, you can specify
a table of items, including arrays.
!!! tip
Currently, "build" supports arrays for options, but "pip" only supports
single values.
Platform-specific environment variables also available:<br/>
`CIBW_BEFORE_ALL_MACOS` | `CIBW_BEFORE_ALL_WINDOWS` | `CIBW_BEFORE_ALL_LINUX`
#### Examples
!!! tab examples "Environment variables"
```yaml
CIBW_CONFIG_SETTINGS: "--build-option=--use-mypyc"
```
!!! tab examples "pyproject.toml"
```toml
[tool.cibuildwheel.config-settings]
--build-option = "--use-mypyc"
```
### `CIBW_ENVIRONMENT` {: #environment} ### `CIBW_ENVIRONMENT` {: #environment}
> Set environment variables needed during the build > Set environment variables needed during the build
@@ -911,7 +941,7 @@ The available options are (default value):
Set an alternative Docker image to be used for building [manylinux / musllinux](https://github.com/pypa/manylinux) wheels. Set an alternative Docker image to be used for building [manylinux / musllinux](https://github.com/pypa/manylinux) wheels.
For `CIBW_MANYLINUX_*_IMAGE`, the value of this option can either be set to `manylinux1`, `manylinux2010`, `manylinux2014`, `manylinux_2_24` or `manylinux_2_28` to use a pinned version of the [official manylinux images](https://github.com/pypa/manylinux). Alternatively, set these options to any other valid Docker image name. For PyPy, the `manylinux1` image is not available. For architectures other For `CIBW_MANYLINUX_*_IMAGE`, the value of this option can either be set to `manylinux1`, `manylinux2010`, `manylinux2014`, `manylinux_2_24` or `manylinux_2_28` to use a pinned version of the [official manylinux images](https://github.com/pypa/manylinux). Alternatively, set these options to any other valid Docker image name. For PyPy, the `manylinux1` image is not available. For architectures other
than x86 (x86\_64 and i686) `manylinux2014`, `manylinux_2_24` or `manylinux_2_28` must be used, because the first version of the manylinux specification that supports additional architectures is `manylinux2014`. `manylinux_2_28` is not supported for `i686` & `s390x` architectures. than x86 (x86\_64 and i686) `manylinux2014`, `manylinux_2_24` or `manylinux_2_28` must be used, because the first version of the manylinux specification that supports additional architectures is `manylinux2014`. `manylinux_2_28` is not supported for `i686` architecture.
For `CIBW_MUSLLINUX_*_IMAGE`, the value of this option can either be set to `musllinux_1_1` to use a pinned version of the [official musllinux images](https://github.com/pypa/musllinux). Alternatively, set these options to any other valid Docker image name. For `CIBW_MUSLLINUX_*_IMAGE`, the value of this option can either be set to `musllinux_1_1` to use a pinned version of the [official musllinux images](https://github.com/pypa/musllinux). Alternatively, set these options to any other valid Docker image name.
+110 -109
View File
@@ -26,9 +26,9 @@ title: Working examples
| [duckdb][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | DuckDB is an in-process SQL OLAP Database Management System | | [duckdb][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | DuckDB is an in-process SQL OLAP Database Management System |
| [Apache Beam][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Apache Beam is a unified programming model for Batch and Streaming data processing. | | [Apache Beam][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Apache Beam is a unified programming model for Batch and Streaming data processing. |
| [asyncpg][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | A fast PostgreSQL Database Client Library for Python/asyncio. | | [asyncpg][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | A fast PostgreSQL Database Client Library for Python/asyncio. |
| [PyGame][] | ![github icon][] | ![apple icon][] ![linux icon][] | pygame (the library) is a Free and Open Source python programming language library for making multimedia applications like games built on top of the excellent SDL library. C, Python, Native, OpenGL. | | [PyGame][] | ![github icon][] | ![apple icon][] ![linux icon][] | 🐍🎮 pygame (the library) is a Free and Open Source python programming language library for making multimedia applications like games built on top of the excellent SDL library. C, Python, Native, OpenGL. |
| [scikit-image][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Image processing library. Uses cibuildwheel to build and test a project that uses Cython with platform-native code. |
| [cmake][] | ![github icon][] ![travisci icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Multitagged binary builds for all supported platforms, using cibw 2 config configuration. | | [cmake][] | ![github icon][] ![travisci icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Multitagged binary builds for all supported platforms, using cibw 2 config configuration. |
| [scikit-image][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Image processing library. Uses cibuildwheel to build and test a project that uses Cython with platform-native code. |
| [twisted-iocpsupport][] | ![github icon][] | ![windows icon][] | A submodule of Twisted that hooks into native C APIs using Cython. | | [twisted-iocpsupport][] | ![github icon][] | ![windows icon][] | A submodule of Twisted that hooks into native C APIs using Cython. |
| [PyOxidizer][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | A modern Python application packaging and distribution tool | | [PyOxidizer][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | A modern Python application packaging and distribution tool |
| [websockets][] | ![travisci icon][] | ![apple icon][] ![linux icon][] | Library for building WebSocket servers and clients. Mostly written in Python, with a small C 'speedups' extension module. | | [websockets][] | ![travisci icon][] | ![apple icon][] ![linux icon][] | Library for building WebSocket servers and clients. Mostly written in Python, with a small C 'speedups' extension module. |
@@ -59,10 +59,10 @@ title: Working examples
| [OpenTimelineIO][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Open Source API and interchange format for editorial timeline information. | | [OpenTimelineIO][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Open Source API and interchange format for editorial timeline information. |
| [aioquic][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | QUIC and HTTP/3 implementation in Python | | [aioquic][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | QUIC and HTTP/3 implementation in Python |
| [ruptures][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Extensive Cython + NumPy [pyproject.toml](https://github.com/deepcharles/ruptures/blob/master/pyproject.toml) example. | | [ruptures][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Extensive Cython + NumPy [pyproject.toml](https://github.com/deepcharles/ruptures/blob/master/pyproject.toml) example. |
| [DeepForest][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | An Efficient, Scalable and Optimized Python Framework for Deep Forest (2021.2.1) |
| [Psycopg 3][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | A modern implementation of a PostgreSQL adapter for Python | | [Psycopg 3][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | A modern implementation of a PostgreSQL adapter for Python |
| [google neuroglancer][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | WebGL-based viewer for volumetric data | | [DeepForest][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | An Efficient, Scalable and Optimized Python Framework for Deep Forest (2021.2.1) |
| [envd][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | 🏕️ Development environment for machine learning | | [envd][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | 🏕️ Development environment for machine learning |
| [google neuroglancer][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | WebGL-based viewer for volumetric data |
| [Parselmouth][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | A Python interface to the Praat software package, using pybind11, C++17 and CMake, with the core Praat static library built only once and shared between wheels. | | [Parselmouth][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | A Python interface to the Praat software package, using pybind11, C++17 and CMake, with the core Praat static library built only once and shared between wheels. |
| [AutoPy][] | ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Includes a Windows Travis build. | | [AutoPy][] | ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Includes a Windows Travis build. |
| [H3-py][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Python bindings for H3, a hierarchical hexagonal geospatial indexing system | | [H3-py][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Python bindings for H3, a hierarchical hexagonal geospatial indexing system |
@@ -85,8 +85,8 @@ title: Working examples
| [iminuit][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Jupyter-friendly Python interface for C++ MINUIT2 | | [iminuit][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Jupyter-friendly Python interface for C++ MINUIT2 |
| [Tokenizer][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Fast and customizable text tokenization library with BPE and SentencePiece support | | [Tokenizer][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Fast and customizable text tokenization library with BPE and SentencePiece support |
| [PyGLM][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Fast OpenGL Mathematics (GLM) for Python | | [PyGLM][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Fast OpenGL Mathematics (GLM) for Python |
| [boost-histogram][] | ![github icon][] ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Supports full range of wheels, including PyPy and alternate archs. |
| [bx-python][] | ![travisci icon][] | ![apple icon][] ![linux icon][] | A library that includes Cython extensions. | | [bx-python][] | ![travisci icon][] | ![apple icon][] ![linux icon][] | A library that includes Cython extensions. |
| [boost-histogram][] | ![github icon][] ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Supports full range of wheels, including PyPy and alternate archs. |
| [TgCrypto][] | ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Includes a Windows Travis build. | | [TgCrypto][] | ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Includes a Windows Travis build. |
| [iDynTree][] | ![github icon][] | ![linux icon][] | Uses manylinux_2_24 | | [iDynTree][] | ![github icon][] | ![linux icon][] | Uses manylinux_2_24 |
| [mosec][] | ![github icon][] | ![linux icon][] ![apple icon][] | A high-performance serving framework for ML models, offers dynamic batching and multi-stage pipeline to fully exploit your compute machine | | [mosec][] | ![github icon][] | ![linux icon][] ![apple icon][] | A high-performance serving framework for ML models, offers dynamic batching and multi-stage pipeline to fully exploit your compute machine |
@@ -131,8 +131,8 @@ title: Working examples
[Apache Beam]: https://github.com/apache/beam [Apache Beam]: https://github.com/apache/beam
[asyncpg]: https://github.com/MagicStack/asyncpg [asyncpg]: https://github.com/MagicStack/asyncpg
[PyGame]: https://github.com/pygame/pygame [PyGame]: https://github.com/pygame/pygame
[scikit-image]: https://github.com/scikit-image/scikit-image
[cmake]: https://github.com/scikit-build/cmake-python-distributions [cmake]: https://github.com/scikit-build/cmake-python-distributions
[scikit-image]: https://github.com/scikit-image/scikit-image
[twisted-iocpsupport]: https://github.com/twisted/twisted-iocpsupport [twisted-iocpsupport]: https://github.com/twisted/twisted-iocpsupport
[PyOxidizer]: https://github.com/indygreg/PyOxidizer [PyOxidizer]: https://github.com/indygreg/PyOxidizer
[websockets]: https://github.com/aaugustin/websockets [websockets]: https://github.com/aaugustin/websockets
@@ -163,10 +163,10 @@ title: Working examples
[OpenTimelineIO]: https://github.com/PixarAnimationStudios/OpenTimelineIO [OpenTimelineIO]: https://github.com/PixarAnimationStudios/OpenTimelineIO
[aioquic]: https://github.com/aiortc/aioquic [aioquic]: https://github.com/aiortc/aioquic
[ruptures]: https://github.com/deepcharles/ruptures [ruptures]: https://github.com/deepcharles/ruptures
[DeepForest]: https://github.com/LAMDA-NJU/Deep-Forest
[Psycopg 3]: https://github.com/psycopg/psycopg [Psycopg 3]: https://github.com/psycopg/psycopg
[google neuroglancer]: https://github.com/google/neuroglancer [DeepForest]: https://github.com/LAMDA-NJU/Deep-Forest
[envd]: https://github.com/tensorchord/envd [envd]: https://github.com/tensorchord/envd
[google neuroglancer]: https://github.com/google/neuroglancer
[Parselmouth]: https://github.com/YannickJadoul/Parselmouth [Parselmouth]: https://github.com/YannickJadoul/Parselmouth
[AutoPy]: https://github.com/autopilot-rs/autopy [AutoPy]: https://github.com/autopilot-rs/autopy
[H3-py]: https://github.com/uber/h3-py [H3-py]: https://github.com/uber/h3-py
@@ -189,8 +189,8 @@ title: Working examples
[iminuit]: https://github.com/scikit-hep/iminuit [iminuit]: https://github.com/scikit-hep/iminuit
[Tokenizer]: https://github.com/OpenNMT/Tokenizer [Tokenizer]: https://github.com/OpenNMT/Tokenizer
[PyGLM]: https://github.com/Zuzu-Typ/PyGLM [PyGLM]: https://github.com/Zuzu-Typ/PyGLM
[boost-histogram]: https://github.com/scikit-hep/boost-histogram
[bx-python]: https://github.com/bxlab/bx-python [bx-python]: https://github.com/bxlab/bx-python
[boost-histogram]: https://github.com/scikit-hep/boost-histogram
[TgCrypto]: https://github.com/pyrogram/tgcrypto [TgCrypto]: https://github.com/pyrogram/tgcrypto
[iDynTree]: https://github.com/robotology/idyntree [iDynTree]: https://github.com/robotology/idyntree
[mosec]: https://github.com/mosecorg/mosec [mosec]: https://github.com/mosecorg/mosec
@@ -222,113 +222,114 @@ title: Working examples
[circleci icon]: data/readme_icons/circleci.svg [circleci icon]: data/readme_icons/circleci.svg
[gitlab icon]: data/readme_icons/gitlab.svg [gitlab icon]: data/readme_icons/gitlab.svg
[travisci icon]: data/readme_icons/travisci.svg [travisci icon]: data/readme_icons/travisci.svg
[cirrusci icon]: data/readme_icons/cirrusci.svg
[windows icon]: data/readme_icons/windows.svg [windows icon]: data/readme_icons/windows.svg
[apple icon]: data/readme_icons/apple.svg [apple icon]: data/readme_icons/apple.svg
[linux icon]: data/readme_icons/linux.svg [linux icon]: data/readme_icons/linux.svg
<!-- scikit-learn: 51114, last pushed 0 days ago --> <!-- scikit-learn: 51270, last pushed 0 days ago -->
<!-- NumPy: 21249, last pushed 0 days ago --> <!-- NumPy: 21357, last pushed 0 days ago -->
<!-- Tornado: 20697, last pushed 6 days ago --> <!-- Tornado: 20724, last pushed 6 days ago -->
<!-- pytorch-fairseq: 18945, last pushed 3 days ago --> <!-- pytorch-fairseq: 19079, last pushed 2 days ago -->
<!-- Matplotlib: 15998, last pushed 0 days ago --> <!-- Matplotlib: 16066, last pushed 0 days ago -->
<!-- NCNN: 15284, last pushed 0 days ago --> <!-- NCNN: 15395, last pushed 0 days ago -->
<!-- Kivy: 14913, last pushed 4 days ago --> <!-- Kivy: 14970, last pushed 0 days ago -->
<!-- Prophet: 14814, last pushed 16 days ago --> <!-- Prophet: 14851, last pushed 0 days ago -->
<!-- MyPy: 13635, last pushed 0 days ago --> <!-- MyPy: 13708, last pushed 0 days ago -->
<!-- pydantic: 10836, last pushed 0 days ago --> <!-- pydantic: 10965, last pushed 1 days ago -->
<!-- MemRay: 9119, last pushed 3 days ago --> <!-- MemRay: 9186, last pushed 1 days ago -->
<!-- uvloop: 8809, last pushed 5 days ago --> <!-- uvloop: 8832, last pushed 2 days ago -->
<!-- psutil: 8623, last pushed 3 days ago --> <!-- psutil: 8668, last pushed 0 days ago -->
<!-- vaex: 7240, last pushed 2 days ago --> <!-- vaex: 7272, last pushed 3 days ago -->
<!-- Google Benchmark: 6751, last pushed 0 days ago --> <!-- Google Benchmark: 6803, last pushed 1 days ago -->
<!-- duckdb: 5977, last pushed 0 days ago --> <!-- duckdb: 6189, last pushed 0 days ago -->
<!-- Apache Beam: 5785, last pushed 0 days ago --> <!-- Apache Beam: 5815, last pushed 0 days ago -->
<!-- asyncpg: 5603, last pushed 8 days ago --> <!-- asyncpg: 5616, last pushed 22 days ago -->
<!-- PyGame: 5145, last pushed 0 days ago --> <!-- PyGame: 5173, last pushed 0 days ago -->
<!-- scikit-image: 5019, last pushed 0 days ago --> <!-- cmake: 5036, last pushed 0 days ago -->
<!-- cmake: 4999, last pushed 0 days ago --> <!-- scikit-image: 5035, last pushed 0 days ago -->
<!-- twisted-iocpsupport: 4709, last pushed 0 days ago --> <!-- twisted-iocpsupport: 4732, last pushed 0 days ago -->
<!-- PyOxidizer: 4178, last pushed 0 days ago --> <!-- PyOxidizer: 4223, last pushed 12 days ago -->
<!-- websockets: 4123, last pushed 3 days ago --> <!-- websockets: 4147, last pushed 10 days ago -->
<!-- cvxpy: 4044, last pushed 4 days ago --> <!-- cvxpy: 4059, last pushed 2 days ago -->
<!-- Triton: 3926, last pushed 0 days ago --> <!-- Triton: 3952, last pushed 0 days ago -->
<!-- UltraJSON: 3801, last pushed 13 days ago --> <!-- UltraJSON: 3825, last pushed 27 days ago -->
<!-- River: 3532, last pushed 1 days ago --> <!-- River: 3571, last pushed 2 days ago -->
<!-- OpenSpiel: 3291, last pushed 0 days ago --> <!-- OpenSpiel: 3304, last pushed 0 days ago -->
<!-- pyzmq: 3139, last pushed 9 days ago --> <!-- pyzmq: 3150, last pushed 5 days ago -->
<!-- aiortc: 3043, last pushed 6 days ago --> <!-- aiortc: 3053, last pushed 20 days ago -->
<!-- Implicit: 2918, last pushed 0 days ago --> <!-- Implicit: 2932, last pushed 4 days ago -->
<!-- vispy: 2915, last pushed 16 days ago --> <!-- vispy: 2924, last pushed 2 days ago -->
<!-- Confluent client for Kafka: 2894, last pushed 3 days ago --> <!-- Confluent client for Kafka: 2917, last pushed 3 days ago -->
<!-- tinyobjloader: 2617, last pushed 47 days ago --> <!-- tinyobjloader: 2630, last pushed 61 days ago -->
<!-- Dependency Injector: 2300, last pushed 18 days ago --> <!-- Dependency Injector: 2334, last pushed 32 days ago -->
<!-- coverage.py: 2159, last pushed 0 days ago --> <!-- coverage.py: 2175, last pushed 0 days ago -->
<!-- PyCryptodome: 2098, last pushed 1 days ago --> <!-- PyCryptodome: 2111, last pushed 2 days ago -->
<!-- PyYAML: 1910, last pushed 7 days ago --> <!-- PyYAML: 1920, last pushed 7 days ago -->
<!-- numexpr: 1796, last pushed 2 days ago --> <!-- numexpr: 1804, last pushed 16 days ago -->
<!-- h5py: 1764, last pushed 3 days ago --> <!-- h5py: 1776, last pushed 3 days ago -->
<!-- Wrapt: 1728, last pushed 112 days ago --> <!-- Wrapt: 1739, last pushed 11 days ago -->
<!-- PyAV: 1632, last pushed 6 days ago --> <!-- PyAV: 1647, last pushed 6 days ago -->
<!-- SimpleJSON: 1512, last pushed 51 days ago --> <!-- SimpleJSON: 1513, last pushed 65 days ago -->
<!-- pikepdf: 1466, last pushed 1 days ago --> <!-- pikepdf: 1484, last pushed 4 days ago -->
<!-- OpenColorIO: 1357, last pushed 40 days ago --> <!-- OpenColorIO: 1360, last pushed 4 days ago -->
<!-- Line Profiler: 1322, last pushed 4 days ago --> <!-- Line Profiler: 1353, last pushed 18 days ago -->
<!-- PyTables: 1142, last pushed 0 days ago --> <!-- PyTables: 1144, last pushed 11 days ago -->
<!-- OpenTimelineIO: 1084, last pushed 3 days ago --> <!-- OpenTimelineIO: 1087, last pushed 0 days ago -->
<!-- aioquic: 1031, last pushed 2 days ago --> <!-- aioquic: 1045, last pushed 16 days ago -->
<!-- ruptures: 1017, last pushed 45 days ago --> <!-- ruptures: 1035, last pushed 10 days ago -->
<!-- DeepForest: 773, last pushed 99 days ago --> <!-- Psycopg 3: 776, last pushed 0 days ago -->
<!-- Psycopg 3: 759, last pushed 1 days ago --> <!-- DeepForest: 775, last pushed 114 days ago -->
<!-- google neuroglancer: 747, last pushed 2 days ago --> <!-- envd: 759, last pushed 0 days ago -->
<!-- envd: 736, last pushed 1 days ago --> <!-- google neuroglancer: 750, last pushed 2 days ago -->
<!-- Parselmouth: 675, last pushed 42 days ago --> <!-- Parselmouth: 684, last pushed 56 days ago -->
<!-- AutoPy: 671, last pushed 239 days ago --> <!-- AutoPy: 672, last pushed 253 days ago -->
<!-- H3-py: 559, last pushed 0 days ago --> <!-- H3-py: 561, last pushed 7 days ago -->
<!-- Rtree: 497, last pushed 124 days ago --> <!-- Rtree: 501, last pushed 138 days ago -->
<!-- markupsafe: 487, last pushed 20 days ago --> <!-- markupsafe: 491, last pushed 3 days ago -->
<!-- python-rapidjson: 456, last pushed 32 days ago --> <!-- python-rapidjson: 457, last pushed 46 days ago -->
<!-- python-snappy: 444, last pushed 158 days ago --> <!-- python-snappy: 445, last pushed 172 days ago -->
<!-- pybind11 cmake_example: 431, last pushed 10 days ago --> <!-- pybind11 cmake_example: 433, last pushed 24 days ago -->
<!-- KDEpy: 396, last pushed 192 days ago --> <!-- KDEpy: 399, last pushed 206 days ago -->
<!-- tgcalls: 385, last pushed 51 days ago --> <!-- tgcalls: 388, last pushed 65 days ago -->
<!-- pybind11 python_example: 356, last pushed 10 days ago --> <!-- pybind11 python_example: 358, last pushed 24 days ago -->
<!-- dd-trace-py: 353, last pushed 2 days ago --> <!-- dd-trace-py: 356, last pushed 2 days ago -->
<!-- CTranslate2: 322, last pushed 16 days ago --> <!-- CTranslate2: 330, last pushed 2 days ago -->
<!-- time-machine: 320, last pushed 5 days ago --> <!-- time-machine: 321, last pushed 8 days ago -->
<!-- sourmash: 317, last pushed 0 days ago --> <!-- sourmash: 320, last pushed 0 days ago -->
<!-- cyvcf2: 302, last pushed 6 days ago --> <!-- cyvcf2: 304, last pushed 20 days ago -->
<!-- matrixprofile: 278, last pushed 48 days ago --> <!-- matrixprofile: 280, last pushed 62 days ago -->
<!-- abess: 275, last pushed 0 days ago --> <!-- abess: 278, last pushed 9 days ago -->
<!-- jq.py: 224, last pushed 196 days ago --> <!-- jq.py: 228, last pushed 3 days ago -->
<!-- iminuit: 210, last pushed 5 days ago --> <!-- iminuit: 210, last pushed 9 days ago -->
<!-- Tokenizer: 187, last pushed 16 days ago --> <!-- Tokenizer: 186, last pushed 4 days ago -->
<!-- PyGLM: 149, last pushed 146 days ago --> <!-- PyGLM: 150, last pushed 160 days ago -->
<!-- boost-histogram: 116, last pushed 3 days ago --> <!-- bx-python: 116, last pushed 7 days ago -->
<!-- bx-python: 114, last pushed 228 days ago --> <!-- boost-histogram: 116, last pushed 6 days ago -->
<!-- TgCrypto: 110, last pushed 170 days ago --> <!-- TgCrypto: 110, last pushed 184 days ago -->
<!-- iDynTree: 108, last pushed 3 days ago --> <!-- iDynTree: 108, last pushed 4 days ago -->
<!-- mosec: 102, last pushed 2 days ago --> <!-- mosec: 104, last pushed 0 days ago -->
<!-- Python-WebRTC: 93, last pushed 164 days ago --> <!-- Python-WebRTC: 93, last pushed 178 days ago -->
<!-- pybase64: 87, last pushed 0 days ago --> <!-- pybase64: 87, last pushed 1 days ago -->
<!-- Arbor: 78, last pushed 2 days ago --> <!-- Arbor: 78, last pushed 2 days ago -->
<!-- fathon: 66, last pushed 80 days ago --> <!-- fathon: 67, last pushed 94 days ago -->
<!-- etebase-py: 58, last pushed 46 days ago --> <!-- etebase-py: 58, last pushed 60 days ago -->
<!-- polaroid: 52, last pushed 102 days ago --> <!-- polaroid: 53, last pushed 116 days ago -->
<!-- cf-units: 49, last pushed 0 days ago --> <!-- cf-units: 49, last pushed 0 days ago -->
<!-- Imagecodecs (fork): 47, last pushed 13 days ago --> <!-- Imagecodecs (fork): 47, last pushed 27 days ago -->
<!-- pillow-heif: 44, last pushed 1 days ago --> <!-- pillow-heif: 46, last pushed 15 days ago -->
<!-- power-grid-model: 43, last pushed 0 days ago --> <!-- power-grid-model: 46, last pushed 4 days ago -->
<!-- clang-format: 41, last pushed 19 days ago --> <!-- clang-format: 43, last pushed 3 days ago -->
<!-- numpythia: 34, last pushed 18 days ago --> <!-- numpythia: 34, last pushed 4 days ago -->
<!-- pybind11 scikit_build_example: 33, last pushed 10 days ago --> <!-- pybind11 scikit_build_example: 33, last pushed 24 days ago -->
<!-- pyjet: 33, last pushed 18 days ago --> <!-- pyjet: 33, last pushed 4 days ago -->
<!-- ninja: 25, last pushed 4 days ago --> <!-- ninja: 25, last pushed 4 days ago -->
<!-- GSD: 19, last pushed 2 days ago --> <!-- GSD: 19, last pushed 3 days ago -->
<!-- pyinstrument_cext: 10, last pushed 317 days ago --> <!-- pyinstrument_cext: 10, last pushed 331 days ago -->
<!-- CorrectionLib: 10, last pushed 9 days ago --> <!-- CorrectionLib: 10, last pushed 4 days ago -->
<!-- xmlstarlet: 9, last pushed 6 days ago --> <!-- xmlstarlet: 9, last pushed 20 days ago -->
<!-- SiPM: 7, last pushed 81 days ago --> <!-- SiPM: 7, last pushed 95 days ago -->
<!-- ril: 4, last pushed 2 days ago --> <!-- ril: 3, last pushed 16 days ago -->
<!-- END bin/projects.py --> <!-- END bin/projects.py -->
-2
View File
@@ -59,8 +59,6 @@ def test(manylinux_image, tmp_path):
elif platform.machine() not in ["x86_64", "i686"]: elif platform.machine() not in ["x86_64", "i686"]:
if manylinux_image in ["manylinux1", "manylinux2010"]: if manylinux_image in ["manylinux1", "manylinux2010"]:
pytest.skip("manylinux1 and 2010 doesn't exist for non-x86 architectures") pytest.skip("manylinux1 and 2010 doesn't exist for non-x86 architectures")
elif manylinux_image == "manylinux_2_28" and platform.machine() == "s390x":
pytest.skip("manylinux_2_28 doesn't exist for s390x architecture")
elif manylinux_image == "manylinux_2_28" and platform.machine() == "i686": elif manylinux_image == "manylinux_2_28" and platform.machine() == "i686":
pytest.skip("manylinux_2_28 doesn't exist for i686 architecture") pytest.skip("manylinux_2_28 doesn't exist for i686 architecture")
+22 -1
View File
@@ -14,7 +14,7 @@ else:
from cibuildwheel.__main__ import main from cibuildwheel.__main__ import main
from cibuildwheel.environment import ParsedEnvironment from cibuildwheel.environment import ParsedEnvironment
from cibuildwheel.options import BuildOptions, _get_pinned_container_images from cibuildwheel.options import BuildOptions, _get_pinned_container_images
from cibuildwheel.util import BuildSelector, resources_dir from cibuildwheel.util import BuildSelector, resources_dir, split_config_settings
# CIBW_PLATFORM is tested in main_platform_test.py # CIBW_PLATFORM is tested in main_platform_test.py
@@ -263,6 +263,27 @@ def test_build_verbosity(
assert build_options.build_verbosity == expected_verbosity assert build_options.build_verbosity == expected_verbosity
@pytest.mark.parametrize("platform_specific", [False, True])
def test_config_settings(platform_specific, platform, intercepted_build_args, monkeypatch):
config_settings = 'setting=value setting=value2 other="something else"'
if platform_specific:
monkeypatch.setenv("CIBW_CONFIG_SETTINGS_" + platform.upper(), config_settings)
monkeypatch.setenv("CIBW_CONFIG_SETTIGNS", "a=b")
else:
monkeypatch.setenv("CIBW_CONFIG_SETTINGS", config_settings)
main()
build_options = intercepted_build_args.args[0].build_options(identifier=None)
assert build_options.config_settings == config_settings
assert split_config_settings(config_settings) == [
"--config-setting=setting=value",
"--config-setting=setting=value2",
"--config-setting=other=something else",
]
@pytest.mark.parametrize( @pytest.mark.parametrize(
"selector", "selector",
[ [
+31 -1
View File
@@ -1,6 +1,7 @@
from __future__ import annotations from __future__ import annotations
import platform as platform_module import platform as platform_module
import textwrap
import pytest import pytest
@@ -58,7 +59,7 @@ test_command: 'pyproject'
default_build_options = options.build_options(identifier=None) default_build_options = options.build_options(identifier=None)
assert default_build_options.environment == parse_environment('FOO="BAR"') assert default_build_options.environment == parse_environment("FOO=BAR")
all_pinned_container_images = _get_pinned_container_images() all_pinned_container_images = _get_pinned_container_images()
pinned_x86_64_container_image = all_pinned_container_images["x86_64"] pinned_x86_64_container_image = all_pinned_container_images["x86_64"]
@@ -116,3 +117,32 @@ def test_passthrough_evil(tmp_path, monkeypatch, env_var_value):
monkeypatch.setenv("ENV_VAR", env_var_value) monkeypatch.setenv("ENV_VAR", env_var_value)
parsed_environment = options.build_options(identifier=None).environment parsed_environment = options.build_options(identifier=None).environment
assert parsed_environment.as_dictionary(prev_environment={}) == {"ENV_VAR": env_var_value} assert parsed_environment.as_dictionary(prev_environment={}) == {"ENV_VAR": env_var_value}
@pytest.mark.parametrize(
"env_var_value",
[
"normal value",
'"value wrapped in quotes"',
'an unclosed double-quote: "',
"string\nwith\ncarriage\nreturns\n",
"a trailing backslash \\",
],
)
def test_toml_environment_evil(tmp_path, monkeypatch, env_var_value):
args = get_default_command_line_arguments()
args.package_dir = tmp_path
with tmp_path.joinpath("pyproject.toml").open("w") as f:
f.write(
textwrap.dedent(
f"""\
[tool.cibuildwheel.environment]
EXAMPLE='''{env_var_value}'''
"""
)
)
options = Options(platform="linux", command_line_arguments=args)
parsed_environment = options.build_options(identifier=None).environment
assert parsed_environment.as_dictionary(prev_environment={}) == {"EXAMPLE": env_var_value}
+35
View File
@@ -331,3 +331,38 @@ test-command = "pyproject-override"
with pytest.raises(ConfigOptionError): with pytest.raises(ConfigOptionError):
OptionsReader(config_file_path=pyproject_toml, platform=platform) OptionsReader(config_file_path=pyproject_toml, platform=platform)
def test_config_settings(tmp_path):
pyproject_toml: Path = tmp_path / "pyproject.toml"
pyproject_toml.write_text(
"""\
[tool.cibuildwheel.config-settings]
example = "one"
other = ["two", "three"]
"""
)
options_reader = OptionsReader(config_file_path=pyproject_toml, platform="linux")
assert (
options_reader.get("config-settings", table={"item": '{k}="{v}"', "sep": " "})
== 'example="one" other="two" other="three"'
)
def test_pip_config_settings(tmp_path):
pyproject_toml: Path = tmp_path / "pyproject.toml"
pyproject_toml.write_text(
"""\
[tool.cibuildwheel.config-settings]
--build-option="--use-mypyc"
"""
)
options_reader = OptionsReader(config_file_path=pyproject_toml, platform="linux")
assert (
options_reader.get(
"config-settings", table={"item": "--config-settings='{k}=\"{v}\"'", "sep": " "}
)
== "--config-settings='--build-option=\"--use-mypyc\"'"
)