From 3b26b917f0f67aff64d867da70671e41e23704fb Mon Sep 17 00:00:00 2001 From: bjorn3 Date: Thu, 3 Mar 2022 18:15:01 +0100 Subject: [PATCH] Merge build_helper into util --- src/bootstrap/build_helper.rs | 145 --------------------------------- src/bootstrap/builder.rs | 3 +- src/bootstrap/cc_detect.rs | 2 +- src/bootstrap/channel.rs | 2 +- src/bootstrap/clean.rs | 2 +- src/bootstrap/compile.rs | 3 +- src/bootstrap/config.rs | 3 +- src/bootstrap/dist.rs | 3 +- src/bootstrap/doc.rs | 3 +- src/bootstrap/flags.rs | 2 +- src/bootstrap/format.rs | 2 +- src/bootstrap/install.rs | 2 +- src/bootstrap/lib.rs | 6 +- src/bootstrap/metadata.rs | 2 +- src/bootstrap/native.rs | 4 +- src/bootstrap/run.rs | 2 +- src/bootstrap/sanity.rs | 2 +- src/bootstrap/tarball.rs | 2 +- src/bootstrap/test.rs | 7 +- src/bootstrap/tool.rs | 3 +- src/bootstrap/toolstate.rs | 2 +- src/bootstrap/util.rs | 146 +++++++++++++++++++++++++++++++++- 22 files changed, 166 insertions(+), 182 deletions(-) delete mode 100644 src/bootstrap/build_helper.rs diff --git a/src/bootstrap/build_helper.rs b/src/bootstrap/build_helper.rs deleted file mode 100644 index 320099102fc38..0000000000000 --- a/src/bootstrap/build_helper.rs +++ /dev/null @@ -1,145 +0,0 @@ -use std::fs; -use std::path::{Path, PathBuf}; -use std::process::{Command, Stdio}; -use std::time::{SystemTime, UNIX_EPOCH}; - -/// A helper macro to `unwrap` a result except also print out details like: -/// -/// * The file/line of the panic -/// * The expression that failed -/// * The error itself -/// -/// This is currently used judiciously throughout the build system rather than -/// using a `Result` with `try!`, but this may change one day... -macro_rules! t { - ($e:expr) => { - match $e { - Ok(e) => e, - Err(e) => panic!("{} failed with {}", stringify!($e), e), - } - }; - // it can show extra info in the second parameter - ($e:expr, $extra:expr) => { - match $e { - Ok(e) => e, - Err(e) => panic!("{} failed with {} ({:?})", stringify!($e), e, $extra), - } - }; -} -pub(crate) use t; - -pub fn run(cmd: &mut Command, print_cmd_on_fail: bool) { - if !try_run(cmd, print_cmd_on_fail) { - std::process::exit(1); - } -} - -pub fn try_run(cmd: &mut Command, print_cmd_on_fail: bool) -> bool { - let status = match cmd.status() { - Ok(status) => status, - Err(e) => fail(&format!("failed to execute command: {:?}\nerror: {}", cmd, e)), - }; - if !status.success() && print_cmd_on_fail { - println!( - "\n\ncommand did not execute successfully: {:?}\n\ - expected success, got: {}\n\n", - cmd, status - ); - } - status.success() -} - -pub fn run_suppressed(cmd: &mut Command) { - if !try_run_suppressed(cmd) { - std::process::exit(1); - } -} - -pub fn try_run_suppressed(cmd: &mut Command) -> bool { - let output = match cmd.output() { - Ok(status) => status, - Err(e) => fail(&format!("failed to execute command: {:?}\nerror: {}", cmd, e)), - }; - if !output.status.success() { - println!( - "\n\ncommand did not execute successfully: {:?}\n\ - expected success, got: {}\n\n\ - stdout ----\n{}\n\ - stderr ----\n{}\n\n", - cmd, - output.status, - String::from_utf8_lossy(&output.stdout), - String::from_utf8_lossy(&output.stderr) - ); - } - output.status.success() -} - -pub fn make(host: &str) -> PathBuf { - if host.contains("dragonfly") - || host.contains("freebsd") - || host.contains("netbsd") - || host.contains("openbsd") - { - PathBuf::from("gmake") - } else { - PathBuf::from("make") - } -} - -#[track_caller] -pub fn output(cmd: &mut Command) -> String { - let output = match cmd.stderr(Stdio::inherit()).output() { - Ok(status) => status, - Err(e) => fail(&format!("failed to execute command: {:?}\nerror: {}", cmd, e)), - }; - if !output.status.success() { - panic!( - "command did not execute successfully: {:?}\n\ - expected success, got: {}", - cmd, output.status - ); - } - String::from_utf8(output.stdout).unwrap() -} - -/// Returns the last-modified time for `path`, or zero if it doesn't exist. -pub fn mtime(path: &Path) -> SystemTime { - fs::metadata(path).and_then(|f| f.modified()).unwrap_or(UNIX_EPOCH) -} - -/// Returns `true` if `dst` is up to date given that the file or files in `src` -/// are used to generate it. -/// -/// Uses last-modified time checks to verify this. -pub fn up_to_date(src: &Path, dst: &Path) -> bool { - if !dst.exists() { - return false; - } - let threshold = mtime(dst); - let meta = match fs::metadata(src) { - Ok(meta) => meta, - Err(e) => panic!("source {:?} failed to get metadata: {}", src, e), - }; - if meta.is_dir() { - dir_up_to_date(src, threshold) - } else { - meta.modified().unwrap_or(UNIX_EPOCH) <= threshold - } -} - -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()); - if meta.is_dir() { - dir_up_to_date(&e.path(), threshold) - } else { - meta.modified().unwrap_or(UNIX_EPOCH) < threshold - } - }) -} - -fn fail(s: &str) -> ! { - println!("\n\n{}\n\n", s); - std::process::exit(1); -} diff --git a/src/bootstrap/builder.rs b/src/bootstrap/builder.rs index 9ea1f1950751b..4c49ed2d6a297 100644 --- a/src/bootstrap/builder.rs +++ b/src/bootstrap/builder.rs @@ -11,7 +11,6 @@ use std::path::{Component, Path, PathBuf}; use std::process::Command; use std::time::{Duration, Instant}; -use crate::build_helper::{output, t}; use crate::cache::{Cache, Interned, INTERNER}; use crate::check; use crate::compile; @@ -24,7 +23,7 @@ use crate::native; use crate::run; use crate::test; use crate::tool::{self, SourceType}; -use crate::util::{self, add_dylib_path, add_link_lib_path, exe, libdir}; +use crate::util::{self, add_dylib_path, add_link_lib_path, exe, libdir, output, t}; use crate::{Build, CLang, DocTests, GitRepo, Mode}; pub use crate::Compiler; diff --git a/src/bootstrap/cc_detect.rs b/src/bootstrap/cc_detect.rs index 9b19e22e0d01e..7ce446876118a 100644 --- a/src/bootstrap/cc_detect.rs +++ b/src/bootstrap/cc_detect.rs @@ -26,8 +26,8 @@ use std::path::{Path, PathBuf}; use std::process::Command; use std::{env, iter}; -use crate::build_helper::output; use crate::config::{Target, TargetSelection}; +use crate::util::output; use crate::{Build, CLang, GitRepo}; // The `cc` crate doesn't provide a way to obtain a path to the detected archiver, diff --git a/src/bootstrap/channel.rs b/src/bootstrap/channel.rs index af5c2e1bcd616..1932a0017ee25 100644 --- a/src/bootstrap/channel.rs +++ b/src/bootstrap/channel.rs @@ -8,7 +8,7 @@ use std::path::Path; use std::process::Command; -use crate::build_helper::output; +use crate::util::output; use crate::Build; pub enum GitInfo { diff --git a/src/bootstrap/clean.rs b/src/bootstrap/clean.rs index 249ddf9c731ca..069f3d6acf158 100644 --- a/src/bootstrap/clean.rs +++ b/src/bootstrap/clean.rs @@ -9,7 +9,7 @@ use std::fs; use std::io::{self, ErrorKind}; use std::path::Path; -use crate::build_helper::t; +use crate::util::t; use crate::Build; pub fn clean(build: &Build, all: bool) { diff --git a/src/bootstrap/compile.rs b/src/bootstrap/compile.rs index b9a80ce2d11ec..9cfd9f92aa7cd 100644 --- a/src/bootstrap/compile.rs +++ b/src/bootstrap/compile.rs @@ -18,7 +18,6 @@ use std::str; use serde::Deserialize; -use crate::build_helper::{output, t, up_to_date}; use crate::builder::Cargo; use crate::builder::{Builder, Kind, RunConfig, ShouldRun, Step}; use crate::cache::{Interned, INTERNER}; @@ -26,7 +25,7 @@ use crate::config::{LlvmLibunwind, TargetSelection}; use crate::dist; use crate::native; use crate::tool::SourceType; -use crate::util::{exe, is_debug_info, is_dylib, symlink_dir}; +use crate::util::{exe, is_debug_info, is_dylib, output, symlink_dir, t, up_to_date}; use crate::LLVM_TOOLS; use crate::{CLang, Compiler, DependencyType, GitRepo, Mode}; diff --git a/src/bootstrap/config.rs b/src/bootstrap/config.rs index 39fae82128dd5..2053537bcd6a6 100644 --- a/src/bootstrap/config.rs +++ b/src/bootstrap/config.rs @@ -12,13 +12,12 @@ use std::fs; use std::path::{Path, PathBuf}; use std::str::FromStr; -use crate::build_helper::t; use crate::builder::TaskPath; use crate::cache::{Interned, INTERNER}; use crate::channel::GitInfo; pub use crate::flags::Subcommand; use crate::flags::{Color, Flags}; -use crate::util::exe; +use crate::util::{exe, t}; use serde::Deserialize; macro_rules! check_ci_llvm { diff --git a/src/bootstrap/dist.rs b/src/bootstrap/dist.rs index f6b7478208478..45c924ce93c55 100644 --- a/src/bootstrap/dist.rs +++ b/src/bootstrap/dist.rs @@ -14,14 +14,13 @@ use std::fs; use std::path::{Path, PathBuf}; use std::process::Command; -use crate::build_helper::{output, t}; use crate::builder::{Builder, Kind, RunConfig, ShouldRun, Step}; use crate::cache::{Interned, INTERNER}; use crate::compile; use crate::config::TargetSelection; use crate::tarball::{GeneratedTarball, OverlayKind, Tarball}; use crate::tool::{self, Tool}; -use crate::util::{exe, is_dylib, timeit}; +use crate::util::{exe, is_dylib, output, t, timeit}; use crate::{Compiler, DependencyType, Mode, LLVM_TOOLS}; pub fn pkgname(builder: &Builder<'_>, component: &str) -> String { diff --git a/src/bootstrap/doc.rs b/src/bootstrap/doc.rs index 710bf2493ec24..be55871b56a28 100644 --- a/src/bootstrap/doc.rs +++ b/src/bootstrap/doc.rs @@ -12,13 +12,12 @@ use std::fs; use std::io; use std::path::{Path, PathBuf}; -use crate::build_helper::{t, up_to_date}; use crate::builder::{Builder, Compiler, Kind, RunConfig, ShouldRun, Step}; use crate::cache::{Interned, INTERNER}; use crate::compile; use crate::config::{Config, TargetSelection}; use crate::tool::{self, prepare_tool_cargo, SourceType, Tool}; -use crate::util::symlink_dir; +use crate::util::{symlink_dir, t, up_to_date}; use crate::Mode; macro_rules! submodule_helper { diff --git a/src/bootstrap/flags.rs b/src/bootstrap/flags.rs index b1c245f23164b..f72af579d9ad4 100644 --- a/src/bootstrap/flags.rs +++ b/src/bootstrap/flags.rs @@ -9,10 +9,10 @@ use std::process; use getopts::Options; -use crate::build_helper::t; use crate::builder::Builder; use crate::config::{Config, TargetSelection}; use crate::setup::Profile; +use crate::util::t; use crate::{Build, DocTests}; pub enum Color { diff --git a/src/bootstrap/format.rs b/src/bootstrap/format.rs index 5774a8ecf0916..10b846e6db208 100644 --- a/src/bootstrap/format.rs +++ b/src/bootstrap/format.rs @@ -1,6 +1,6 @@ //! Runs rustfmt on the repository. -use crate::build_helper::{output, t}; +use crate::util::{output, t}; use crate::Build; use ignore::WalkBuilder; use std::collections::VecDeque; diff --git a/src/bootstrap/install.rs b/src/bootstrap/install.rs index 5aa634ea3a75f..27b9196d9868e 100644 --- a/src/bootstrap/install.rs +++ b/src/bootstrap/install.rs @@ -8,7 +8,7 @@ use std::fs; use std::path::{Component, PathBuf}; use std::process::Command; -use crate::build_helper::t; +use crate::util::t; use crate::dist::{self, sanitize_sh}; use crate::tarball::GeneratedTarball; diff --git a/src/bootstrap/lib.rs b/src/bootstrap/lib.rs index 624f560c1fa98..b58439bf71d2a 100644 --- a/src/bootstrap/lib.rs +++ b/src/bootstrap/lib.rs @@ -118,12 +118,12 @@ use std::os::windows::fs::symlink_file; use filetime::FileTime; -use crate::build_helper::{mtime, output, run, run_suppressed, t, try_run, try_run_suppressed}; use crate::builder::Kind; use crate::config::{LlvmLibunwind, TargetSelection}; -use crate::util::{exe, libdir, CiEnv}; +use crate::util::{ + exe, libdir, mtime, output, run, run_suppressed, t, try_run, try_run_suppressed, CiEnv, +}; -mod build_helper; mod builder; mod cache; mod cc_detect; diff --git a/src/bootstrap/metadata.rs b/src/bootstrap/metadata.rs index 08e2b22fc1bdc..59dc50be47f06 100644 --- a/src/bootstrap/metadata.rs +++ b/src/bootstrap/metadata.rs @@ -3,8 +3,8 @@ use std::process::Command; use serde::Deserialize; -use crate::build_helper::output; use crate::cache::INTERNER; +use crate::util::output; use crate::{Build, Crate}; #[derive(Deserialize)] diff --git a/src/bootstrap/native.rs b/src/bootstrap/native.rs index 2d7c1ebed6da3..d27ad9644b56c 100644 --- a/src/bootstrap/native.rs +++ b/src/bootstrap/native.rs @@ -16,11 +16,9 @@ use std::io; use std::path::{Path, PathBuf}; use std::process::Command; -use crate::build_helper::up_to_date; -use crate::build_helper::{output, t}; use crate::builder::{Builder, RunConfig, ShouldRun, Step}; use crate::config::TargetSelection; -use crate::util::{self, exe}; +use crate::util::{self, exe, output, t, up_to_date}; use crate::{CLang, GitRepo}; pub struct Meta { diff --git a/src/bootstrap/run.rs b/src/bootstrap/run.rs index a9a784538b59a..25abe7a72fdc8 100644 --- a/src/bootstrap/run.rs +++ b/src/bootstrap/run.rs @@ -1,7 +1,7 @@ -use crate::build_helper::output; use crate::builder::{Builder, RunConfig, ShouldRun, Step}; use crate::dist::distdir; use crate::tool::Tool; +use crate::util::output; use std::process::Command; #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] diff --git a/src/bootstrap/sanity.rs b/src/bootstrap/sanity.rs index 36c9ba011c427..8c2899c1ac01e 100644 --- a/src/bootstrap/sanity.rs +++ b/src/bootstrap/sanity.rs @@ -15,9 +15,9 @@ use std::fs; use std::path::PathBuf; use std::process::Command; -use crate::build_helper::output; use crate::cache::INTERNER; use crate::config::Target; +use crate::util::output; use crate::Build; pub struct Finder { diff --git a/src/bootstrap/tarball.rs b/src/bootstrap/tarball.rs index 923522b90be04..c743c5188e754 100644 --- a/src/bootstrap/tarball.rs +++ b/src/bootstrap/tarball.rs @@ -3,8 +3,8 @@ use std::{ process::Command, }; -use crate::build_helper::t; use crate::builder::Builder; +use crate::util::t; #[derive(Copy, Clone)] pub(crate) enum OverlayKind { diff --git a/src/bootstrap/test.rs b/src/bootstrap/test.rs index 714a2df34a741..e4fcb287f1228 100644 --- a/src/bootstrap/test.rs +++ b/src/bootstrap/test.rs @@ -11,7 +11,6 @@ use std::iter; use std::path::{Path, PathBuf}; use std::process::{Command, Stdio}; -use crate::build_helper::{self, output, t}; use crate::builder::{Builder, Compiler, Kind, RunConfig, ShouldRun, Step}; use crate::cache::Interned; use crate::compile; @@ -21,7 +20,7 @@ use crate::flags::Subcommand; use crate::native; use crate::tool::{self, SourceType, Tool}; use crate::toolstate::ToolState; -use crate::util::{self, add_link_lib_path, dylib_path, dylib_path_var}; +use crate::util::{self, add_link_lib_path, dylib_path, dylib_path_var, output, t}; use crate::Crate as CargoCrate; use crate::{envify, CLang, DocTests, GitRepo, Mode}; @@ -2305,9 +2304,7 @@ impl Step for Distcheck { .current_dir(&dir), ); builder.run( - Command::new(build_helper::make(&builder.config.build.triple)) - .arg("check") - .current_dir(&dir), + Command::new(util::make(&builder.config.build.triple)).arg("check").current_dir(&dir), ); // Now make sure that rust-src has all of libstd's dependencies diff --git a/src/bootstrap/tool.rs b/src/bootstrap/tool.rs index da2fbe4ef655a..2ae4d830721e8 100644 --- a/src/bootstrap/tool.rs +++ b/src/bootstrap/tool.rs @@ -4,13 +4,12 @@ use std::fs; use std::path::{Path, PathBuf}; use std::process::{exit, Command}; -use crate::build_helper::t; use crate::builder::{Builder, Cargo as CargoCommand, RunConfig, ShouldRun, Step}; use crate::channel::GitInfo; use crate::compile; use crate::config::TargetSelection; use crate::toolstate::ToolState; -use crate::util::{add_dylib_path, exe}; +use crate::util::{add_dylib_path, exe, t}; use crate::Compiler; use crate::Mode; diff --git a/src/bootstrap/toolstate.rs b/src/bootstrap/toolstate.rs index bb6525d099bb2..cf4725253522d 100644 --- a/src/bootstrap/toolstate.rs +++ b/src/bootstrap/toolstate.rs @@ -1,5 +1,5 @@ -use crate::build_helper::t; use crate::builder::{Builder, RunConfig, ShouldRun, Step}; +use crate::util::t; use serde::{Deserialize, Serialize}; use std::collections::HashMap; use std::env; diff --git a/src/bootstrap/util.rs b/src/bootstrap/util.rs index 358bbd198106d..8e770d4d57fa6 100644 --- a/src/bootstrap/util.rs +++ b/src/bootstrap/util.rs @@ -7,14 +7,38 @@ use std::env; use std::fs; use std::io; use std::path::{Path, PathBuf}; -use std::process::Command; +use std::process::{Command, Stdio}; use std::str; -use std::time::Instant; +use std::time::{Instant, SystemTime, UNIX_EPOCH}; -use crate::build_helper::t; use crate::builder::Builder; use crate::config::{Config, TargetSelection}; +/// A helper macro to `unwrap` a result except also print out details like: +/// +/// * The file/line of the panic +/// * The expression that failed +/// * The error itself +/// +/// This is currently used judiciously throughout the build system rather than +/// using a `Result` with `try!`, but this may change one day... +macro_rules! t { + ($e:expr) => { + match $e { + Ok(e) => e, + Err(e) => panic!("{} failed with {}", stringify!($e), e), + } + }; + // it can show extra info in the second parameter + ($e:expr, $extra:expr) => { + match $e { + Ok(e) => e, + Err(e) => panic!("{} failed with {} ({:?})", stringify!($e), e, $extra), + } + }; +} +pub(crate) use t; + /// Given an executable called `name`, return the filename for the /// executable for a particular target. pub fn exe(name: &str, target: TargetSelection) -> String { @@ -300,3 +324,119 @@ pub fn is_valid_test_suite_arg<'a, P: AsRef>( _ => None, } } + +pub fn run(cmd: &mut Command, print_cmd_on_fail: bool) { + if !try_run(cmd, print_cmd_on_fail) { + std::process::exit(1); + } +} + +pub fn try_run(cmd: &mut Command, print_cmd_on_fail: bool) -> bool { + let status = match cmd.status() { + Ok(status) => status, + Err(e) => fail(&format!("failed to execute command: {:?}\nerror: {}", cmd, e)), + }; + if !status.success() && print_cmd_on_fail { + println!( + "\n\ncommand did not execute successfully: {:?}\n\ + expected success, got: {}\n\n", + cmd, status + ); + } + status.success() +} + +pub fn run_suppressed(cmd: &mut Command) { + if !try_run_suppressed(cmd) { + std::process::exit(1); + } +} + +pub fn try_run_suppressed(cmd: &mut Command) -> bool { + let output = match cmd.output() { + Ok(status) => status, + Err(e) => fail(&format!("failed to execute command: {:?}\nerror: {}", cmd, e)), + }; + if !output.status.success() { + println!( + "\n\ncommand did not execute successfully: {:?}\n\ + expected success, got: {}\n\n\ + stdout ----\n{}\n\ + stderr ----\n{}\n\n", + cmd, + output.status, + String::from_utf8_lossy(&output.stdout), + String::from_utf8_lossy(&output.stderr) + ); + } + output.status.success() +} + +pub fn make(host: &str) -> PathBuf { + if host.contains("dragonfly") + || host.contains("freebsd") + || host.contains("netbsd") + || host.contains("openbsd") + { + PathBuf::from("gmake") + } else { + PathBuf::from("make") + } +} + +#[track_caller] +pub fn output(cmd: &mut Command) -> String { + let output = match cmd.stderr(Stdio::inherit()).output() { + Ok(status) => status, + Err(e) => fail(&format!("failed to execute command: {:?}\nerror: {}", cmd, e)), + }; + if !output.status.success() { + panic!( + "command did not execute successfully: {:?}\n\ + expected success, got: {}", + cmd, output.status + ); + } + String::from_utf8(output.stdout).unwrap() +} + +/// Returns the last-modified time for `path`, or zero if it doesn't exist. +pub fn mtime(path: &Path) -> SystemTime { + fs::metadata(path).and_then(|f| f.modified()).unwrap_or(UNIX_EPOCH) +} + +/// Returns `true` if `dst` is up to date given that the file or files in `src` +/// are used to generate it. +/// +/// Uses last-modified time checks to verify this. +pub fn up_to_date(src: &Path, dst: &Path) -> bool { + if !dst.exists() { + return false; + } + let threshold = mtime(dst); + let meta = match fs::metadata(src) { + Ok(meta) => meta, + Err(e) => panic!("source {:?} failed to get metadata: {}", src, e), + }; + if meta.is_dir() { + dir_up_to_date(src, threshold) + } else { + meta.modified().unwrap_or(UNIX_EPOCH) <= threshold + } +} + +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()); + if meta.is_dir() { + dir_up_to_date(&e.path(), threshold) + } else { + meta.modified().unwrap_or(UNIX_EPOCH) < threshold + } + }) +} + +fn fail(s: &str) -> ! { + println!("\n\n{}\n\n", s); + std::process::exit(1); +}