From d198c90f7a282667a27a73a4bcd4b28402e27566 Mon Sep 17 00:00:00 2001 From: Joe Rickerby Date: Fri, 24 Nov 2023 11:49:26 +0000 Subject: [PATCH] Allow the user to set PIP_CONSTRAINT and it affect build-system.requires --- cibuildwheel/macos.py | 4 +++- cibuildwheel/windows.py | 4 +++- docs/options.md | 2 +- test/test_environment.py | 37 +++++++++++++++++++++++++++++++++++++ 4 files changed, 44 insertions(+), 3 deletions(-) diff --git a/cibuildwheel/macos.py b/cibuildwheel/macos.py index 77ae492a..07d1bf95 100644 --- a/cibuildwheel/macos.py +++ b/cibuildwheel/macos.py @@ -409,7 +409,9 @@ def build(options: Options, tmp_path: Path) -> None: config.version ) ) - build_env["PIP_CONSTRAINT"] = constraint_path.as_uri() + build_env["PIP_CONSTRAINT"] = ( + constraint_path.as_uri() + " " + build_env.get("PIP_CONSTRAINT", "") + ) build_env["VIRTUALENV_PIP"] = get_pip_version(env) call( "python", diff --git a/cibuildwheel/windows.py b/cibuildwheel/windows.py index 881821bd..9fe9f489 100644 --- a/cibuildwheel/windows.py +++ b/cibuildwheel/windows.py @@ -455,7 +455,9 @@ def build(options: Options, tmp_path: Path) -> None: tmp_file.write_bytes(constraints_path.read_bytes()) constraints_path = tmp_file - build_env["PIP_CONSTRAINT"] = str(constraints_path) + build_env["PIP_CONSTRAINT"] = ( + str(constraints_path) + " " + build_env.get("PIP_CONSTRAINT", "") + ) build_env["VIRTUALENV_PIP"] = get_pip_version(env) call( "python", diff --git a/docs/options.md b/docs/options.md index e9e343a3..eff5ccd3 100644 --- a/docs/options.md +++ b/docs/options.md @@ -674,7 +674,7 @@ Platform-specific environment variables are also available:
cibuildwheel always defines the environment variable `CIBUILDWHEEL=1`. This can be useful for [building wheels with optional extensions](faq.md#building-packages-with-optional-c-extensions). !!! note - To do its work, cibuildwheel internally sets the options `PIP_CONSTRAINT`, `VIRTUALENV_PIP`, `DIST_EXTRA_CONFIG`, `SETUPTOOLS_EXT_SUFFIX`, `PIP_DISABLE_PIP_VERSION_CHECK`, `PIP_ROOT_USER_ACTION`. Your assignments to these options might be overridden. + To do its work, cibuildwheel internally sets the options `VIRTUALENV_PIP`, `DIST_EXTRA_CONFIG`, `SETUPTOOLS_EXT_SUFFIX`, `PIP_DISABLE_PIP_VERSION_CHECK`, `PIP_ROOT_USER_ACTION`. Your assignments to these options might be overridden. ### `CIBW_ENVIRONMENT_PASS_LINUX` {: #environment-pass} > Set environment variables on the host to pass-through to the container. diff --git a/test/test_environment.py b/test/test_environment.py index 35de8785..1ab76d1b 100644 --- a/test/test_environment.py +++ b/test/test_environment.py @@ -93,3 +93,40 @@ def test_overridden_path(tmp_path, capfd): assert len(os.listdir(output_dir)) == 0 captured = capfd.readouterr() assert "python available on PATH doesn't match our installed instance" in captured.err + + +@pytest.mark.parametrize("build_frontend", ["pip", "build"]) +def test_overridden_pip_constraint(tmp_path, build_frontend): + project_dir = tmp_path / "project" + + project = test_projects.new_c_project( + setup_py_add=textwrap.dedent( + """ + import pytz + assert pytz.__version__ == "2022.4" + """ + ) + ) + project.files["pyproject.toml"] = textwrap.dedent( + """ + [build-system] + requires = ["setuptools", "pytz"] + build-backend = "setuptools.build_meta" + """ + ) + project.generate(project_dir) + + constraints_file = tmp_path / "constraints.txt" + constraints_file.write_text("pytz==2022.4") + + actual_wheels = utils.cibuildwheel_run( + project_dir, + add_env={ + "CIBW_BUILD": "cp312-*", + "CIBW_BUILD_FRONTEND": build_frontend, + "CIBW_ENVIRONMENT": f"PIP_CONSTRAINT={constraints_file}", + }, + ) + + expected_wheels = [w for w in utils.expected_wheels("spam", "0.1.0") if "cp312" in w] + assert set(actual_wheels) == set(expected_wheels)