diff --git a/cibuildwheel/environment.py b/cibuildwheel/environment.py index d7727ae48..e4018b915 100644 --- a/cibuildwheel/environment.py +++ b/cibuildwheel/environment.py @@ -124,8 +124,12 @@ def as_dictionary( return environment - def add(self, name: str, value: str) -> None: - self.assignments.append(EnvironmentAssignmentRaw(name=name, value=value)) + def add(self, name: str, value: str, prepend: bool = False) -> None: + assignment = EnvironmentAssignmentRaw(name=name, value=value) + if prepend: + self.assignments.insert(0, assignment) + else: + self.assignments.append(assignment) def __repr__(self) -> str: return f"{self.__class__.__name__}({[repr(a) for a in self.assignments]!r})" diff --git a/cibuildwheel/options.py b/cibuildwheel/options.py index d4306a7a6..f5664cbf1 100644 --- a/cibuildwheel/options.py +++ b/cibuildwheel/options.py @@ -532,9 +532,9 @@ def build_options(self, identifier: str | None) -> BuildOptions: # Pass through environment variables if self.platform == "linux": - for env_var_name in environment_pass: + for env_var_name in reversed(environment_pass): with contextlib.suppress(KeyError): - environment.add(env_var_name, self.env[env_var_name]) + environment.add(env_var_name, self.env[env_var_name], prepend=True) if dependency_versions == "pinned": dependency_constraints: None | ( diff --git a/unit_test/options_test.py b/unit_test/options_test.py index 8818ba7e1..3a823d6c4 100644 --- a/unit_test/options_test.py +++ b/unit_test/options_test.py @@ -255,6 +255,25 @@ def test_container_engine_option(tmp_path: Path, toml_assignment, result_name, r assert parsed_container_engine.create_args == result_create_args +def test_environment_pass_references(): + options = Options( + platform="linux", + command_line_arguments=CommandLineArguments.defaults(), + env={ + "CIBW_ENVIRONMENT_PASS_LINUX": "STARTER MAIN_COURSE", + "STARTER": "green eggs", + "MAIN_COURSE": "ham", + "CIBW_ENVIRONMENT": 'MEAL="$STARTER and $MAIN_COURSE"', + }, + ) + parsed_environment = options.build_options(identifier=None).environment + assert parsed_environment.as_dictionary(prev_environment={}) == { + "MEAL": "green eggs and ham", + "STARTER": "green eggs", + "MAIN_COURSE": "ham", + } + + @pytest.mark.parametrize( ("toml_assignment", "result_name", "result_args"), [