about summary refs log tree commit diff
path: root/src/bootstrap/src/utils
diff options
context:
space:
mode:
Diffstat (limited to 'src/bootstrap/src/utils')
-rw-r--r--src/bootstrap/src/utils/cc_detect.rs4
-rw-r--r--src/bootstrap/src/utils/change_tracker.rs20
-rw-r--r--src/bootstrap/src/utils/dylib.rs2
-rw-r--r--src/bootstrap/src/utils/helpers.rs31
-rw-r--r--src/bootstrap/src/utils/job.rs56
-rw-r--r--src/bootstrap/src/utils/render_tests.rs10
-rw-r--r--src/bootstrap/src/utils/tarball.rs18
7 files changed, 93 insertions, 48 deletions
diff --git a/src/bootstrap/src/utils/cc_detect.rs b/src/bootstrap/src/utils/cc_detect.rs
index 7e59b7f6f57..540b8671333 100644
--- a/src/bootstrap/src/utils/cc_detect.rs
+++ b/src/bootstrap/src/utils/cc_detect.rs
@@ -41,9 +41,7 @@ fn cc2ar(cc: &Path, target: TargetSelection) -> Option<PathBuf> {
         Some(PathBuf::from(ar))
     } else if target.is_msvc() {
         None
-    } else if target.contains("musl") {
-        Some(PathBuf::from("ar"))
-    } else if target.contains("openbsd") {
+    } else if target.contains("musl") || target.contains("openbsd") {
         Some(PathBuf::from("ar"))
     } else if target.contains("vxworks") {
         Some(PathBuf::from("wr-ar"))
diff --git a/src/bootstrap/src/utils/change_tracker.rs b/src/bootstrap/src/utils/change_tracker.rs
index db3df598a0c..bfe3622e40d 100644
--- a/src/bootstrap/src/utils/change_tracker.rs
+++ b/src/bootstrap/src/utils/change_tracker.rs
@@ -175,4 +175,24 @@ pub const CONFIG_CHANGE_HISTORY: &[ChangeInfo] = &[
         severity: ChangeSeverity::Warning,
         summary: "The deprecated field `changelog-seen` has been removed. Using that field in `config.toml` from now on will result in breakage.",
     },
+    ChangeInfo {
+        change_id: 124501,
+        severity: ChangeSeverity::Info,
+        summary: "New option `build.lldb` that will override the default lldb binary path used in debuginfo tests",
+    },
+    ChangeInfo {
+        change_id: 123337,
+        severity: ChangeSeverity::Info,
+        summary: r#"The compiler profile now defaults to rust.debuginfo-level = "line-tables-only""#,
+    },
+    ChangeInfo {
+        change_id: 124129,
+        severity: ChangeSeverity::Warning,
+        summary: "`rust.lld` has a new default value of `true` on `x86_64-unknown-linux-gnu`. Starting at stage1, `rust-lld` will thus be this target's default linker. No config changes should be necessary.",
+    },
+    ChangeInfo {
+        change_id: 125535,
+        severity: ChangeSeverity::Warning,
+        summary: "Removed `dist.missing-tools` configuration as it was deprecated long time ago.",
+    },
 ];
diff --git a/src/bootstrap/src/utils/dylib.rs b/src/bootstrap/src/utils/dylib.rs
index b6e7aec1756..90bcff59a64 100644
--- a/src/bootstrap/src/utils/dylib.rs
+++ b/src/bootstrap/src/utils/dylib.rs
@@ -5,7 +5,7 @@
 pub fn dylib_path_var() -> &'static str {
     if cfg!(target_os = "windows") {
         "PATH"
-    } else if cfg!(target_os = "macos") {
+    } else if cfg!(target_vendor = "apple") {
         "DYLD_LIBRARY_PATH"
     } else if cfg!(target_os = "haiku") {
         "LIBRARY_PATH"
diff --git a/src/bootstrap/src/utils/helpers.rs b/src/bootstrap/src/utils/helpers.rs
index a40ee189001..278359cb08e 100644
--- a/src/bootstrap/src/utils/helpers.rs
+++ b/src/bootstrap/src/utils/helpers.rs
@@ -150,6 +150,21 @@ pub fn symlink_dir(config: &Config, original: &Path, link: &Path) -> io::Result<
     }
 }
 
