Skip to content

Commit f4291e7

Browse files
authored
Merge pull request #1617 from pypa/env-order
fix: evaluate environment-pass before environment, so environment can reference or override those variables
2 parents 9da4ede + 29cb138 commit f4291e7

File tree

3 files changed

+27
-4
lines changed

3 files changed

+27
-4
lines changed

cibuildwheel/environment.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -124,8 +124,12 @@ def as_dictionary(
124124

125125
return environment
126126

127-
def add(self, name: str, value: str) -> None:
128-
self.assignments.append(EnvironmentAssignmentRaw(name=name, value=value))
127+
def add(self, name: str, value: str, prepend: bool = False) -> None:
128+
assignment = EnvironmentAssignmentRaw(name=name, value=value)
129+
if prepend:
130+
self.assignments.insert(0, assignment)
131+
else:
132+
self.assignments.append(assignment)
129133

130134
def __repr__(self) -> str:
131135
return f"{self.__class__.__name__}({[repr(a) for a in self.assignments]!r})"

cibuildwheel/options.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -532,9 +532,9 @@ def build_options(self, identifier: str | None) -> BuildOptions:
532532

533533
# Pass through environment variables
534534
if self.platform == "linux":
535-
for env_var_name in environment_pass:
535+
for env_var_name in reversed(environment_pass):
536536
with contextlib.suppress(KeyError):
537-
environment.add(env_var_name, self.env[env_var_name])
537+
environment.add(env_var_name, self.env[env_var_name], prepend=True)
538538

539539
if dependency_versions == "pinned":
540540
dependency_constraints: None | (

unit_test/options_test.py

+19
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,25 @@ def test_container_engine_option(tmp_path: Path, toml_assignment, result_name, r
255255
assert parsed_container_engine.create_args == result_create_args
256256

257257

258+
def test_environment_pass_references():
259+
options = Options(
260+
platform="linux",
261+
command_line_arguments=CommandLineArguments.defaults(),
262+
env={
263+
"CIBW_ENVIRONMENT_PASS_LINUX": "STARTER MAIN_COURSE",
264+
"STARTER": "green eggs",
265+
"MAIN_COURSE": "ham",
266+
"CIBW_ENVIRONMENT": 'MEAL="$STARTER and $MAIN_COURSE"',
267+
},
268+
)
269+
parsed_environment = options.build_options(identifier=None).environment
270+
assert parsed_environment.as_dictionary(prev_environment={}) == {
271+
"MEAL": "green eggs and ham",
272+
"STARTER": "green eggs",
273+
"MAIN_COURSE": "ham",
274+
}
275+
276+
258277
@pytest.mark.parametrize(
259278
("toml_assignment", "result_name", "result_args"),
260279
[

0 commit comments

Comments
 (0)