Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Support --build-constraint
  • Loading branch information
ichard26 committed Dec 16, 2025
commit 740061d895a067d00dd3b3b8d2d20fd90fef4fcd
12 changes: 8 additions & 4 deletions src/pip/_internal/build_env.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import sys
import textwrap
from collections import OrderedDict
from collections.abc import Iterable
from collections.abc import Iterable, Sequence
from contextlib import AbstractContextManager as ContextManager
from contextlib import nullcontext
from io import StringIO
Expand Down Expand Up @@ -277,12 +277,15 @@ def __init__(
finder: PackageFinder,
build_tracker: BuildTracker,
wheel_cache: WheelCache,
build_constraints: Sequence[InstallRequirement] = (),
resume_retries: int = 0,
verbosity: int = 0,
) -> None:
from pip._internal.operations.prepare import RequirementPreparer

self.finder = finder
self._finder = finder
self._build_constraints = build_constraints
self._wheel_cache = wheel_cache
self._level = 0

build_dir = TempDirectory(kind="build-env-install", globally_managed=True)
Expand All @@ -309,7 +312,6 @@ def __init__(
lazy_wheel=False,
legacy_resolver=False,
)
self._wheel_cache = wheel_cache

def install(
self,
Expand Down Expand Up @@ -371,6 +373,8 @@ def _install_impl(self, requirements: Iterable[str], prefix: _Prefix) -> None:
from pip._internal.wheel_builder import build

ireqs = [install_req_from_line(req, user_supplied=True) for req in requirements]
ireqs.extend(self._build_constraints)

resolver = self._make_resolver()
resolved_set = resolver.resolve(ireqs, check_supported_wheels=True)
self._preparer.prepare_linked_requirements_more(
Expand Down Expand Up @@ -413,7 +417,7 @@ def _make_resolver(self) -> BaseResolver:
make_install_req=install_req_from_req_string,
# Inherited state.
preparer=self._preparer,
finder=self.finder,
finder=self._finder,
wheel_cache=self._wheel_cache,
# Hard-coded options (that should NOT be inherited).
ignore_requires_python=False,
Expand Down
47 changes: 33 additions & 14 deletions src/pip/_internal/cli/req_command.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,31 @@ def wrapper(self: _CommandT, options: Values, args: list[str]) -> int:
return wrapper


def parse_constraint_files(
constraint_files: list[str],
finder: PackageFinder,
options: Values,
session: PipSession,
) -> list[InstallRequirement]:
requirements = []
for filename in constraint_files:
for parsed_req in parse_requirements(
filename,
constraint=True,
finder=finder,
options=options,
session=session,
):
req_to_add = install_req_from_parsed_requirement(
parsed_req,
isolated=options.isolated_mode,
user_supplied=False,
)
requirements.append(req_to_add)

return requirements


class RequirementCommand(IndexGroupCommand):
def __init__(self, *args: Any, **kw: Any) -> None:
super().__init__(*args, **kw)
Expand Down Expand Up @@ -165,9 +190,13 @@ def make_requirement_preparer(

env_installer: BuildEnvironmentInstaller
if "inprocess-build-deps" in options.features_enabled:
build_constraint_reqs = parse_constraint_files(
build_constraints, finder, options, session
)
env_installer = InprocessBuildEnvironmentInstaller(
finder=finder,
build_tracker=build_tracker,
build_constraints=build_constraint_reqs,
verbosity=verbosity,
resume_retries=options.resume_retries,
wheel_cache=WheelCache(options.cache_dir),
Expand Down Expand Up @@ -267,20 +296,10 @@ def get_requirements(
requirements: list[InstallRequirement] = []

if not should_ignore_regular_constraints(options):
for filename in options.constraints:
for parsed_req in parse_requirements(
filename,
constraint=True,
finder=finder,
options=options,
session=session,
):
req_to_add = install_req_from_parsed_requirement(
parsed_req,
isolated=options.isolated_mode,
user_supplied=False,
)
requirements.append(req_to_add)
constraints = parse_constraint_files(
options.constraints, finder, options, session
)
requirements.extend(constraints)

for req in args:
if not req.strip():
Expand Down