+/// Rename a file if from and to are in the same filesystem or
+/// copy and remove the file otherwise
+pub fn move_file<P: AsRef<Path>, Q: AsRef<Path>>(from: P, to: Q) -> io::Result<()> {
+    match fs::rename(&from, &to) {
+        // FIXME: Once `ErrorKind::CrossesDevices` is stabilized use
+        // if e.kind() == io::ErrorKind::CrossesDevices {
+        #[cfg(unix)]
+        Err(e) if e.raw_os_error() == Some(libc::EXDEV) => {
+            std::fs::copy(&from, &to)?;
+            std::fs::remove_file(&from)
+        }
+        r => r,
+    }
+}
+
 pub fn forcing_clang_based_tests() -> bool {
     if let Some(var) = env::var_os("RUSTBUILD_FORCE_CLANG_BASED_TESTS") {
         match &var.to_string_lossy().to_lowercase()[..] {
@@ -296,6 +311,15 @@ pub fn up_to_date(src: &Path, dst: &Path) -> bool {
     }
 }
 
+/// Returns the filename without the hash prefix added by the cc crate.
+///
+/// Since v1.0.78 of the cc crate, object files are prefixed with a 16-character hash
+/// to avoid filename collisions.
+pub fn unhashed_basename(obj: &Path) -> &str {
+    let basename = obj.file_stem().unwrap().to_str().expect("UTF-8 file name");
+    basename.split_once('-').unwrap().1
+}
+
 fn dir_up_to_date(src: &Path, threshold: SystemTime) -> bool {
     t!(fs::read_dir(src)).map(|e| t!(e)).all(|e| {
         let meta = t!(e.metadata());
@@ -549,7 +573,12 @@ pub fn hex_encode<T>(input: T) -> String
 where
     T: AsRef<[u8]>,
 {
-    input.as_ref().iter().map(|x| format!("{:02x}", x)).collect()
+    use std::fmt::Write;
+
+    input.as_ref().iter().fold(String::with_capacity(input.as_ref().len() * 2), |mut acc, &byte| {
+        write!(&mut acc, "{:02x}", byte).expect("Failed to write byte to the hex String.");
+        acc
+    })
 }
 
 /// Create a `--check-cfg` argument invocation for a given name
diff --git a/src/bootstrap/src/utils/job.rs b/src/bootstrap/src/utils/job.rs
index c5c718a892f..d7d20e57bd1 100644
--- a/src/bootstrap/src/utils/job.rs
+++ b/src/bootstrap/src/utils/job.rs
@@ -11,37 +11,35 @@ pub unsafe fn setup(build: &mut crate::Build) {
     }
 }
 
+/// Job management on Windows for bootstrapping
+///
+/// Most of the time when you're running a build system (e.g., make) you expect
+/// Ctrl-C or abnormal termination to actually terminate the entire tree of
+/// process in play, not just the one at the top. This currently works "by
+/// default" on Unix platforms because Ctrl-C actually sends a signal to the
+/// *process group* rather than the parent process, so everything will get torn
+/// down. On Windows, however, this does not happen and Ctrl-C just kills the
+/// parent process.
+///
+/// To achieve the same semantics on Windows we use Job Objects to ensure that
+/// all processes die at the same time. Job objects have a mode of operation
+/// where when all handles to the object are closed it causes all child
+/// processes associated with the object to be terminated immediately.
+/// Conveniently whenever a process in the job object spawns a new process the
+/// child will be associated with the job object as well. This means if we add
+/// ourselves to the job object we create then everything will get torn down!
+///
+/// Unfortunately most of the time the build system is actually called from a
+/// python wrapper (which manages things like building the build system) so this
+/// all doesn't quite cut it so far. To go the last mile we duplicate the job
+/// object handle into our parent process (a python process probably) and then
+/// close our own handle. This means that the only handle to the job object
+/// resides in the parent python process, so when python dies the whole build
+/// system dies (as one would probably expect!).
+///
+/// Note that this is a Windows specific module as none of this logic is required on Unix.
 #[cfg(windows)]
 mod for_windows {
-    //! Job management on Windows for bootstrapping
-    //!
-    //! Most of the time when you're running a build system (e.g., make) you expect
-    //! Ctrl-C or abnormal termination to actually terminate the entire tree of
-    //! process in play, not just the one at the top. This currently works "by
-    //! default" on Unix platforms because Ctrl-C actually sends a signal to the
-    //! *process group* rather than the parent process, so everything will get torn
-    //! down. On Windows, however, this does not happen and Ctrl-C just kills the
-    //! parent process.
-    //!
-    //! To achieve the same semantics on Windows we use Job Objects to ensure that
-    //! all processes die at the same time. Job objects have a mode of operation
-    //! where when all handles to the object are closed it causes all child
-    //! processes associated with the object to be terminated immediately.
-    //! Conveniently whenever a process in the job object spawns a new process the
-    //! child will be associated with the job object as well. This means if we add
-    //! ourselves to the job object we create then everything will get torn down!
-    //!
-    //! Unfortunately most of the time the build system is actually called from a
-    //! python wrapper (which manages things like building the build system) so this
-    //! all doesn't quite cut it so far. To go the last mile we duplicate the job
-    //! object handle into our parent process (a python process probably) and then
-    //! close our own handle. This means that the only handle to the job object
-    //! resides in the parent python process, so when python dies the whole build
-    //! system dies (as one would probably expect!).
-    //!
-    //! Note that this module has a #[cfg(windows)] above it as none of this logic
-    //! is required on Unix.
-
     use crate::Build;
     use std::env;
     use std::ffi::c_void;
diff --git a/src/bootstrap/src/utils/render_tests.rs b/src/bootstrap/src/utils/render_tests.rs
index 16e0c2ac185..5c9918bce32 100644
--- a/src/bootstrap/src/utils/render_tests.rs
+++ b/src/bootstrap/src/utils/render_tests.rs
@@ -215,8 +215,8 @@ impl<'a> Renderer<'a> {
             for bench in &self.benches {
                 rows.push((
                     &bench.name,
-                    format!("{:.2?}/iter", Duration::from_nanos(bench.median)),
-                    format!("+/- {:.2?}", Duration::from_nanos(bench.deviation)),
+                    format!("{:.2?}/iter", bench.median),
+                    format!("+/- {:.2?}", bench.deviation),
                 ));
             }
 
@@ -239,7 +239,7 @@ impl<'a> Renderer<'a> {
             suite.filtered_out,
             time = match suite.exec_time {
                 Some(t) => format!("; finished in {:.2?}", Duration::from_secs_f64(t)),
-                None => format!(""),
+                None => String::new(),
             }
         );
     }
@@ -394,8 +394,8 @@ enum TestMessage {
 #[derive(serde_derive::Deserialize)]
 struct BenchOutcome {
     name: String,
-    median: u64,
-    deviation: u64,
+    median: f64,
+    deviation: f64,
 }
 
 #[derive(serde_derive::Deserialize)]
diff --git a/src/bootstrap/src/utils/tarball.rs b/src/bootstrap/src/utils/tarball.rs
index cc86e3bab0c..57cdf7473a1 100644
--- a/src/bootstrap/src/utils/tarball.rs
+++ b/src/bootstrap/src/utils/tarball.rs
@@ -13,18 +13,18 @@ use std::{
 use crate::core::builder::Builder;
 use crate::core::{build_steps::dist::distdir, builder::Kind};
 use crate::utils::channel;
-use crate::utils::helpers::t;
+use crate::utils::helpers::{move_file, t};
 
 #[derive(Copy, Clone)]
 pub(crate) enum OverlayKind {
     Rust,
-    LLVM,
+    Llvm,
     Cargo,
     Clippy,
     Miri,
     Rustfmt,
     RustDemangler,
-    RLS,
+    Rls,
     RustAnalyzer,
     RustcCodegenCranelift,
     LlvmBitcodeLinker,
@@ -34,7 +34,7 @@ impl OverlayKind {
     fn legal_and_readme(&self) -> &[&str] {
         match self {
             OverlayKind::Rust => &["COPYRIGHT", "LICENSE-APACHE", "LICENSE-MIT", "README.md"],
-            OverlayKind::LLVM => {
+            OverlayKind::Llvm => {
                 &["src/llvm-project/llvm/LICENSE.TXT", "src/llvm-project/llvm/README.txt"]
             }
             OverlayKind::Cargo => &[
@@ -61,7 +61,7 @@ impl OverlayKind {
             OverlayKind::RustDemangler => {
                 &["src/tools/rust-demangler/README.md", "LICENSE-APACHE", "LICENSE-MIT"]
             }
-            OverlayKind::RLS => &["src/tools/rls/README.md", "LICENSE-APACHE", "LICENSE-MIT"],
+            OverlayKind::Rls => &["src/tools/rls/README.md", "LICENSE-APACHE", "LICENSE-MIT"],
             OverlayKind::RustAnalyzer => &[
                 "src/tools/rust-analyzer/README.md",
                 "src/tools/rust-analyzer/LICENSE-APACHE",
@@ -84,7 +84,7 @@ impl OverlayKind {
     fn version(&self, builder: &Builder<'_>) -> String {
         match self {
             OverlayKind::Rust => builder.rust_version(),
-            OverlayKind::LLVM => builder.rust_version(),
+            OverlayKind::Llvm => builder.rust_version(),
             OverlayKind::RustDemangler => builder.release_num("rust-demangler"),
             OverlayKind::Cargo => {
                 builder.cargo_info.version(builder, &builder.release_num("cargo"))
@@ -96,7 +96,7 @@ impl OverlayKind {
             OverlayKind::Rustfmt => {
                 builder.rustfmt_info.version(builder, &builder.release_num("rustfmt"))
             }
-            OverlayKind::RLS => builder.release(&builder.release_num("rls")),
+            OverlayKind::Rls => builder.release(&builder.release_num("rls")),
             OverlayKind::RustAnalyzer => builder
                 .rust_analyzer_info
                 .version(builder, &builder.release_num("rust-analyzer/crates/rust-analyzer")),
@@ -284,7 +284,7 @@ impl<'a> Tarball<'a> {
         // name, not "image". We rename the image directory just before passing
         // into rust-installer.
         let dest = self.temp_dir.join(self.package_name());
-        t!(std::fs::rename(&self.image_dir, &dest));
+        t!(move_file(&self.image_dir, &dest));
 
         self.run(|this, cmd| {
             let distdir = distdir(this.builder);
@@ -357,7 +357,7 @@ impl<'a> Tarball<'a> {
             &self.builder.config.dist_compression_profile
         };
 
-        cmd.args(&["--compression-profile", compression_profile]);
+        cmd.args(["--compression-profile", compression_profile]);
         self.builder.run(&mut cmd);
 
         // Ensure there are no symbolic links in the tarball. In particular,