fix: set OUT_DIR for all units with build scripts

Signed-off-by: hi-rustin <rustin.liu@gmail.com>
This commit is contained in:
hi-rustin 2023-12-27 10:27:23 +08:00
parent 8bba4f48c4
commit 6739c7e95e
2 changed files with 27 additions and 22 deletions

View file

@ -12,6 +12,7 @@ use crate::util::errors::CargoResult;
use crate::util::profile;
use anyhow::{bail, Context as _};
use filetime::FileTime;
use itertools::Itertools;
use jobserver::Client;
use super::build_plan::BuildPlan;
@ -185,6 +186,32 @@ impl<'a, 'cfg> Context<'a, 'cfg> {
plan.output_plan(self.bcx.config);
}
// Add `OUT_DIR` to env vars if unit has a build script.
let units_with_build_script = &self
.bcx
.roots
.iter()
.filter(|unit| self.build_scripts.contains_key(unit))
.dedup_by(|x, y| x.pkg.package_id() == y.pkg.package_id())
.collect::<Vec<_>>();
for unit in units_with_build_script {
for dep in &self.bcx.unit_graph[unit] {
if dep.unit.mode.is_run_custom_build() {
let out_dir = self
.files()
.build_script_out_dir(&dep.unit)
.display()
.to_string();
let script_meta = self.get_run_build_script_metadata(&dep.unit);
self.compilation
.extra_env
.entry(script_meta)
.or_insert_with(Vec::new)
.push(("OUT_DIR".to_string(), out_dir));
}
}
}
// Collect the result of the build into `self.compilation`.
for unit in &self.bcx.roots {
// Collect tests and executables.
@ -213,26 +240,6 @@ impl<'a, 'cfg> Context<'a, 'cfg> {
}
}
// If the unit has a build script, add `OUT_DIR` to the
// environment variables.
if unit.target.is_lib() {
for dep in &self.bcx.unit_graph[unit] {
if dep.unit.mode.is_run_custom_build() {
let out_dir = self
.files()
.build_script_out_dir(&dep.unit)
.display()
.to_string();
let script_meta = self.get_run_build_script_metadata(&dep.unit);
self.compilation
.extra_env
.entry(script_meta)
.or_insert_with(Vec::new)
.push(("OUT_DIR".to_string(), out_dir));
}
}
}
// Collect information for `rustdoc --test`.
if unit.mode.is_doc_test() {
let mut unstable_opts = false;

View file

@ -4941,7 +4941,5 @@ fn cargo_test_set_out_dir_env_var() {
p.cargo("test").run();
p.cargo("test --package foo --test case -- tests::test_add --exact --nocapture")
.with_stdout_contains("test tests::test_add ... FAILED")
.with_status(101)
.run();
}