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$
- repo: https://github.com/psf/black
rev: 22.6.0
rev: 22.8.0
hooks:
- 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", "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", "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_aarch64", "quay.io/pypa/manylinux_2_28_aarch64", None),
# musllinux_1_1 images
+10 -3
View File
@@ -5,7 +5,6 @@ import os
import shutil
import sys
import tarfile
import tempfile
import textwrap
from pathlib import Path
from tempfile import mkdtemp
@@ -130,8 +129,8 @@ def main() -> None:
return
# Tarfile builds require extraction and changing the directory
with tempfile.TemporaryDirectory(prefix="cibw-sdist-") as temp_dir_str:
temp_dir = Path(temp_dir_str)
temp_dir = Path(mkdtemp(prefix="cibw-sdist-")).resolve(strict=True)
try:
with tarfile.open(args.package_dir) as tar:
tar.extractall(path=temp_dir)
@@ -146,6 +145,12 @@ def main() -> None:
with chdir(temp_dir):
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:
@@ -253,6 +258,8 @@ def build_in_directory(args: CommandLineArguments) -> None:
else:
assert_never(platform)
finally:
# avoid https://github.com/python/cpython/issues/86962 by performing
# cleanup manually
shutil.rmtree(tmp_path, ignore_errors=sys.platform.startswith("win"))
if tmp_path.exists():
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,
prepare_command,
read_python_configs,
split_config_settings,
unwrap,
)
@@ -212,8 +213,10 @@ 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)
if build_options.build_frontend == "pip":
extra_flags += verbosity_flags
container.call(
[
"python",
@@ -223,12 +226,13 @@ def build_in_container(
container_package_dir,
f"--wheel-dir={built_wheel_dir}",
"--no-deps",
*verbosity_flags,
*extra_flags,
],
env=env,
)
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(
[
"python",
@@ -237,7 +241,7 @@ def build_in_container(
container_package_dir,
"--wheel",
f"--outdir={built_wheel_dir}",
f"--config-setting={config_setting}",
*extra_flags,
],
env=env,
)
+7 -3
View File
@@ -34,6 +34,7 @@ from .util import (
prepare_command,
read_python_configs,
shell,
split_config_settings,
unwrap,
virtualenv,
)
@@ -345,8 +346,10 @@ 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)
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
# see https://github.com/pypa/cibuildwheel/pull/369
call(
@@ -357,11 +360,12 @@ def build(options: Options, tmp_path: Path) -> None:
build_options.package_dir.resolve(),
f"--wheel-dir={built_wheel_dir}",
"--no-deps",
*verbosity_flags,
*extra_flags,
env=env,
)
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()
if build_options.dependency_constraints:
constraint_path = (
@@ -378,7 +382,7 @@ def build(options: Options, tmp_path: Path) -> None:
build_options.package_dir,
"--wheel",
f"--outdir={built_wheel_dir}",
f"--config-setting={config_setting}",
*extra_flags,
env=build_env,
)
else:
+24 -5
View File
@@ -3,13 +3,14 @@ from __future__ import annotations
import difflib
import functools
import os
import shlex
import sys
import traceback
from configparser import ConfigParser
from contextlib import contextmanager
from dataclasses import asdict, dataclass
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):
import tomllib
@@ -77,6 +78,7 @@ class BuildOptions:
test_extras: str
build_verbosity: int
build_frontend: BuildFrontend
config_settings: str
@property
def package_dir(self) -> Path:
@@ -293,8 +295,9 @@ class OptionsReader:
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,
it will be formatted with "table['item']" using {k} and {v} and merged
with "table['sep']". Empty variables will not override if ignore_empty
is True.
with "table['sep']". If sep is also given, it will be used for arrays
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:
@@ -324,7 +327,9 @@ class OptionsReader:
if isinstance(result, dict):
if table is None:
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 sep is None:
@@ -337,6 +342,16 @@ class OptionsReader:
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:
def __init__(self, platform: PlatformName, command_line_arguments: CommandLineArguments):
self.platform = platform
@@ -427,11 +442,14 @@ class Options:
build_frontend_str = self.reader.get("build-frontend", env_plat=False)
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()
before_build = self.reader.get("before-build", 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")
test_command = self.reader.get("test-command", sep=" && ")
@@ -537,6 +555,7 @@ class Options:
manylinux_images=manylinux_images or None,
musllinux_images=musllinux_images or None,
build_frontend=build_frontend,
config_settings=config_settings,
)
def check_for_invalid_configuration(self, identifiers: list[str]) -> None:
@@ -6,7 +6,7 @@
#
delocate==0.10.2
# via -r cibuildwheel/resources/constraints.in
distlib==0.3.5
distlib==0.3.6
# via virtualenv
filelock==3.8.0
# via virtualenv
@@ -14,7 +14,7 @@ platformdirs==2.5.2
# via virtualenv
typing-extensions==4.3.0
# via delocate
virtualenv==20.16.3
virtualenv==20.16.4
# via -r cibuildwheel/resources/constraints.in
wheel==0.37.1
# via
@@ -24,5 +24,5 @@ wheel==0.37.1
# The following packages are considered to be unsafe in a requirements file:
pip==22.2.2
# via -r cibuildwheel/resources/constraints.in
setuptools==65.2.0
setuptools==65.3.0
# via -r cibuildwheel/resources/constraints.in
@@ -6,7 +6,7 @@
#
delocate==0.10.2
# via -r cibuildwheel/resources/constraints.in
distlib==0.3.5
distlib==0.3.6
# via virtualenv
filelock==3.8.0
# via virtualenv
@@ -14,7 +14,7 @@ platformdirs==2.5.2
# via virtualenv
typing-extensions==4.3.0
# via delocate
virtualenv==20.16.3
virtualenv==20.16.4
# via -r cibuildwheel/resources/constraints.in
wheel==0.37.1
# via
@@ -24,5 +24,5 @@ wheel==0.37.1
# The following packages are considered to be unsafe in a requirements file:
pip==22.2.2
# via -r cibuildwheel/resources/constraints.in
setuptools==65.2.0
setuptools==65.3.0
# via -r cibuildwheel/resources/constraints.in
@@ -6,7 +6,7 @@
#
delocate==0.10.2
# via -r cibuildwheel/resources/constraints.in
distlib==0.3.5
distlib==0.3.6
# via virtualenv
filelock==3.4.1
# via virtualenv
@@ -20,7 +20,7 @@ typing-extensions==4.1.1
# via
# delocate
# importlib-metadata
virtualenv==20.16.3
virtualenv==20.16.4
# via -r cibuildwheel/resources/constraints.in
wheel==0.37.1
# via
@@ -6,7 +6,7 @@
#
delocate==0.10.2
# via -r cibuildwheel/resources/constraints.in
distlib==0.3.5
distlib==0.3.6
# via virtualenv
filelock==3.8.0
# via virtualenv
@@ -18,7 +18,7 @@ typing-extensions==4.3.0
# via
# delocate
# importlib-metadata
virtualenv==20.16.3
virtualenv==20.16.4
# via -r cibuildwheel/resources/constraints.in
wheel==0.37.1
# via
@@ -30,5 +30,5 @@ zipp==3.8.1
# The following packages are considered to be unsafe in a requirements file:
pip==22.2.2
# via -r cibuildwheel/resources/constraints.in
setuptools==65.2.0
setuptools==65.3.0
# via -r cibuildwheel/resources/constraints.in
@@ -6,7 +6,7 @@
#
delocate==0.10.2
# via -r cibuildwheel/resources/constraints.in
distlib==0.3.5
distlib==0.3.6
# via virtualenv
filelock==3.8.0
# via virtualenv
@@ -14,7 +14,7 @@ platformdirs==2.5.2
# via virtualenv
typing-extensions==4.3.0
# via delocate
virtualenv==20.16.3
virtualenv==20.16.4
# via -r cibuildwheel/resources/constraints.in
wheel==0.37.1
# via
@@ -24,5 +24,5 @@ wheel==0.37.1
# The following packages are considered to be unsafe in a requirements file:
pip==22.2.2
# via -r cibuildwheel/resources/constraints.in
setuptools==65.2.0
setuptools==65.3.0
# via -r cibuildwheel/resources/constraints.in
@@ -6,7 +6,7 @@
#
delocate==0.10.2
# via -r cibuildwheel/resources/constraints.in
distlib==0.3.5
distlib==0.3.6
# via virtualenv
filelock==3.8.0
# via virtualenv
@@ -14,7 +14,7 @@ platformdirs==2.5.2
# via virtualenv
typing-extensions==4.3.0
# via delocate
virtualenv==20.16.3
virtualenv==20.16.4
# via -r cibuildwheel/resources/constraints.in
wheel==0.37.1
# via
@@ -24,5 +24,5 @@ wheel==0.37.1
# The following packages are considered to be unsafe in a requirements file:
pip==22.2.2
# via -r cibuildwheel/resources/constraints.in
setuptools==65.2.0
setuptools==65.3.0
# via -r cibuildwheel/resources/constraints.in
+3 -3
View File
@@ -6,7 +6,7 @@
#
delocate==0.10.2
# via -r cibuildwheel/resources/constraints.in
distlib==0.3.5
distlib==0.3.6
# via virtualenv
filelock==3.8.0
# via virtualenv
@@ -14,7 +14,7 @@ platformdirs==2.5.2
# via virtualenv
typing-extensions==4.3.0
# via delocate
virtualenv==20.16.3
virtualenv==20.16.4
# via -r cibuildwheel/resources/constraints.in
wheel==0.37.1
# via
@@ -24,5 +24,5 @@ wheel==0.37.1
# The following packages are considered to be unsafe in a requirements file:
pip==22.2.2
# via -r cibuildwheel/resources/constraints.in
setuptools==65.2.0
setuptools==65.3.0
# via -r cibuildwheel/resources/constraints.in
+1
View File
@@ -5,6 +5,7 @@ test-skip = ""
archs = ["auto"]
build-frontend = "pip"
config-settings = {}
dependency-versions = "pinned"
environment = {}
environment-pass = []
+29 -28
View File
@@ -1,48 +1,49 @@
[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
manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2022-08-21-92d3131
manylinux_2_24 = quay.io/pypa/manylinux_2_24_x86_64:2022-08-21-92d3131
manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2022-08-21-92d3131
musllinux_1_1 = quay.io/pypa/musllinux_1_1_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-09-04-870f6a2
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-09-04-870f6a2
[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
manylinux2014 = quay.io/pypa/manylinux2014_i686:2022-08-21-92d3131
manylinux_2_24 = quay.io/pypa/manylinux_2_24_i686:2022-08-21-92d3131
musllinux_1_1 = quay.io/pypa/musllinux_1_1_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-09-04-870f6a2
musllinux_1_1 = quay.io/pypa/musllinux_1_1_i686:2022-09-04-870f6a2
[pypy_x86_64]
manylinux2010 = quay.io/pypa/manylinux2010_x86_64:2022-08-05-4535177
manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2022-08-21-92d3131
manylinux_2_24 = quay.io/pypa/manylinux_2_24_x86_64:2022-08-21-92d3131
manylinux_2_28 = quay.io/pypa/manylinux_2_28_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-09-04-870f6a2
manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2022-09-04-870f6a2
[pypy_i686]
manylinux2010 = quay.io/pypa/manylinux2010_i686:2022-08-05-4535177
manylinux2014 = quay.io/pypa/manylinux2014_i686:2022-08-21-92d3131
manylinux_2_24 = quay.io/pypa/manylinux_2_24_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-09-04-870f6a2
[aarch64]
manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2022-08-21-92d3131
manylinux_2_24 = quay.io/pypa/manylinux_2_24_aarch64:2022-08-21-92d3131
manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2022-08-21-92d3131
musllinux_1_1 = quay.io/pypa/musllinux_1_1_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-09-04-870f6a2
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-09-04-870f6a2
[ppc64le]
manylinux2014 = quay.io/pypa/manylinux2014_ppc64le:2022-08-21-92d3131
manylinux_2_24 = quay.io/pypa/manylinux_2_24_ppc64le:2022-08-21-92d3131
manylinux_2_28 = quay.io/pypa/manylinux_2_28_ppc64le:2022-08-21-92d3131
musllinux_1_1 = quay.io/pypa/musllinux_1_1_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-09-04-870f6a2
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-09-04-870f6a2
[s390x]
manylinux2014 = quay.io/pypa/manylinux2014_s390x:2022-08-21-92d3131
manylinux_2_24 = quay.io/pypa/manylinux_2_24_s390x:2022-08-21-92d3131
musllinux_1_1 = quay.io/pypa/musllinux_1_1_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-09-04-870f6a2
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]
manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2022-08-21-92d3131
manylinux_2_24 = quay.io/pypa/manylinux_2_24_aarch64:2022-08-21-92d3131
manylinux_2_28 = quay.io/pypa/manylinux_2_28_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-09-04-870f6a2
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"
url = "https://github.com/pypa/get-virtualenv/blob/20.16.3/public/virtualenv.pyz?raw=true"
version = "20.16.4"
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",
"cached_property",
"chdir",
"split_config_settings",
]
resources_dir: Final = Path(__file__).parent / "resources"
@@ -205,6 +206,11 @@ def get_build_verbosity_extra_flags(level: int) -> list[str]:
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]]:
input_file = resources_dir / "build-platforms.toml"
with input_file.open("rb") as f:
+7 -3
View File
@@ -34,6 +34,7 @@ from .util import (
prepare_command,
read_python_configs,
shell,
split_config_settings,
unwrap,
virtualenv,
)
@@ -407,8 +408,10 @@ 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)
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
# see https://github.com/pypa/cibuildwheel/pull/369
call(
@@ -419,11 +422,12 @@ def build(options: Options, tmp_path: Path) -> None:
options.globals.package_dir.resolve(),
f"--wheel-dir={built_wheel_dir}",
"--no-deps",
*get_build_verbosity_extra_flags(build_options.build_verbosity),
*extra_flags,
env=env,
)
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()
if build_options.dependency_constraints:
constraints_path = (
@@ -450,7 +454,7 @@ def build(options: Options, tmp_path: Path) -> None:
build_options.package_dir,
"--wheel",
f"--outdir={built_wheel_dir}",
f"--config-setting={config_setting}",
*extra_flags,
env=build_env,
)
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"
```
### `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}
> 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.
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.
+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 |
| [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. |
| [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. |
| [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. |
| [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. |
| [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. |
@@ -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. |
| [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. |
| [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 |
| [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 |
| [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. |
| [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 |
@@ -85,8 +85,8 @@ title: Working examples
| [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 |
| [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. |
| [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. |
| [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 |
@@ -131,8 +131,8 @@ title: Working examples
[Apache Beam]: https://github.com/apache/beam
[asyncpg]: https://github.com/MagicStack/asyncpg
[PyGame]: https://github.com/pygame/pygame
[scikit-image]: https://github.com/scikit-image/scikit-image
[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
[PyOxidizer]: https://github.com/indygreg/PyOxidizer
[websockets]: https://github.com/aaugustin/websockets
@@ -163,10 +163,10 @@ title: Working examples
[OpenTimelineIO]: https://github.com/PixarAnimationStudios/OpenTimelineIO
[aioquic]: https://github.com/aiortc/aioquic
[ruptures]: https://github.com/deepcharles/ruptures
[DeepForest]: https://github.com/LAMDA-NJU/Deep-Forest
[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
[google neuroglancer]: https://github.com/google/neuroglancer
[Parselmouth]: https://github.com/YannickJadoul/Parselmouth
[AutoPy]: https://github.com/autopilot-rs/autopy
[H3-py]: https://github.com/uber/h3-py
@@ -189,8 +189,8 @@ title: Working examples
[iminuit]: https://github.com/scikit-hep/iminuit
[Tokenizer]: https://github.com/OpenNMT/Tokenizer
[PyGLM]: https://github.com/Zuzu-Typ/PyGLM
[boost-histogram]: https://github.com/scikit-hep/boost-histogram
[bx-python]: https://github.com/bxlab/bx-python
[boost-histogram]: https://github.com/scikit-hep/boost-histogram
[TgCrypto]: https://github.com/pyrogram/tgcrypto
[iDynTree]: https://github.com/robotology/idyntree
[mosec]: https://github.com/mosecorg/mosec
@@ -222,113 +222,114 @@ title: Working examples
[circleci icon]: data/readme_icons/circleci.svg
[gitlab icon]: data/readme_icons/gitlab.svg
[travisci icon]: data/readme_icons/travisci.svg
[cirrusci icon]: data/readme_icons/cirrusci.svg
[windows icon]: data/readme_icons/windows.svg
[apple icon]: data/readme_icons/apple.svg
[linux icon]: data/readme_icons/linux.svg
<!-- scikit-learn: 51114, last pushed 0 days ago -->
<!-- NumPy: 21249, last pushed 0 days ago -->
<!-- Tornado: 20697, last pushed 6 days ago -->
<!-- pytorch-fairseq: 18945, last pushed 3 days ago -->
<!-- Matplotlib: 15998, last pushed 0 days ago -->
<!-- NCNN: 15284, last pushed 0 days ago -->
<!-- Kivy: 14913, last pushed 4 days ago -->
<!-- Prophet: 14814, last pushed 16 days ago -->
<!-- MyPy: 13635, last pushed 0 days ago -->
<!-- pydantic: 10836, last pushed 0 days ago -->
<!-- MemRay: 9119, last pushed 3 days ago -->
<!-- uvloop: 8809, last pushed 5 days ago -->
<!-- psutil: 8623, last pushed 3 days ago -->
<!-- vaex: 7240, last pushed 2 days ago -->
<!-- Google Benchmark: 6751, last pushed 0 days ago -->
<!-- duckdb: 5977, last pushed 0 days ago -->
<!-- Apache Beam: 5785, last pushed 0 days ago -->
<!-- asyncpg: 5603, last pushed 8 days ago -->
<!-- PyGame: 5145, last pushed 0 days ago -->
<!-- scikit-image: 5019, last pushed 0 days ago -->
<!-- cmake: 4999, last pushed 0 days ago -->
<!-- twisted-iocpsupport: 4709, last pushed 0 days ago -->
<!-- PyOxidizer: 4178, last pushed 0 days ago -->
<!-- websockets: 4123, last pushed 3 days ago -->
<!-- cvxpy: 4044, last pushed 4 days ago -->
<!-- Triton: 3926, last pushed 0 days ago -->
<!-- UltraJSON: 3801, last pushed 13 days ago -->
<!-- River: 3532, last pushed 1 days ago -->
<!-- OpenSpiel: 3291, last pushed 0 days ago -->
<!-- pyzmq: 3139, last pushed 9 days ago -->
<!-- aiortc: 3043, last pushed 6 days ago -->
<!-- Implicit: 2918, last pushed 0 days ago -->
<!-- vispy: 2915, last pushed 16 days ago -->
<!-- Confluent client for Kafka: 2894, last pushed 3 days ago -->
<!-- tinyobjloader: 2617, last pushed 47 days ago -->
<!-- Dependency Injector: 2300, last pushed 18 days ago -->
<!-- coverage.py: 2159, last pushed 0 days ago -->
<!-- PyCryptodome: 2098, last pushed 1 days ago -->
<!-- PyYAML: 1910, last pushed 7 days ago -->
<!-- numexpr: 1796, last pushed 2 days ago -->
<!-- h5py: 1764, last pushed 3 days ago -->
<!-- Wrapt: 1728, last pushed 112 days ago -->
<!-- PyAV: 1632, last pushed 6 days ago -->
<!-- SimpleJSON: 1512, last pushed 51 days ago -->
<!-- pikepdf: 1466, last pushed 1 days ago -->
<!-- OpenColorIO: 1357, last pushed 40 days ago -->
<!-- Line Profiler: 1322, last pushed 4 days ago -->
<!-- PyTables: 1142, last pushed 0 days ago -->
<!-- OpenTimelineIO: 1084, last pushed 3 days ago -->
<!-- aioquic: 1031, last pushed 2 days ago -->
<!-- ruptures: 1017, last pushed 45 days ago -->
<!-- DeepForest: 773, last pushed 99 days ago -->
<!-- Psycopg 3: 759, last pushed 1 days ago -->
<!-- google neuroglancer: 747, last pushed 2 days ago -->
<!-- envd: 736, last pushed 1 days ago -->
<!-- Parselmouth: 675, last pushed 42 days ago -->
<!-- AutoPy: 671, last pushed 239 days ago -->
<!-- H3-py: 559, last pushed 0 days ago -->
<!-- Rtree: 497, last pushed 124 days ago -->
<!-- markupsafe: 487, last pushed 20 days ago -->
<!-- python-rapidjson: 456, last pushed 32 days ago -->
<!-- python-snappy: 444, last pushed 158 days ago -->
<!-- pybind11 cmake_example: 431, last pushed 10 days ago -->
<!-- KDEpy: 396, last pushed 192 days ago -->
<!-- tgcalls: 385, last pushed 51 days ago -->
<!-- pybind11 python_example: 356, last pushed 10 days ago -->
<!-- dd-trace-py: 353, last pushed 2 days ago -->
<!-- CTranslate2: 322, last pushed 16 days ago -->
<!-- time-machine: 320, last pushed 5 days ago -->
<!-- sourmash: 317, last pushed 0 days ago -->
<!-- cyvcf2: 302, last pushed 6 days ago -->
<!-- matrixprofile: 278, last pushed 48 days ago -->
<!-- abess: 275, last pushed 0 days ago -->
<!-- jq.py: 224, last pushed 196 days ago -->
<!-- iminuit: 210, last pushed 5 days ago -->
<!-- Tokenizer: 187, last pushed 16 days ago -->
<!-- PyGLM: 149, last pushed 146 days ago -->
<!-- boost-histogram: 116, last pushed 3 days ago -->
<!-- bx-python: 114, last pushed 228 days ago -->
<!-- TgCrypto: 110, last pushed 170 days ago -->
<!-- iDynTree: 108, last pushed 3 days ago -->
<!-- mosec: 102, last pushed 2 days ago -->
<!-- Python-WebRTC: 93, last pushed 164 days ago -->
<!-- pybase64: 87, last pushed 0 days ago -->
<!-- scikit-learn: 51270, last pushed 0 days ago -->
<!-- NumPy: 21357, last pushed 0 days ago -->
<!-- Tornado: 20724, last pushed 6 days ago -->
<!-- pytorch-fairseq: 19079, last pushed 2 days ago -->
<!-- Matplotlib: 16066, last pushed 0 days ago -->
<!-- NCNN: 15395, last pushed 0 days ago -->
<!-- Kivy: 14970, last pushed 0 days ago -->
<!-- Prophet: 14851, last pushed 0 days ago -->
<!-- MyPy: 13708, last pushed 0 days ago -->
<!-- pydantic: 10965, last pushed 1 days ago -->
<!-- MemRay: 9186, last pushed 1 days ago -->
<!-- uvloop: 8832, last pushed 2 days ago -->
<!-- psutil: 8668, last pushed 0 days ago -->
<!-- vaex: 7272, last pushed 3 days ago -->
<!-- Google Benchmark: 6803, last pushed 1 days ago -->
<!-- duckdb: 6189, last pushed 0 days ago -->
<!-- Apache Beam: 5815, last pushed 0 days ago -->
<!-- asyncpg: 5616, last pushed 22 days ago -->
<!-- PyGame: 5173, last pushed 0 days ago -->
<!-- cmake: 5036, last pushed 0 days ago -->
<!-- scikit-image: 5035, last pushed 0 days ago -->
<!-- twisted-iocpsupport: 4732, last pushed 0 days ago -->
<!-- PyOxidizer: 4223, last pushed 12 days ago -->
<!-- websockets: 4147, last pushed 10 days ago -->
<!-- cvxpy: 4059, last pushed 2 days ago -->
<!-- Triton: 3952, last pushed 0 days ago -->
<!-- UltraJSON: 3825, last pushed 27 days ago -->
<!-- River: 3571, last pushed 2 days ago -->
<!-- OpenSpiel: 3304, last pushed 0 days ago -->
<!-- pyzmq: 3150, last pushed 5 days ago -->
<!-- aiortc: 3053, last pushed 20 days ago -->
<!-- Implicit: 2932, last pushed 4 days ago -->
<!-- vispy: 2924, last pushed 2 days ago -->
<!-- Confluent client for Kafka: 2917, last pushed 3 days ago -->
<!-- tinyobjloader: 2630, last pushed 61 days ago -->
<!-- Dependency Injector: 2334, last pushed 32 days ago -->
<!-- coverage.py: 2175, last pushed 0 days ago -->
<!-- PyCryptodome: 2111, last pushed 2 days ago -->
<!-- PyYAML: 1920, last pushed 7 days ago -->
<!-- numexpr: 1804, last pushed 16 days ago -->
<!-- h5py: 1776, last pushed 3 days ago -->
<!-- Wrapt: 1739, last pushed 11 days ago -->
<!-- PyAV: 1647, last pushed 6 days ago -->
<!-- SimpleJSON: 1513, last pushed 65 days ago -->
<!-- pikepdf: 1484, last pushed 4 days ago -->
<!-- OpenColorIO: 1360, last pushed 4 days ago -->
<!-- Line Profiler: 1353, last pushed 18 days ago -->
<!-- PyTables: 1144, last pushed 11 days ago -->
<!-- OpenTimelineIO: 1087, last pushed 0 days ago -->
<!-- aioquic: 1045, last pushed 16 days ago -->
<!-- ruptures: 1035, last pushed 10 days ago -->
<!-- Psycopg 3: 776, last pushed 0 days ago -->
<!-- DeepForest: 775, last pushed 114 days ago -->
<!-- envd: 759, last pushed 0 days ago -->
<!-- google neuroglancer: 750, last pushed 2 days ago -->
<!-- Parselmouth: 684, last pushed 56 days ago -->
<!-- AutoPy: 672, last pushed 253 days ago -->
<!-- H3-py: 561, last pushed 7 days ago -->
<!-- Rtree: 501, last pushed 138 days ago -->
<!-- markupsafe: 491, last pushed 3 days ago -->
<!-- python-rapidjson: 457, last pushed 46 days ago -->
<!-- python-snappy: 445, last pushed 172 days ago -->
<!-- pybind11 cmake_example: 433, last pushed 24 days ago -->
<!-- KDEpy: 399, last pushed 206 days ago -->
<!-- tgcalls: 388, last pushed 65 days ago -->
<!-- pybind11 python_example: 358, last pushed 24 days ago -->
<!-- dd-trace-py: 356, last pushed 2 days ago -->
<!-- CTranslate2: 330, last pushed 2 days ago -->
<!-- time-machine: 321, last pushed 8 days ago -->
<!-- sourmash: 320, last pushed 0 days ago -->
<!-- cyvcf2: 304, last pushed 20 days ago -->
<!-- matrixprofile: 280, last pushed 62 days ago -->
<!-- abess: 278, last pushed 9 days ago -->
<!-- jq.py: 228, last pushed 3 days ago -->
<!-- iminuit: 210, last pushed 9 days ago -->
<!-- Tokenizer: 186, last pushed 4 days ago -->
<!-- PyGLM: 150, last pushed 160 days ago -->
<!-- bx-python: 116, last pushed 7 days ago -->
<!-- boost-histogram: 116, last pushed 6 days ago -->
<!-- TgCrypto: 110, last pushed 184 days ago -->
<!-- iDynTree: 108, last pushed 4 days ago -->
<!-- mosec: 104, last pushed 0 days ago -->
<!-- Python-WebRTC: 93, last pushed 178 days ago -->
<!-- pybase64: 87, last pushed 1 days ago -->
<!-- Arbor: 78, last pushed 2 days ago -->
<!-- fathon: 66, last pushed 80 days ago -->
<!-- etebase-py: 58, last pushed 46 days ago -->
<!-- polaroid: 52, last pushed 102 days ago -->
<!-- fathon: 67, last pushed 94 days ago -->
<!-- etebase-py: 58, last pushed 60 days ago -->
<!-- polaroid: 53, last pushed 116 days ago -->
<!-- cf-units: 49, last pushed 0 days ago -->
<!-- Imagecodecs (fork): 47, last pushed 13 days ago -->
<!-- pillow-heif: 44, last pushed 1 days ago -->
<!-- power-grid-model: 43, last pushed 0 days ago -->
<!-- clang-format: 41, last pushed 19 days ago -->
<!-- numpythia: 34, last pushed 18 days ago -->
<!-- pybind11 scikit_build_example: 33, last pushed 10 days ago -->
<!-- pyjet: 33, last pushed 18 days ago -->
<!-- Imagecodecs (fork): 47, last pushed 27 days ago -->
<!-- pillow-heif: 46, last pushed 15 days ago -->
<!-- power-grid-model: 46, last pushed 4 days ago -->
<!-- clang-format: 43, last pushed 3 days ago -->
<!-- numpythia: 34, last pushed 4 days ago -->
<!-- pybind11 scikit_build_example: 33, last pushed 24 days ago -->
<!-- pyjet: 33, last pushed 4 days ago -->
<!-- ninja: 25, last pushed 4 days ago -->
<!-- GSD: 19, last pushed 2 days ago -->
<!-- pyinstrument_cext: 10, last pushed 317 days ago -->
<!-- CorrectionLib: 10, last pushed 9 days ago -->
<!-- xmlstarlet: 9, last pushed 6 days ago -->
<!-- SiPM: 7, last pushed 81 days ago -->
<!-- ril: 4, last pushed 2 days ago -->
<!-- GSD: 19, last pushed 3 days ago -->
<!-- pyinstrument_cext: 10, last pushed 331 days ago -->
<!-- CorrectionLib: 10, last pushed 4 days ago -->
<!-- xmlstarlet: 9, last pushed 20 days ago -->
<!-- SiPM: 7, last pushed 95 days ago -->
<!-- ril: 3, last pushed 16 days ago -->
<!-- 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"]:
if manylinux_image in ["manylinux1", "manylinux2010"]:
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":
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.environment import ParsedEnvironment
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
@@ -263,6 +263,27 @@ def test_build_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(
"selector",
[
+31 -1
View File
@@ -1,6 +1,7 @@
from __future__ import annotations
import platform as platform_module
import textwrap
import pytest
@@ -58,7 +59,7 @@ test_command: 'pyproject'
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()
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)
parsed_environment = options.build_options(identifier=None).environment
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):
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\"'"
)