Skip to content

Commit 379e94f

Browse files
committed
Auto merge of #94480 - bjorn3:no_build_helper, r=Mark-Simulacrum
Remove build_helper The majority of the code is only used by either rustbuild or rustc_llvm's build script. Rust_build is compiled once for rustbuild and once for every stage. This means that the majority of the code in this crate is needlessly compiled multiple times. By moving only the code actually used by the respective crates to rustbuild and rustc_llvm's build script, this needless duplicate compilation is avoided.
2 parents c8a49fc + e657da7 commit 379e94f

27 files changed

+236
-272
lines changed

Cargo.lock

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,6 @@ dependencies = [
214214
name = "bootstrap"
215215
version = "0.0.0"
216216
dependencies = [
217-
"build_helper",
218217
"cc",
219218
"cmake",
220219
"filetime",
@@ -256,10 +255,6 @@ dependencies = [
256255
"toml",
257256
]
258257

259-
[[package]]
260-
name = "build_helper"
261-
version = "0.1.0"
262-
263258
[[package]]
264259
name = "bump-stage0"
265260
version = "0.1.0"
@@ -3891,7 +3886,6 @@ dependencies = [
38913886
name = "rustc_llvm"
38923887
version = "0.0.0"
38933888
dependencies = [
3894-
"build_helper",
38953889
"cc",
38963890
"libc",
38973891
]

compiler/rustc_llvm/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,4 @@ emscripten = []
1111
libc = "0.2.73"
1212

1313
[build-dependencies]
14-
build_helper = { path = "../../src/build_helper" }
1514
cc = "1.0.69"

compiler/rustc_llvm/build.rs

Lines changed: 66 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use std::env;
2+
use std::ffi::{OsStr, OsString};
3+
use std::fmt::Display;
24
use std::path::{Path, PathBuf};
3-
use std::process::Command;
4-
5-
use build_helper::{output, tracked_env_var_os};
5+
use std::process::{Command, Stdio};
66

77
fn detect_llvm_link() -> (&'static str, &'static str) {
88
// Force the link mode we want, preferring static by default, but
@@ -14,13 +14,74 @@ fn detect_llvm_link() -> (&'static str, &'static str) {
1414
}
1515
}
1616

17+
// Because Cargo adds the compiler's dylib path to our library search path, llvm-config may
18+
// break: the dylib path for the compiler, as of this writing, contains a copy of the LLVM
19+
// shared library, which means that when our freshly built llvm-config goes to load it's
20+
// associated LLVM, it actually loads the compiler's LLVM. In particular when building the first
21+
// compiler (i.e., in stage 0) that's a problem, as the compiler's LLVM is likely different from
22+
// the one we want to use. As such, we restore the environment to what bootstrap saw. This isn't
23+
// perfect -- we might actually want to see something from Cargo's added library paths -- but
24+
// for now it works.
25+
fn restore_library_path() {
26+
let key = tracked_env_var_os("REAL_LIBRARY_PATH_VAR").expect("REAL_LIBRARY_PATH_VAR");
27+
if let Some(env) = tracked_env_var_os("REAL_LIBRARY_PATH") {
28+
env::set_var(&key, &env);
29+
} else {
30+
env::remove_var(&key);
31+
}
32+
}
33+
34+
/// Reads an environment variable and adds it to dependencies.
35+
/// Supposed to be used for all variables except those set for build scripts by cargo
36+
/// <https://doc.rust-lang.org/cargo/reference/environment-variables.html#environment-variables-cargo-sets-for-build-scripts>
37+
fn tracked_env_var_os<K: AsRef<OsStr> + Display>(key: K) -> Option<OsString> {
38+
println!("cargo:rerun-if-env-changed={}", key);
39+
env::var_os(key)
40+
}
41+
42+
fn rerun_if_changed_anything_in_dir(dir: &Path) {
43+
let mut stack = dir
44+
.read_dir()
45+
.unwrap()
46+
.map(|e| e.unwrap())
47+
.filter(|e| &*e.file_name() != ".git")
48+
.collect::<Vec<_>>();
49+
while let Some(entry) = stack.pop() {
50+
let path = entry.path();
51+
if entry.file_type().unwrap().is_dir() {
52+
stack.extend(path.read_dir().unwrap().map(|e| e.unwrap()));
53+
} else {
54+
println!("cargo:rerun-if-changed={}", path.display());
55+
}
56+
}
57+
}
58+
59+
#[track_caller]
60+
fn output(cmd: &mut Command) -> String {
61+
let output = match cmd.stderr(Stdio::inherit()).output() {
62+
Ok(status) => status,
63+
Err(e) => {
64+
println!("\n\nfailed to execute command: {:?}\nerror: {}\n\n", cmd, e);
65+
std::process::exit(1);
66+
}
67+
};
68+
if !output.status.success() {
69+
panic!(
70+
"command did not execute successfully: {:?}\n\
71+
expected success, got: {}",
72+
cmd, output.status
73+
);
74+
}
75+
String::from_utf8(output.stdout).unwrap()
76+
}
77+
1778
fn main() {
1879
if tracked_env_var_os("RUST_CHECK").is_some() {
1980
// If we're just running `check`, there's no need for LLVM to be built.
2081
return;
2182
}
2283

23-
build_helper::restore_library_path();
84+
restore_library_path();
2485

2586
let target = env::var("TARGET").expect("TARGET was not set");
2687
let llvm_config =
@@ -160,7 +221,7 @@ fn main() {
160221
cfg.debug(false);
161222
}
162223

163-
build_helper::rerun_if_changed_anything_in_dir(Path::new("llvm-wrapper"));
224+
rerun_if_changed_anything_in_dir(Path::new("llvm-wrapper"));
164225
cfg.file("llvm-wrapper/PassWrapper.cpp")
165226
.file("llvm-wrapper/RustWrapper.cpp")
166227
.file("llvm-wrapper/ArchiveWrapper.cpp")

src/bootstrap/Cargo.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ path = "bin/llvm-config-wrapper.rs"
3434
test = false
3535

3636
[dependencies]
37-
build_helper = { path = "../build_helper" }
3837
cmake = "0.1.38"
3938
filetime = "0.2"
4039
getopts = "0.2.19"

src/bootstrap/builder.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@ use std::path::{Component, Path, PathBuf};
1111
use std::process::Command;
1212
use std::time::{Duration, Instant};
1313

14-
use build_helper::{output, t};
15-
1614
use crate::cache::{Cache, Interned, INTERNER};
1715
use crate::check;
1816
use crate::compile;
@@ -25,7 +23,7 @@ use crate::native;
2523
use crate::run;
2624
use crate::test;
2725
use crate::tool::{self, SourceType};
28-
use crate::util::{self, add_dylib_path, add_link_lib_path, exe, libdir};
26+
use crate::util::{self, add_dylib_path, add_link_lib_path, exe, libdir, output, t};
2927
use crate::EXTRA_CHECK_CFGS;
3028
use crate::{Build, CLang, DocTests, GitRepo, Mode};
3129

src/bootstrap/cc_detect.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,8 @@ use std::path::{Path, PathBuf};
2626
use std::process::Command;
2727
use std::{env, iter};
2828

29-
use build_helper::output;
30-
3129
use crate::config::{Target, TargetSelection};
30+
use crate::util::output;
3231
use crate::{Build, CLang, GitRepo};
3332

3433
// The `cc` crate doesn't provide a way to obtain a path to the detected archiver,

src/bootstrap/channel.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,7 @@
88
use std::path::Path;
99
use std::process::Command;
1010

11-
use build_helper::output;
12-
11+
use crate::util::output;
1312
use crate::Build;
1413

1514
pub enum GitInfo {

src/bootstrap/clean.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@ use std::fs;
99
use std::io::{self, ErrorKind};
1010
use std::path::Path;
1111

12-
use build_helper::t;
13-
12+
use crate::util::t;
1413
use crate::Build;
1514

1615
pub fn clean(build: &Build, all: bool) {

src/bootstrap/compile.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ use std::path::{Path, PathBuf};
1616
use std::process::{exit, Command, Stdio};
1717
use std::str;
1818

19-
use build_helper::{output, t, up_to_date};
2019
use serde::Deserialize;
2120

2221
use crate::builder::Cargo;
@@ -26,7 +25,7 @@ use crate::config::{LlvmLibunwind, TargetSelection};
2625
use crate::dist;
2726
use crate::native;
2827
use crate::tool::SourceType;
29-
use crate::util::{exe, is_debug_info, is_dylib, symlink_dir};
28+
use crate::util::{exe, is_debug_info, is_dylib, output, symlink_dir, t, up_to_date};
3029
use crate::LLVM_TOOLS;
3130
use crate::{CLang, Compiler, DependencyType, GitRepo, Mode};
3231

src/bootstrap/config.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,7 @@ use crate::cache::{Interned, INTERNER};
1717
use crate::channel::GitInfo;
1818
pub use crate::flags::Subcommand;
1919
use crate::flags::{Color, Flags};
20-
use crate::util::exe;
21-
use build_helper::t;
20+
use crate::util::{exe, t};
2221
use serde::Deserialize;
2322

2423
macro_rules! check_ci_llvm {

0 commit comments

Comments
 (0)