Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d6cf349b1a | ||
|
|
515e9be2c4 | ||
|
|
9e1369e07d | ||
|
|
122af66cd1 |
@@ -17,6 +17,8 @@ jobs:
|
|||||||
run: nox --force-color -s update_constraints
|
run: nox --force-color -s update_constraints
|
||||||
- name: "Run update: python configs"
|
- name: "Run update: python configs"
|
||||||
run: nox --force-color -s update_pins
|
run: nox --force-color -s update_pins
|
||||||
|
- name: "Run update: docs user projects"
|
||||||
|
run: nox --force-color -s update_proj
|
||||||
|
|
||||||
# we use this step to grab a Github App auth token, so that PRs generated by this workflow
|
# we use this step to grab a Github App auth token, so that PRs generated by this workflow
|
||||||
# run the GHA tests.
|
# run the GHA tests.
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ jobs:
|
|||||||
- uses: actions/setup-python@v2
|
- uses: actions/setup-python@v2
|
||||||
|
|
||||||
- name: Install cibuildwheel
|
- name: Install cibuildwheel
|
||||||
run: python -m pip install cibuildwheel==2.0.0a3
|
run: python -m pip install cibuildwheel==2.0.0a4
|
||||||
|
|
||||||
- name: Build wheels
|
- name: Build wheels
|
||||||
run: python -m cibuildwheel --output-dir wheelhouse
|
run: python -m cibuildwheel --output-dir wheelhouse
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
__version__ = "2.0.0a3"
|
__version__ = "2.0.0a4"
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ from cibuildwheel.options import ConfigOptions
|
|||||||
from cibuildwheel.projectfiles import get_requires_python_str
|
from cibuildwheel.projectfiles import get_requires_python_str
|
||||||
from cibuildwheel.typing import PLATFORMS, PlatformName, assert_never
|
from cibuildwheel.typing import PLATFORMS, PlatformName, assert_never
|
||||||
from cibuildwheel.util import (
|
from cibuildwheel.util import (
|
||||||
|
BuildFrontend,
|
||||||
BuildOptions,
|
BuildOptions,
|
||||||
BuildSelector,
|
BuildSelector,
|
||||||
DependencyConstraints,
|
DependencyConstraints,
|
||||||
@@ -184,6 +185,7 @@ def main() -> None:
|
|||||||
|
|
||||||
archs_config_str = args.archs or options("archs", sep=" ")
|
archs_config_str = args.archs or options("archs", sep=" ")
|
||||||
|
|
||||||
|
build_frontend_str = options("build-frontend", env_plat=False)
|
||||||
environment_config = options("environment", table={"item": '{k}="{v}"', "sep": " "})
|
environment_config = options("environment", table={"item": '{k}="{v}"', "sep": " "})
|
||||||
before_all = options("before-all", sep=" && ")
|
before_all = options("before-all", sep=" && ")
|
||||||
before_build = options("before-build", sep=" && ")
|
before_build = options("before-build", sep=" && ")
|
||||||
@@ -200,6 +202,16 @@ def main() -> None:
|
|||||||
os.environ.get("CIBW_PRERELEASE_PYTHONS", "0")
|
os.environ.get("CIBW_PRERELEASE_PYTHONS", "0")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
build_frontend: BuildFrontend
|
||||||
|
if build_frontend_str == "build":
|
||||||
|
build_frontend = "build"
|
||||||
|
elif build_frontend_str == "pip":
|
||||||
|
build_frontend = "pip"
|
||||||
|
else:
|
||||||
|
msg = f"cibuildwheel: Unrecognised build frontend '{build_frontend}', only 'pip' and 'build' are supported"
|
||||||
|
print(msg, file=sys.stderr)
|
||||||
|
sys.exit(2)
|
||||||
|
|
||||||
package_files = {"setup.py", "setup.cfg", "pyproject.toml"}
|
package_files = {"setup.py", "setup.cfg", "pyproject.toml"}
|
||||||
|
|
||||||
if not any(package_dir.joinpath(name).exists() for name in package_files):
|
if not any(package_dir.joinpath(name).exists() for name in package_files):
|
||||||
@@ -308,6 +320,7 @@ def main() -> None:
|
|||||||
environment=environment,
|
environment=environment,
|
||||||
dependency_constraints=dependency_constraints,
|
dependency_constraints=dependency_constraints,
|
||||||
manylinux_images=manylinux_images or None,
|
manylinux_images=manylinux_images or None,
|
||||||
|
build_frontend=build_frontend,
|
||||||
)
|
)
|
||||||
|
|
||||||
# Python is buffering by default when running on the CI platforms, giving problems interleaving subprocess call output with unflushed calls to 'print'
|
# Python is buffering by default when running on the CI platforms, giving problems interleaving subprocess call output with unflushed calls to 'print'
|
||||||
|
|||||||
+39
-16
@@ -7,7 +7,7 @@ from typing import List, NamedTuple, Set
|
|||||||
from .architecture import Architecture
|
from .architecture import Architecture
|
||||||
from .docker_container import DockerContainer
|
from .docker_container import DockerContainer
|
||||||
from .logger import log
|
from .logger import log
|
||||||
from .typing import PathOrStr
|
from .typing import PathOrStr, assert_never
|
||||||
from .util import (
|
from .util import (
|
||||||
BuildOptions,
|
BuildOptions,
|
||||||
BuildSelector,
|
BuildSelector,
|
||||||
@@ -145,7 +145,7 @@ def build(options: BuildOptions) -> None:
|
|||||||
env, executor=docker.environment_executor
|
env, executor=docker.environment_executor
|
||||||
)
|
)
|
||||||
|
|
||||||
# check config python and pip are still on PATH
|
# check config python is still on PATH
|
||||||
which_python = docker.call(
|
which_python = docker.call(
|
||||||
["which", "python"], env=env, capture_output=True
|
["which", "python"], env=env, capture_output=True
|
||||||
).strip()
|
).strip()
|
||||||
@@ -180,18 +180,38 @@ def build(options: BuildOptions) -> None:
|
|||||||
docker.call(["rm", "-rf", built_wheel_dir])
|
docker.call(["rm", "-rf", built_wheel_dir])
|
||||||
docker.call(["mkdir", "-p", built_wheel_dir])
|
docker.call(["mkdir", "-p", built_wheel_dir])
|
||||||
|
|
||||||
docker.call(
|
verbosity_flags = get_build_verbosity_extra_flags(options.build_verbosity)
|
||||||
[
|
|
||||||
"pip",
|
if options.build_frontend == "pip":
|
||||||
"wheel",
|
docker.call(
|
||||||
container_package_dir,
|
[
|
||||||
"--wheel-dir",
|
"python",
|
||||||
built_wheel_dir,
|
"-m",
|
||||||
"--no-deps",
|
"pip",
|
||||||
*get_build_verbosity_extra_flags(options.build_verbosity),
|
"wheel",
|
||||||
],
|
container_package_dir,
|
||||||
env=env,
|
f"--wheel-dir={built_wheel_dir}",
|
||||||
)
|
"--no-deps",
|
||||||
|
*verbosity_flags,
|
||||||
|
],
|
||||||
|
env=env,
|
||||||
|
)
|
||||||
|
elif options.build_frontend == "build":
|
||||||
|
config_setting = " ".join(verbosity_flags)
|
||||||
|
docker.call(
|
||||||
|
[
|
||||||
|
"python",
|
||||||
|
"-m",
|
||||||
|
"build",
|
||||||
|
container_package_dir,
|
||||||
|
"--wheel",
|
||||||
|
f"--outdir={built_wheel_dir}",
|
||||||
|
f"--config-setting={config_setting}",
|
||||||
|
],
|
||||||
|
env=env,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
assert_never(options.build_frontend)
|
||||||
|
|
||||||
built_wheel = docker.glob(built_wheel_dir, "*.whl")[0]
|
built_wheel = docker.glob(built_wheel_dir, "*.whl")[0]
|
||||||
|
|
||||||
@@ -291,8 +311,11 @@ def build(options: BuildOptions) -> None:
|
|||||||
|
|
||||||
|
|
||||||
def troubleshoot(package_dir: Path, error: Exception) -> None:
|
def troubleshoot(package_dir: Path, error: Exception) -> None:
|
||||||
if isinstance(error, subprocess.CalledProcessError) and error.cmd[0:2] == ["pip", "wheel"]:
|
if isinstance(error, subprocess.CalledProcessError) and (
|
||||||
# the 'pip wheel' step failed.
|
error.cmd[0:4] == ["python", "-m", "pip", "wheel"]
|
||||||
|
or error.cmd[0:3] == ["python", "-m", "build"]
|
||||||
|
):
|
||||||
|
# the wheel build step failed
|
||||||
print("Checking for common errors...")
|
print("Checking for common errors...")
|
||||||
so_files = list(package_dir.glob("**/*.so"))
|
so_files = list(package_dir.glob("**/*.so"))
|
||||||
|
|
||||||
|
|||||||
+78
-28
@@ -12,13 +12,15 @@ from typing import Any, Dict, List, NamedTuple, Optional, Sequence, Set, Tuple,
|
|||||||
from .architecture import Architecture
|
from .architecture import Architecture
|
||||||
from .environment import ParsedEnvironment
|
from .environment import ParsedEnvironment
|
||||||
from .logger import log
|
from .logger import log
|
||||||
from .typing import Literal, PathOrStr
|
from .typing import Literal, PathOrStr, assert_never
|
||||||
from .util import (
|
from .util import (
|
||||||
|
BuildFrontend,
|
||||||
BuildOptions,
|
BuildOptions,
|
||||||
BuildSelector,
|
BuildSelector,
|
||||||
NonPlatformWheelError,
|
NonPlatformWheelError,
|
||||||
download,
|
download,
|
||||||
get_build_verbosity_extra_flags,
|
get_build_verbosity_extra_flags,
|
||||||
|
get_pip_version,
|
||||||
install_certifi_script,
|
install_certifi_script,
|
||||||
prepare_command,
|
prepare_command,
|
||||||
read_python_configs,
|
read_python_configs,
|
||||||
@@ -178,7 +180,9 @@ def setup_python(
|
|||||||
python_configuration: PythonConfiguration,
|
python_configuration: PythonConfiguration,
|
||||||
dependency_constraint_flags: Sequence[PathOrStr],
|
dependency_constraint_flags: Sequence[PathOrStr],
|
||||||
environment: ParsedEnvironment,
|
environment: ParsedEnvironment,
|
||||||
|
build_frontend: BuildFrontend,
|
||||||
) -> Dict[str, str]:
|
) -> Dict[str, str]:
|
||||||
|
|
||||||
implementation_id = python_configuration.identifier.split("-")[0]
|
implementation_id = python_configuration.identifier.split("-")[0]
|
||||||
log.step(f"Installing Python {implementation_id}...")
|
log.step(f"Installing Python {implementation_id}...")
|
||||||
|
|
||||||
@@ -308,18 +312,33 @@ def setup_python(
|
|||||||
env.setdefault("SDKROOT", arm64_compatible_sdks[0])
|
env.setdefault("SDKROOT", arm64_compatible_sdks[0])
|
||||||
|
|
||||||
log.step("Installing build tools...")
|
log.step("Installing build tools...")
|
||||||
call(
|
if build_frontend == "pip":
|
||||||
[
|
call(
|
||||||
"pip",
|
[
|
||||||
"install",
|
"pip",
|
||||||
"--upgrade",
|
"install",
|
||||||
"setuptools",
|
"--upgrade",
|
||||||
"wheel",
|
"setuptools",
|
||||||
"delocate",
|
"wheel",
|
||||||
*dependency_constraint_flags,
|
"delocate",
|
||||||
],
|
*dependency_constraint_flags,
|
||||||
env=env,
|
],
|
||||||
)
|
env=env,
|
||||||
|
)
|
||||||
|
elif build_frontend == "build":
|
||||||
|
call(
|
||||||
|
[
|
||||||
|
"pip",
|
||||||
|
"install",
|
||||||
|
"--upgrade",
|
||||||
|
"delocate",
|
||||||
|
"build[virtualenv]",
|
||||||
|
*dependency_constraint_flags,
|
||||||
|
],
|
||||||
|
env=env,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
assert_never(build_frontend)
|
||||||
|
|
||||||
return env
|
return env
|
||||||
|
|
||||||
@@ -356,7 +375,12 @@ def build(options: BuildOptions) -> None:
|
|||||||
options.dependency_constraints.get_for_python_version(config.version),
|
options.dependency_constraints.get_for_python_version(config.version),
|
||||||
]
|
]
|
||||||
|
|
||||||
env = setup_python(config, dependency_constraint_flags, options.environment)
|
env = setup_python(
|
||||||
|
config,
|
||||||
|
dependency_constraint_flags,
|
||||||
|
options.environment,
|
||||||
|
options.build_frontend,
|
||||||
|
)
|
||||||
|
|
||||||
if options.before_build:
|
if options.before_build:
|
||||||
log.step("Running before_build...")
|
log.step("Running before_build...")
|
||||||
@@ -370,20 +394,46 @@ def build(options: BuildOptions) -> None:
|
|||||||
shutil.rmtree(built_wheel_dir)
|
shutil.rmtree(built_wheel_dir)
|
||||||
built_wheel_dir.mkdir(parents=True)
|
built_wheel_dir.mkdir(parents=True)
|
||||||
|
|
||||||
# Path.resolve() is needed. Without it pip wheel may try to fetch package from pypi.org
|
verbosity_flags = get_build_verbosity_extra_flags(options.build_verbosity)
|
||||||
# see https://github.com/pypa/cibuildwheel/pull/369
|
|
||||||
call(
|
if options.build_frontend == "pip":
|
||||||
[
|
# Path.resolve() is needed. Without it pip wheel may try to fetch package from pypi.org
|
||||||
"pip",
|
# see https://github.com/pypa/cibuildwheel/pull/369
|
||||||
"wheel",
|
call(
|
||||||
options.package_dir.resolve(),
|
[
|
||||||
"--wheel-dir",
|
"python",
|
||||||
built_wheel_dir,
|
"-m",
|
||||||
"--no-deps",
|
"pip",
|
||||||
*get_build_verbosity_extra_flags(options.build_verbosity),
|
"wheel",
|
||||||
],
|
options.package_dir.resolve(),
|
||||||
env=env,
|
f"--wheel-dir={built_wheel_dir}",
|
||||||
)
|
"--no-deps",
|
||||||
|
*verbosity_flags,
|
||||||
|
],
|
||||||
|
env=env,
|
||||||
|
)
|
||||||
|
elif options.build_frontend == "build":
|
||||||
|
config_setting = " ".join(verbosity_flags)
|
||||||
|
build_env = env.copy()
|
||||||
|
if options.dependency_constraints:
|
||||||
|
build_env["PIP_CONSTRAINT"] = str(
|
||||||
|
options.dependency_constraints.get_for_python_version(config.version)
|
||||||
|
)
|
||||||
|
build_env["VIRTUALENV_PIP"] = get_pip_version(env)
|
||||||
|
call(
|
||||||
|
[
|
||||||
|
"python",
|
||||||
|
"-m",
|
||||||
|
"build",
|
||||||
|
options.package_dir,
|
||||||
|
"--wheel",
|
||||||
|
f"--outdir={built_wheel_dir}",
|
||||||
|
f"--config-setting={config_setting}",
|
||||||
|
],
|
||||||
|
env=build_env,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
assert_never(options.build_frontend)
|
||||||
|
|
||||||
built_wheel = next(built_wheel_dir.glob("*.whl"))
|
built_wheel = next(built_wheel_dir.glob("*.whl"))
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ skip = ""
|
|||||||
test-skip = ""
|
test-skip = ""
|
||||||
|
|
||||||
archs = ["auto"]
|
archs = ["auto"]
|
||||||
|
build-frontend = "pip"
|
||||||
dependency-versions = "pinned"
|
dependency-versions = "pinned"
|
||||||
environment = {}
|
environment = {}
|
||||||
build-verbosity = ""
|
build-verbosity = ""
|
||||||
|
|||||||
+21
-1
@@ -4,6 +4,8 @@ import itertools
|
|||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import ssl
|
import ssl
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
import textwrap
|
import textwrap
|
||||||
import time
|
import time
|
||||||
import urllib.request
|
import urllib.request
|
||||||
@@ -20,12 +22,14 @@ from packaging.version import Version
|
|||||||
|
|
||||||
from .architecture import Architecture
|
from .architecture import Architecture
|
||||||
from .environment import ParsedEnvironment
|
from .environment import ParsedEnvironment
|
||||||
from .typing import PathOrStr, PlatformName
|
from .typing import Literal, PathOrStr, PlatformName
|
||||||
|
|
||||||
resources_dir = Path(__file__).parent / "resources"
|
resources_dir = Path(__file__).parent / "resources"
|
||||||
|
|
||||||
install_certifi_script = resources_dir / "install_certifi.py"
|
install_certifi_script = resources_dir / "install_certifi.py"
|
||||||
|
|
||||||
|
BuildFrontend = Literal["pip", "build"]
|
||||||
|
|
||||||
|
|
||||||
def prepare_command(command: str, **kwargs: PathOrStr) -> str:
|
def prepare_command(command: str, **kwargs: PathOrStr) -> str:
|
||||||
"""
|
"""
|
||||||
@@ -218,6 +222,7 @@ class BuildOptions(NamedTuple):
|
|||||||
test_requires: List[str]
|
test_requires: List[str]
|
||||||
test_extras: str
|
test_extras: str
|
||||||
build_verbosity: int
|
build_verbosity: int
|
||||||
|
build_frontend: BuildFrontend
|
||||||
|
|
||||||
|
|
||||||
class NonPlatformWheelError(Exception):
|
class NonPlatformWheelError(Exception):
|
||||||
@@ -300,3 +305,18 @@ def print_new_wheels(msg: str, output_dir: Path) -> Iterator[None]:
|
|||||||
s = time.time() - start_time
|
s = time.time() - start_time
|
||||||
m = s / 60
|
m = s / 60
|
||||||
print(msg.format(n=n, s=s, m=m), *sorted(f" {f.name}" for f in new_contents), sep="\n")
|
print(msg.format(n=n, s=s, m=m), *sorted(f" {f.name}" for f in new_contents), sep="\n")
|
||||||
|
|
||||||
|
|
||||||
|
def get_pip_version(env: Dict[str, str]) -> str:
|
||||||
|
# we use shell=True here for windows, even though we don't need a shell due to a bug
|
||||||
|
# https://bugs.python.org/issue8557
|
||||||
|
shell = sys.platform.startswith("win")
|
||||||
|
versions_output_text = subprocess.check_output(
|
||||||
|
["python", "-m", "pip", "freeze", "--all"], universal_newlines=True, shell=shell, env=env
|
||||||
|
)
|
||||||
|
(pip_version,) = (
|
||||||
|
version[5:]
|
||||||
|
for version in versions_output_text.strip().splitlines()
|
||||||
|
if version.startswith("pip==")
|
||||||
|
)
|
||||||
|
return pip_version
|
||||||
|
|||||||
+72
-20
@@ -10,13 +10,15 @@ from zipfile import ZipFile
|
|||||||
from .architecture import Architecture
|
from .architecture import Architecture
|
||||||
from .environment import ParsedEnvironment
|
from .environment import ParsedEnvironment
|
||||||
from .logger import log
|
from .logger import log
|
||||||
from .typing import PathOrStr
|
from .typing import PathOrStr, assert_never
|
||||||
from .util import (
|
from .util import (
|
||||||
|
BuildFrontend,
|
||||||
BuildOptions,
|
BuildOptions,
|
||||||
BuildSelector,
|
BuildSelector,
|
||||||
NonPlatformWheelError,
|
NonPlatformWheelError,
|
||||||
download,
|
download,
|
||||||
get_build_verbosity_extra_flags,
|
get_build_verbosity_extra_flags,
|
||||||
|
get_pip_version,
|
||||||
prepare_command,
|
prepare_command,
|
||||||
read_python_configs,
|
read_python_configs,
|
||||||
)
|
)
|
||||||
@@ -114,7 +116,9 @@ def setup_python(
|
|||||||
python_configuration: PythonConfiguration,
|
python_configuration: PythonConfiguration,
|
||||||
dependency_constraint_flags: Sequence[PathOrStr],
|
dependency_constraint_flags: Sequence[PathOrStr],
|
||||||
environment: ParsedEnvironment,
|
environment: ParsedEnvironment,
|
||||||
|
build_frontend: BuildFrontend,
|
||||||
) -> Dict[str, str]:
|
) -> Dict[str, str]:
|
||||||
|
|
||||||
nuget = Path("C:\\cibw\\nuget.exe")
|
nuget = Path("C:\\cibw\\nuget.exe")
|
||||||
if not nuget.exists():
|
if not nuget.exists():
|
||||||
log.step("Downloading nuget...")
|
log.step("Downloading nuget...")
|
||||||
@@ -214,10 +218,26 @@ def setup_python(
|
|||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
call(["pip", "--version"], env=env)
|
call(["pip", "--version"], env=env)
|
||||||
call(
|
|
||||||
["pip", "install", "--upgrade", "setuptools", "wheel", *dependency_constraint_flags],
|
if build_frontend == "pip":
|
||||||
env=env,
|
call(
|
||||||
)
|
[
|
||||||
|
"pip",
|
||||||
|
"install",
|
||||||
|
"--upgrade",
|
||||||
|
"setuptools",
|
||||||
|
"wheel",
|
||||||
|
*dependency_constraint_flags,
|
||||||
|
],
|
||||||
|
env=env,
|
||||||
|
)
|
||||||
|
elif build_frontend == "build":
|
||||||
|
call(
|
||||||
|
["pip", "install", "--upgrade", "build[virtualenv]", *dependency_constraint_flags],
|
||||||
|
env=env,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
assert_never(build_frontend)
|
||||||
|
|
||||||
return env
|
return env
|
||||||
|
|
||||||
@@ -251,7 +271,12 @@ def build(options: BuildOptions) -> None:
|
|||||||
]
|
]
|
||||||
|
|
||||||
# install Python
|
# install Python
|
||||||
env = setup_python(config, dependency_constraint_flags, options.environment)
|
env = setup_python(
|
||||||
|
config,
|
||||||
|
dependency_constraint_flags,
|
||||||
|
options.environment,
|
||||||
|
options.build_frontend,
|
||||||
|
)
|
||||||
|
|
||||||
# run the before_build command
|
# run the before_build command
|
||||||
if options.before_build:
|
if options.before_build:
|
||||||
@@ -265,20 +290,47 @@ def build(options: BuildOptions) -> None:
|
|||||||
if built_wheel_dir.exists():
|
if built_wheel_dir.exists():
|
||||||
shutil.rmtree(built_wheel_dir)
|
shutil.rmtree(built_wheel_dir)
|
||||||
built_wheel_dir.mkdir(parents=True)
|
built_wheel_dir.mkdir(parents=True)
|
||||||
# Path.resolve() is needed. Without it pip wheel may try to fetch package from pypi.org
|
|
||||||
# see https://github.com/pypa/cibuildwheel/pull/369
|
verbosity_flags = get_build_verbosity_extra_flags(options.build_verbosity)
|
||||||
call(
|
|
||||||
[
|
if options.build_frontend == "pip":
|
||||||
"pip",
|
# Path.resolve() is needed. Without it pip wheel may try to fetch package from pypi.org
|
||||||
"wheel",
|
# see https://github.com/pypa/cibuildwheel/pull/369
|
||||||
options.package_dir.resolve(),
|
call(
|
||||||
"-w",
|
[
|
||||||
built_wheel_dir,
|
"python",
|
||||||
"--no-deps",
|
"-m",
|
||||||
*get_build_verbosity_extra_flags(options.build_verbosity),
|
"pip",
|
||||||
],
|
"wheel",
|
||||||
env=env,
|
options.package_dir.resolve(),
|
||||||
)
|
f"--wheel-dir={built_wheel_dir}",
|
||||||
|
"--no-deps",
|
||||||
|
*get_build_verbosity_extra_flags(options.build_verbosity),
|
||||||
|
],
|
||||||
|
env=env,
|
||||||
|
)
|
||||||
|
elif options.build_frontend == "build":
|
||||||
|
config_setting = " ".join(verbosity_flags)
|
||||||
|
build_env = env.copy()
|
||||||
|
if options.dependency_constraints:
|
||||||
|
build_env["PIP_CONSTRAINT"] = str(
|
||||||
|
options.dependency_constraints.get_for_python_version(config.version)
|
||||||
|
)
|
||||||
|
build_env["VIRTUALENV_PIP"] = get_pip_version(env)
|
||||||
|
call(
|
||||||
|
[
|
||||||
|
"python",
|
||||||
|
"-m",
|
||||||
|
"build",
|
||||||
|
options.package_dir,
|
||||||
|
"--wheel",
|
||||||
|
f"--outdir={built_wheel_dir}",
|
||||||
|
f"--config-setting={config_setting}",
|
||||||
|
],
|
||||||
|
env=build_env,
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
assert_never(options.build_frontend)
|
||||||
|
|
||||||
built_wheel = next(built_wheel_dir.glob("*.whl"))
|
built_wheel = next(built_wheel_dir.glob("*.whl"))
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -210,7 +210,7 @@ There are two suggested methods for keeping cibuildwheel up to date that instead
|
|||||||
If you use GitHub Actions for builds, you can use cibuildwheel as an action:
|
If you use GitHub Actions for builds, you can use cibuildwheel as an action:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
uses: pypa/cibuildwheel@v2.0.0a3
|
uses: pypa/cibuildwheel@v2.0.0a4
|
||||||
```
|
```
|
||||||
|
|
||||||
This is a composite step that just runs cibuildwheel using pipx. You can set command-line options as `with:` parameters, and use `env:` as normal.
|
This is a composite step that just runs cibuildwheel using pipx. You can set command-line options as `with:` parameters, and use `env:` as normal.
|
||||||
@@ -236,7 +236,7 @@ The second option, and the only one that supports other CI systems, is using a `
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
# requirements-cibw.txt
|
# requirements-cibw.txt
|
||||||
cibuildwheel==2.0.0a3
|
cibuildwheel==2.0.0a4
|
||||||
```
|
```
|
||||||
|
|
||||||
Then your install step would have `python -m pip install -r requirements-cibw.txt` in it. Your `dependabot.yml` file could look like this:
|
Then your install step would have `python -m pip install -r requirements-cibw.txt` in it. Your `dependabot.yml` file could look like this:
|
||||||
|
|||||||
+40
-1
@@ -155,7 +155,7 @@ When setting the options, you can use shell-style globbing syntax, as per [fnmat
|
|||||||
|--------------|---------------------------------------------------------------------|-------------------------------|-----------------------------------------------|----------------------------------------------------------------------------|
|
|--------------|---------------------------------------------------------------------|-------------------------------|-----------------------------------------------|----------------------------------------------------------------------------|
|
||||||
| Python 3.6 | cp36-macosx_x86_64 | cp36-win_amd64<br/>cp36-win32 | cp36-manylinux_x86_64<br/>cp36-manylinux_i686 | cp36-manylinux_aarch64<br/>cp36-manylinux_ppc64le<br/>cp36-manylinux_s390x |
|
| Python 3.6 | cp36-macosx_x86_64 | cp36-win_amd64<br/>cp36-win32 | cp36-manylinux_x86_64<br/>cp36-manylinux_i686 | cp36-manylinux_aarch64<br/>cp36-manylinux_ppc64le<br/>cp36-manylinux_s390x |
|
||||||
| Python 3.7 | cp37-macosx_x86_64 | cp37-win_amd64<br/>cp37-win32 | cp37-manylinux_x86_64<br/>cp37-manylinux_i686 | cp37-manylinux_aarch64<br/>cp37-manylinux_ppc64le<br/>cp37-manylinux_s390x |
|
| Python 3.7 | cp37-macosx_x86_64 | cp37-win_amd64<br/>cp37-win32 | cp37-manylinux_x86_64<br/>cp37-manylinux_i686 | cp37-manylinux_aarch64<br/>cp37-manylinux_ppc64le<br/>cp37-manylinux_s390x |
|
||||||
| Python 3.8 | cp38-macosx_x86_64 | cp38-win_amd64<br/>cp38-win32 | cp38-manylinux_x86_64<br/>cp38-manylinux_i686 | cp38-manylinux_aarch64<br/>cp38-manylinux_ppc64le<br/>cp38-manylinux_s390x |
|
| Python 3.8 | cp38-macosx_x86_64<br/>cp38-macosx_universal2<br/>cp38-macosx_arm64 | cp38-win_amd64<br/>cp38-win32 | cp38-manylinux_x86_64<br/>cp38-manylinux_i686 | cp38-manylinux_aarch64<br/>cp38-manylinux_ppc64le<br/>cp38-manylinux_s390x |
|
||||||
| Python 3.9 | cp39-macosx_x86_64<br/>cp39-macosx_universal2<br/>cp39-macosx_arm64 | cp39-win_amd64<br/>cp39-win32 | cp39-manylinux_x86_64<br/>cp39-manylinux_i686 | cp39-manylinux_aarch64<br/>cp39-manylinux_ppc64le<br/>cp39-manylinux_s390x |
|
| Python 3.9 | cp39-macosx_x86_64<br/>cp39-macosx_universal2<br/>cp39-macosx_arm64 | cp39-win_amd64<br/>cp39-win32 | cp39-manylinux_x86_64<br/>cp39-manylinux_i686 | cp39-manylinux_aarch64<br/>cp39-manylinux_ppc64le<br/>cp39-manylinux_s390x |
|
||||||
| PyPy3.7 v7.3 | pp37-macosx_x86_64 | pp37-win_amd64 | pp37-manylinux_x86_64 | |
|
| PyPy3.7 v7.3 | pp37-macosx_x86_64 | pp37-win_amd64 | pp37-manylinux_x86_64 | |
|
||||||
|
|
||||||
@@ -435,6 +435,45 @@ This option can also be set using the [command-line option](#command-line) `--pr
|
|||||||
|
|
||||||
## Build customization
|
## Build customization
|
||||||
|
|
||||||
|
### `CIBW_BUILD_FRONTEND` {: #build-frontend}
|
||||||
|
> Set the tool to use to build, either "pip" (default for now) or "build"
|
||||||
|
|
||||||
|
Choose which build backend to use. Can either be "pip", which will run
|
||||||
|
`python -m pip wheel`, or "build", which will run `python -m build --wheel`.
|
||||||
|
|
||||||
|
!!! tip
|
||||||
|
Until v2.0.0, [pip] was the only way to build wheels, and is still the
|
||||||
|
default. However, we expect that at some point in the future, cibuildwheel
|
||||||
|
will change the default to [build], in line with the PyPA's recommendation.
|
||||||
|
If you want to try `build` before this, you can use this option.
|
||||||
|
|
||||||
|
[pip]: https://pip.pypa.io/en/stable/cli/pip_wheel/
|
||||||
|
[build]: https://github.com/pypa/build/
|
||||||
|
|
||||||
|
#### Examples
|
||||||
|
|
||||||
|
!!! tab examples "Environment variables"
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Switch to using build
|
||||||
|
CIBW_BUILD_FRONTEND: "build"
|
||||||
|
|
||||||
|
# Ensure pip is used even if the default changes in the future
|
||||||
|
CIBW_BUILD_FRONTEND: "pip"
|
||||||
|
```
|
||||||
|
|
||||||
|
!!! tab examples "pyproject.toml"
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[tool.cibuildwheel]
|
||||||
|
# Switch to using build
|
||||||
|
build-frontend = "build"
|
||||||
|
|
||||||
|
# Ensure pip is used even if the default changes in the future
|
||||||
|
build-frontend = "pip"
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
### `CIBW_ENVIRONMENT` {: #environment}
|
### `CIBW_ENVIRONMENT` {: #environment}
|
||||||
> Set environment variables needed during the build
|
> Set environment variables needed during the build
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -46,7 +46,7 @@ To build Linux, Mac, and Windows wheels using GitHub Actions, create a `.github/
|
|||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
- name: Build wheels
|
- name: Build wheels
|
||||||
run: pipx run cibuildwheel==2.0.0a3
|
run: pipx run cibuildwheel==2.0.0a4
|
||||||
|
|
||||||
- uses: actions/upload-artifact@v2
|
- uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
@@ -81,7 +81,7 @@ To build Linux, Mac, and Windows wheels using GitHub Actions, create a `.github/
|
|||||||
- uses: actions/setup-python@v2
|
- uses: actions/setup-python@v2
|
||||||
|
|
||||||
- name: Install cibuildwheel
|
- name: Install cibuildwheel
|
||||||
run: python -m pip install cibuildwheel==2.0.0a3
|
run: python -m pip install cibuildwheel==2.0.0a4
|
||||||
|
|
||||||
- name: Build wheels
|
- name: Build wheels
|
||||||
run: python -m cibuildwheel --output-dir wheelhouse
|
run: python -m cibuildwheel --output-dir wheelhouse
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ stack: python 3.7
|
|||||||
init:
|
init:
|
||||||
- cmd: set PATH=C:\Python37;C:\Python37\Scripts;%PATH%
|
- cmd: set PATH=C:\Python37;C:\Python37\Scripts;%PATH%
|
||||||
|
|
||||||
install: python -m pip install cibuildwheel==2.0.0a3
|
install: python -m pip install cibuildwheel==2.0.0a4
|
||||||
|
|
||||||
build_script: python -m cibuildwheel --output-dir wheelhouse
|
build_script: python -m cibuildwheel --output-dir wheelhouse
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ jobs:
|
|||||||
- bash: |
|
- bash: |
|
||||||
set -o errexit
|
set -o errexit
|
||||||
python3 -m pip install --upgrade pip
|
python3 -m pip install --upgrade pip
|
||||||
pip3 install cibuildwheel==2.0.0a3
|
pip3 install cibuildwheel==2.0.0a4
|
||||||
displayName: Install dependencies
|
displayName: Install dependencies
|
||||||
- bash: cibuildwheel --output-dir wheelhouse .
|
- bash: cibuildwheel --output-dir wheelhouse .
|
||||||
displayName: Build wheels
|
displayName: Build wheels
|
||||||
@@ -20,7 +20,7 @@ jobs:
|
|||||||
- bash: |
|
- bash: |
|
||||||
set -o errexit
|
set -o errexit
|
||||||
python3 -m pip install --upgrade pip
|
python3 -m pip install --upgrade pip
|
||||||
python3 -m pip install cibuildwheel==2.0.0a3
|
python3 -m pip install cibuildwheel==2.0.0a4
|
||||||
displayName: Install dependencies
|
displayName: Install dependencies
|
||||||
- bash: cibuildwheel --output-dir wheelhouse .
|
- bash: cibuildwheel --output-dir wheelhouse .
|
||||||
displayName: Build wheels
|
displayName: Build wheels
|
||||||
@@ -34,7 +34,7 @@ jobs:
|
|||||||
- bash: |
|
- bash: |
|
||||||
set -o errexit
|
set -o errexit
|
||||||
python -m pip install --upgrade pip
|
python -m pip install --upgrade pip
|
||||||
pip install cibuildwheel==2.0.0a3
|
pip install cibuildwheel==2.0.0a4
|
||||||
displayName: Install dependencies
|
displayName: Install dependencies
|
||||||
- bash: cibuildwheel --output-dir wheelhouse .
|
- bash: cibuildwheel --output-dir wheelhouse .
|
||||||
displayName: Build wheels
|
displayName: Build wheels
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ jobs:
|
|||||||
- run:
|
- run:
|
||||||
name: Build the Linux wheels.
|
name: Build the Linux wheels.
|
||||||
command: |
|
command: |
|
||||||
pip3 install --user cibuildwheel==2.0.0a3
|
pip3 install --user cibuildwheel==2.0.0a4
|
||||||
cibuildwheel --output-dir wheelhouse
|
cibuildwheel --output-dir wheelhouse
|
||||||
- store_artifacts:
|
- store_artifacts:
|
||||||
path: wheelhouse/
|
path: wheelhouse/
|
||||||
@@ -25,7 +25,7 @@ jobs:
|
|||||||
- run:
|
- run:
|
||||||
name: Build the OS X wheels.
|
name: Build the OS X wheels.
|
||||||
command: |
|
command: |
|
||||||
pip3 install cibuildwheel==2.0.0a3
|
pip3 install cibuildwheel==2.0.0a4
|
||||||
cibuildwheel --output-dir wheelhouse
|
cibuildwheel --output-dir wheelhouse
|
||||||
- store_artifacts:
|
- store_artifacts:
|
||||||
path: wheelhouse/
|
path: wheelhouse/
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ jobs:
|
|||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
- name: Build wheels
|
- name: Build wheels
|
||||||
uses: pypa/cibuildwheel@v2.0.0a3
|
uses: pypa/cibuildwheel@v2.0.0a4
|
||||||
env:
|
env:
|
||||||
CIBW_ARCHS_MACOS: x86_64 universal2
|
CIBW_ARCHS_MACOS: x86_64 universal2
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ jobs:
|
|||||||
python-version: '3.8'
|
python-version: '3.8'
|
||||||
|
|
||||||
- name: Build wheels
|
- name: Build wheels
|
||||||
uses: pypa/cibuildwheel@v2.0.0a3
|
uses: pypa/cibuildwheel@v2.0.0a4
|
||||||
|
|
||||||
- uses: actions/upload-artifact@v2
|
- uses: actions/upload-artifact@v2
|
||||||
with:
|
with:
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ jobs:
|
|||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v2
|
||||||
|
|
||||||
- name: Build wheels
|
- name: Build wheels
|
||||||
uses: pypa/cibuildwheel@v2.0.0a3
|
uses: pypa/cibuildwheel@v2.0.0a4
|
||||||
# to supply options, put them in 'env', like:
|
# to supply options, put them in 'env', like:
|
||||||
# env:
|
# env:
|
||||||
# CIBW_SOME_OPTION: value
|
# CIBW_SOME_OPTION: value
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ jobs:
|
|||||||
platforms: all
|
platforms: all
|
||||||
|
|
||||||
- name: Build wheels
|
- name: Build wheels
|
||||||
uses: pypa/cibuildwheel@v2.0.0a3
|
uses: pypa/cibuildwheel@v2.0.0a4
|
||||||
env:
|
env:
|
||||||
# configure cibuildwheel to build native archs ('auto'), and some
|
# configure cibuildwheel to build native archs ('auto'), and some
|
||||||
# emulated ones
|
# emulated ones
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ linux:
|
|||||||
DOCKER_TLS_CERTDIR: ""
|
DOCKER_TLS_CERTDIR: ""
|
||||||
script:
|
script:
|
||||||
- curl -sSL https://get.docker.com/ | sh
|
- curl -sSL https://get.docker.com/ | sh
|
||||||
- python -m pip install cibuildwheel==2.0.0a3
|
- python -m pip install cibuildwheel==2.0.0a4
|
||||||
- cibuildwheel --output-dir wheelhouse
|
- cibuildwheel --output-dir wheelhouse
|
||||||
artifacts:
|
artifacts:
|
||||||
paths:
|
paths:
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ jobs:
|
|||||||
- ln -s /c/Python38/python.exe /c/Python38/python3.exe
|
- ln -s /c/Python38/python.exe /c/Python38/python3.exe
|
||||||
|
|
||||||
install:
|
install:
|
||||||
- python3 -m pip install cibuildwheel==2.0.0a3
|
- python3 -m pip install cibuildwheel==2.0.0a4
|
||||||
|
|
||||||
script:
|
script:
|
||||||
# build the wheels, put them into './wheelhouse'
|
# build the wheels, put them into './wheelhouse'
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ jobs:
|
|||||||
- ln -s /c/Python38/python.exe /c/Python38/python3.exe
|
- ln -s /c/Python38/python.exe /c/Python38/python3.exe
|
||||||
|
|
||||||
install:
|
install:
|
||||||
- python3 -m pip install cibuildwheel==2.0.0a3
|
- python3 -m pip install cibuildwheel==2.0.0a4
|
||||||
|
|
||||||
script:
|
script:
|
||||||
# build the wheels, put them into './wheelhouse'
|
# build the wheels, put them into './wheelhouse'
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ jobs:
|
|||||||
- stage: deploy
|
- stage: deploy
|
||||||
name: Build and deploy Linux wheels
|
name: Build and deploy Linux wheels
|
||||||
services: docker
|
services: docker
|
||||||
install: python3 -m pip install cibuildwheel==2.0.0a3
|
install: python3 -m pip install cibuildwheel==2.0.0a4
|
||||||
script: python3 -m cibuildwheel --output-dir wheelhouse
|
script: python3 -m cibuildwheel --output-dir wheelhouse
|
||||||
after_success: |
|
after_success: |
|
||||||
python3 -m pip install twine
|
python3 -m pip install twine
|
||||||
@@ -67,7 +67,7 @@ jobs:
|
|||||||
name: Build and deploy Windows wheels
|
name: Build and deploy Windows wheels
|
||||||
os: windows
|
os: windows
|
||||||
language: shell
|
language: shell
|
||||||
install: python3 -m pip install cibuildwheel==2.0.0a3
|
install: python3 -m pip install cibuildwheel==2.0.0a4
|
||||||
script: python3 -m cibuildwheel --output-dir wheelhouse
|
script: python3 -m cibuildwheel --output-dir wheelhouse
|
||||||
after_success: |
|
after_success: |
|
||||||
python3 -m pip install twine
|
python3 -m pip install twine
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[metadata]
|
[metadata]
|
||||||
name = cibuildwheel
|
name = cibuildwheel
|
||||||
version = 2.0.0a3
|
version = 2.0.0a4
|
||||||
description = Build Python wheels on CI with minimal configuration.
|
description = Build Python wheels on CI with minimal configuration.
|
||||||
long_description = file: README.md
|
long_description = file: README.md
|
||||||
long_description_content_type = text/markdown
|
long_description_content_type = text/markdown
|
||||||
|
|||||||
+11
-2
@@ -1,7 +1,9 @@
|
|||||||
|
from typing import Dict
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
|
||||||
def pytest_addoption(parser):
|
def pytest_addoption(parser) -> None:
|
||||||
parser.addoption(
|
parser.addoption(
|
||||||
"--run-emulation", action="store_true", default=False, help="run emulation tests"
|
"--run-emulation", action="store_true", default=False, help="run emulation tests"
|
||||||
)
|
)
|
||||||
@@ -11,7 +13,7 @@ def pytest_configure(config):
|
|||||||
config.addinivalue_line("markers", "emulation: mark test requiring qemu binfmt_misc to run")
|
config.addinivalue_line("markers", "emulation: mark test requiring qemu binfmt_misc to run")
|
||||||
|
|
||||||
|
|
||||||
def pytest_collection_modifyitems(config, items):
|
def pytest_collection_modifyitems(config, items) -> None:
|
||||||
if config.getoption("--run-emulation"):
|
if config.getoption("--run-emulation"):
|
||||||
# --run-emulation given in cli: do not skip emulation tests
|
# --run-emulation given in cli: do not skip emulation tests
|
||||||
return
|
return
|
||||||
@@ -19,3 +21,10 @@ def pytest_collection_modifyitems(config, items):
|
|||||||
for item in items:
|
for item in items:
|
||||||
if "emulation" in item.keywords:
|
if "emulation" in item.keywords:
|
||||||
item.add_marker(skip_emulation)
|
item.add_marker(skip_emulation)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(
|
||||||
|
params=[{"CIBW_BUILD_FRONTEND": "pip"}, {"CIBW_BUILD_FRONTEND": "build"}], ids=["pip", "build"]
|
||||||
|
)
|
||||||
|
def build_frontend_env(request) -> Dict[str, str]:
|
||||||
|
return request.param # type: ignore
|
||||||
|
|||||||
@@ -18,12 +18,12 @@ basic_project = test_projects.new_c_project(
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def test(tmp_path):
|
def test(tmp_path, build_frontend_env):
|
||||||
project_dir = tmp_path / "project"
|
project_dir = tmp_path / "project"
|
||||||
basic_project.generate(project_dir)
|
basic_project.generate(project_dir)
|
||||||
|
|
||||||
# build the wheels
|
# build the wheels
|
||||||
actual_wheels = utils.cibuildwheel_run(project_dir)
|
actual_wheels = utils.cibuildwheel_run(project_dir, add_env=build_frontend_env)
|
||||||
|
|
||||||
# check that the expected wheels are produced
|
# check that the expected wheels are produced
|
||||||
expected_wheels = utils.expected_wheels("spam", "0.1.0")
|
expected_wheels = utils.expected_wheels("spam", "0.1.0")
|
||||||
|
|||||||
@@ -25,8 +25,13 @@ project_with_before_build_asserts = test_projects.new_c_project(
|
|||||||
stored_executable = f.read()
|
stored_executable = f.read()
|
||||||
print('stored_executable', stored_executable)
|
print('stored_executable', stored_executable)
|
||||||
print('sys.executable', sys.executable)
|
print('sys.executable', sys.executable)
|
||||||
|
|
||||||
# windows/mac are case insensitive
|
# windows/mac are case insensitive
|
||||||
assert os.path.realpath(stored_executable).lower() == os.path.realpath(sys.executable).lower()
|
stored_path = os.path.realpath(stored_executable).lower()
|
||||||
|
current_path = os.path.realpath(sys.executable).lower()
|
||||||
|
|
||||||
|
# TODO: This is not valid in an virtual environment
|
||||||
|
assert stored_path == current_path, '{0} != {1}'.format(stored_path, current_path)
|
||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ def get_versions_from_constraint_file(constraint_file):
|
|||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("python_version", ["3.6", "3.8", "3.9"])
|
@pytest.mark.parametrize("python_version", ["3.6", "3.8", "3.9"])
|
||||||
def test_pinned_versions(tmp_path, python_version):
|
def test_pinned_versions(tmp_path, python_version, build_frontend_env):
|
||||||
if utils.platform == "linux":
|
if utils.platform == "linux":
|
||||||
pytest.skip("linux doesn't pin individual tool versions, it pins manylinux images instead")
|
pytest.skip("linux doesn't pin individual tool versions, it pins manylinux images instead")
|
||||||
|
|
||||||
@@ -85,6 +85,7 @@ def test_pinned_versions(tmp_path, python_version):
|
|||||||
add_env={
|
add_env={
|
||||||
"CIBW_BUILD": build_pattern,
|
"CIBW_BUILD": build_pattern,
|
||||||
"CIBW_ENVIRONMENT": cibw_environment_option,
|
"CIBW_ENVIRONMENT": cibw_environment_option,
|
||||||
|
**build_frontend_env,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -107,7 +108,7 @@ def test_pinned_versions(tmp_path, python_version):
|
|||||||
assert set(actual_wheels) == set(expected_wheels)
|
assert set(actual_wheels) == set(expected_wheels)
|
||||||
|
|
||||||
|
|
||||||
def test_dependency_constraints_file(tmp_path):
|
def test_dependency_constraints_file(tmp_path, build_frontend_env):
|
||||||
if utils.platform == "linux":
|
if utils.platform == "linux":
|
||||||
pytest.skip("linux doesn't pin individual tool versions, it pins manylinux images instead")
|
pytest.skip("linux doesn't pin individual tool versions, it pins manylinux images instead")
|
||||||
|
|
||||||
@@ -118,7 +119,7 @@ def test_dependency_constraints_file(tmp_path):
|
|||||||
"pip": "20.0.2",
|
"pip": "20.0.2",
|
||||||
"setuptools": "53.0.0",
|
"setuptools": "53.0.0",
|
||||||
"wheel": "0.34.2",
|
"wheel": "0.34.2",
|
||||||
"virtualenv": "20.0.10",
|
"virtualenv": "20.0.35",
|
||||||
}
|
}
|
||||||
|
|
||||||
constraints_file = tmp_path / "constraints.txt"
|
constraints_file = tmp_path / "constraints.txt"
|
||||||
@@ -129,6 +130,7 @@ def test_dependency_constraints_file(tmp_path):
|
|||||||
setuptools=={setuptools}
|
setuptools=={setuptools}
|
||||||
wheel=={wheel}
|
wheel=={wheel}
|
||||||
virtualenv=={virtualenv}
|
virtualenv=={virtualenv}
|
||||||
|
importlib-metadata<3,>=0.12; python_version < "3.8"
|
||||||
""".format(
|
""".format(
|
||||||
**tool_versions
|
**tool_versions
|
||||||
)
|
)
|
||||||
@@ -149,6 +151,7 @@ def test_dependency_constraints_file(tmp_path):
|
|||||||
add_env={
|
add_env={
|
||||||
"CIBW_ENVIRONMENT": cibw_environment_option,
|
"CIBW_ENVIRONMENT": cibw_environment_option,
|
||||||
"CIBW_DEPENDENCY_VERSIONS": str(constraints_file),
|
"CIBW_DEPENDENCY_VERSIONS": str(constraints_file),
|
||||||
|
**build_frontend_env,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
+11
-4
@@ -1,4 +1,3 @@
|
|||||||
import os
|
|
||||||
import textwrap
|
import textwrap
|
||||||
|
|
||||||
from . import test_projects, utils
|
from . import test_projects, utils
|
||||||
@@ -33,13 +32,13 @@ build-backend = "setuptools.build_meta"
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
def test_pep518(tmp_path):
|
def test_pep518(tmp_path, build_frontend_env):
|
||||||
|
|
||||||
project_dir = tmp_path / "project"
|
project_dir = tmp_path / "project"
|
||||||
basic_project.generate(project_dir)
|
basic_project.generate(project_dir)
|
||||||
|
|
||||||
# build the wheels
|
# build the wheels
|
||||||
actual_wheels = utils.cibuildwheel_run(project_dir)
|
actual_wheels = utils.cibuildwheel_run(project_dir, add_env=build_frontend_env)
|
||||||
|
|
||||||
# check that the expected wheels are produced
|
# check that the expected wheels are produced
|
||||||
expected_wheels = utils.expected_wheels("spam", "0.1.0")
|
expected_wheels = utils.expected_wheels("spam", "0.1.0")
|
||||||
@@ -50,4 +49,12 @@ def test_pep518(tmp_path):
|
|||||||
assert not (project_dir / "42").exists()
|
assert not (project_dir / "42").exists()
|
||||||
assert not (project_dir / "4.1.2").exists()
|
assert not (project_dir / "4.1.2").exists()
|
||||||
|
|
||||||
assert len(os.listdir(project_dir)) == len(basic_project.files)
|
# pypa/build creates a "build" folder & a "*.egg-info" folder for the wheel being built,
|
||||||
|
# this should be harmless so remove them
|
||||||
|
contents = [
|
||||||
|
item
|
||||||
|
for item in project_dir.iterdir()
|
||||||
|
if item.name != "build" and not item.name.endswith(".egg-info")
|
||||||
|
]
|
||||||
|
|
||||||
|
assert len(contents) == len(basic_project.files)
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ raise Exception('this build will fail')
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
def test_failed_project_with_so_files(tmp_path, capfd):
|
def test_failed_project_with_so_files(tmp_path, capfd, build_frontend_env):
|
||||||
if utils.platform != "linux":
|
if utils.platform != "linux":
|
||||||
pytest.skip("this test is only relevant to the linux build")
|
pytest.skip("this test is only relevant to the linux build")
|
||||||
|
|
||||||
@@ -24,7 +24,7 @@ def test_failed_project_with_so_files(tmp_path, capfd):
|
|||||||
so_file_project.generate(project_dir)
|
so_file_project.generate(project_dir)
|
||||||
|
|
||||||
with pytest.raises(subprocess.CalledProcessError):
|
with pytest.raises(subprocess.CalledProcessError):
|
||||||
utils.cibuildwheel_run(project_dir)
|
utils.cibuildwheel_run(project_dir, add_env=build_frontend_env)
|
||||||
|
|
||||||
captured = capfd.readouterr()
|
captured = capfd.readouterr()
|
||||||
print("out", captured.out)
|
print("out", captured.out)
|
||||||
|
|||||||
Reference in New Issue
Block a user