Skip to content

Commit 93515ac

Browse files
committed
Add environment variables for accessing the OUT_DIR
1 parent d7aa0bc commit 93515ac

File tree

3 files changed

+41
-15
lines changed

3 files changed

+41
-15
lines changed

src/cargo/core/compiler/mod.rs

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1704,15 +1704,34 @@ fn build_deps_args(
17041704

17051705
let mut unstable_opts = false;
17061706

1707-
for dep in deps {
1708-
if dep.unit.mode.is_run_custom_build() {
1709-
cmd.env(
1710-
"OUT_DIR",
1711-
&build_runner.files().build_script_out_dir(&dep.unit),
1712-
);
1707+
// Add `OUT_DIR` environment variables for build scripts
1708+
let first_custom_build_dep = deps.iter().find(|dep| dep.unit.mode.is_run_custom_build());
1709+
if let Some(dep) = first_custom_build_dep {
1710+
let out_dir = &build_runner.files().build_script_out_dir(&dep.unit);
1711+
cmd.env("OUT_DIR", &out_dir);
1712+
}
1713+
1714+
// Adding output directory for each build script
1715+
let is_multiple_build_scripts_enabled = unit
1716+
.pkg
1717+
.manifest()
1718+
.unstable_features()
1719+
.require(Feature::multiple_build_scripts())
1720+
.is_ok();
1721+
1722+
if is_multiple_build_scripts_enabled {
1723+
for dep in deps {
1724+
if dep.unit.mode.is_run_custom_build() {
1725+
let out_dir = &build_runner.files().build_script_out_dir(&dep.unit);
1726+
let target_name = dep.unit.target.name();
1727+
let out_dir_prefix = target_name
1728+
.strip_prefix("build-script-")
1729+
.unwrap_or(target_name);
1730+
let out_dir_name = format!("{out_dir_prefix}_OUT_DIR");
1731+
cmd.env(&out_dir_name, &out_dir);
1732+
}
17131733
}
17141734
}
1715-
17161735
for arg in extern_args(build_runner, unit, &mut unstable_opts)? {
17171736
cmd.arg(arg);
17181737
}

src/doc/src/reference/unstable.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,10 @@ version = "0.0.1"
324324
build = ["foo.rs", "bar.rs"]
325325
```
326326

327+
**Accessing Output Directories**: Output directory of each build script can be accessed by using `<script-name>_OUT_DIR`
328+
where the `<script-name>` is the file-stem of the build script, exactly as-is.
329+
For example, `bar_OUT_DIR` for script at `foo/bar.rs`. (Only set during compilation, can be accessed via `env!` macro)
330+
327331
## public-dependency
328332
* Tracking Issue: [#44663](https://github.com/rust-lang/rust/issues/44663)
329333

tests/testsuite/build_scripts_multiple.rs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -549,7 +549,7 @@ fn build_script_with_conflicting_out_dirs() {
549549
build = ["build1.rs", "build2.rs"]
550550
"#,
551551
)
552-
// OUT_DIR is set to the lexicographically largest build script's OUT_DIR by default
552+
// By default, OUT_DIR is set to that of the first build script in the array
553553
.file(
554554
"src/main.rs",
555555
r#"
@@ -603,7 +603,7 @@ fn build_script_with_conflicting_out_dirs() {
603603
.masquerade_as_nightly_cargo(&["multiple-build-scripts"])
604604
.with_status(0)
605605
.with_stdout_data(str![[r#"
606-
Hello, from Build Script 2!
606+
Hello, from Build Script 1!
607607
608608
"#]])
609609
.run();
@@ -628,7 +628,7 @@ fn build_script_with_conflicts_reverse_sorted() {
628628
build = ["build2.rs", "build1.rs"]
629629
"#,
630630
)
631-
// OUT_DIR is set to the lexicographically largest build script's OUT_DIR by default
631+
// By default, OUT_DIR is set to that of the first build script in the array
632632
.file(
633633
"src/main.rs",
634634
r#"
@@ -682,7 +682,7 @@ fn build_script_with_conflicts_reverse_sorted() {
682682
.masquerade_as_nightly_cargo(&["multiple-build-scripts"])
683683
.with_status(0)
684684
.with_stdout_data(str![[r#"
685-
Hello, from Build Script 1!
685+
Hello, from Build Script 2!
686686
687687
"#]])
688688
.run();
@@ -785,9 +785,11 @@ fn multiple_out_dirs() {
785785
.file(
786786
"src/main.rs",
787787
r#"
788-
include!(concat!(env!("OUT_DIR"), "/foo.rs"));
788+
include!(concat!(env!("build1_OUT_DIR"), "/foo.rs"));
789+
include!(concat!(env!("build2_OUT_DIR"), "/foo.rs"));
789790
fn main() {
790-
println!("{}", message());
791+
println!("{}", message1());
792+
println!("{}", message2());
791793
}
792794
"#,
793795
)
@@ -803,7 +805,7 @@ fn multiple_out_dirs() {
803805
let dest_path = Path::new(&out_dir).join("foo.rs");
804806
fs::write(
805807
&dest_path,
806-
"pub fn message() -> &'static str {
808+
"pub fn message1() -> &'static str {
807809
\"Hello, from Build Script 1!\"
808810
}
809811
"
@@ -822,7 +824,7 @@ fn multiple_out_dirs() {
822824
let dest_path = Path::new(&out_dir).join("foo.rs");
823825
fs::write(
824826
&dest_path,
825-
"pub fn message() -> &'static str {
827+
"pub fn message2() -> &'static str {
826828
\"Hello, from Build Script 2!\"
827829
}
828830
"
@@ -835,6 +837,7 @@ fn multiple_out_dirs() {
835837
.masquerade_as_nightly_cargo(&["multiple-build-scripts"])
836838
.with_status(0)
837839
.with_stdout_data(str![[r#"
840+
Hello, from Build Script 1!
838841
Hello, from Build Script 2!
839842
840843
"#]])

0 commit comments

Comments
 (0)