Merge remote-tracking branch 'upstream/main' into arm64
This commit is contained in:
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)}'")
|
||||||
|
|||||||
@@ -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,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -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
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 = []
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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 -->
|
||||||
|
|
||||||
|
|||||||
@@ -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")
|
||||||
|
|
||||||
|
|||||||
@@ -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",
|
||||||
[
|
[
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
@@ -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\"'"
|
||||||
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user