diff --git a/src/bootstrap/src/core/build_steps/dist.rs b/src/bootstrap/src/core/build_steps/dist.rs index 411d42962644d..021445fbc032c 100644 --- a/src/bootstrap/src/core/build_steps/dist.rs +++ b/src/bootstrap/src/core/build_steps/dist.rs @@ -24,7 +24,7 @@ use crate::core::build_steps::doc::DocumentationFormat; use crate::core::build_steps::tool::{ self, RustcPrivateCompilers, Tool, ToolTargetBuildMode, get_tool_target_compiler, }; -use crate::core::build_steps::vendor::{VENDOR_DIR, Vendor}; +use crate::core::build_steps::vendor::Vendor; use crate::core::build_steps::{compile, llvm}; use crate::core::builder::{Builder, Kind, RunConfig, ShouldRun, Step, StepMetadata}; use crate::core::config::TargetSelection; @@ -1271,16 +1271,12 @@ impl Step for PlainSourceTarball { }); // Vendor all Cargo dependencies - let vendor = builder.ensure(Vendor { + builder.ensure(Vendor { sync_args: pkgs_for_pgo_training.collect(), versioned_dirs: true, root_dir: plain_dst_src.into(), - output_dir: VENDOR_DIR.into(), + output_dir: None, }); - - let cargo_config_dir = plain_dst_src.join(".cargo"); - builder.create_dir(&cargo_config_dir); - builder.create(&cargo_config_dir.join("config.toml"), &vendor.config); } // Delete extraneous directories diff --git a/src/bootstrap/src/core/build_steps/run.rs b/src/bootstrap/src/core/build_steps/run.rs index 6ab99ae799d70..70ebbb81d73de 100644 --- a/src/bootstrap/src/core/build_steps/run.rs +++ b/src/bootstrap/src/core/build_steps/run.rs @@ -12,7 +12,7 @@ use clap_complete::{Generator, shells}; use crate::core::build_steps::dist::distdir; use crate::core::build_steps::test; use crate::core::build_steps::tool::{self, RustcPrivateCompilers, SourceType, Tool}; -use crate::core::build_steps::vendor::{Vendor, default_paths_to_vendor}; +use crate::core::build_steps::vendor::{VENDOR_DIR, Vendor, default_paths_to_vendor}; use crate::core::builder::{Builder, Kind, RunConfig, ShouldRun, Step, StepMetadata}; use crate::core::config::TargetSelection; use crate::core::config::flags::{get_completion, top_level_help}; @@ -269,9 +269,9 @@ impl Step for GenerateCopyright { sync_args: Vec::new(), versioned_dirs: true, root_dir: builder.src.clone(), - output_dir: cache_dir.clone(), + output_dir: Some(cache_dir.clone()), }); - cache_dir + cache_dir.join(VENDOR_DIR) }; let _guard = builder.group("generate-copyright"); diff --git a/src/bootstrap/src/core/build_steps/vendor.rs b/src/bootstrap/src/core/build_steps/vendor.rs index 72250a26f376e..74f431a43f97d 100644 --- a/src/bootstrap/src/core/build_steps/vendor.rs +++ b/src/bootstrap/src/core/build_steps/vendor.rs @@ -47,12 +47,12 @@ pub(crate) struct Vendor { pub(crate) versioned_dirs: bool, /// The root directory of the source code. pub(crate) root_dir: PathBuf, - /// The target directory for storing vendored dependencies. - pub(crate) output_dir: PathBuf, + /// The target directory for storing vendored dependencies if different from root_dir. + pub(crate) output_dir: Option, } impl Step for Vendor { - type Output = VendorOutput; + type Output = (); const DEFAULT: bool = true; const IS_HOST: bool = true; @@ -65,7 +65,7 @@ impl Step for Vendor { sync_args: run.builder.config.cmd.vendor_sync_args(), versioned_dirs: run.builder.config.cmd.vendor_versioned_dirs(), root_dir: run.builder.src.clone(), - output_dir: run.builder.src.join(VENDOR_DIR), + output_dir: None, }); } @@ -73,7 +73,7 @@ impl Step for Vendor { /// /// This function runs `cargo vendor` and ensures all required submodules /// are initialized before vendoring begins. - fn run(self, builder: &Builder<'_>) -> Self::Output { + fn run(self, builder: &Builder<'_>) { let _guard = builder.group(&format!("Vendoring sources to {:?}", self.root_dir)); let mut cmd = command(&builder.initial_cargo); @@ -106,15 +106,19 @@ impl Step for Vendor { cmd.env("RUSTC_BOOTSTRAP", "1"); cmd.env("RUSTC", &builder.initial_rustc); - cmd.current_dir(self.root_dir).arg(&self.output_dir); + cmd.current_dir(&self.root_dir).arg(if let Some(output_dir) = &self.output_dir { + output_dir.join(VENDOR_DIR) + } else { + // Make sure to use a relative path here to ensure dist tarballs + // can be unpacked to a different drectory. + VENDOR_DIR.into() + }); let config = cmd.run_capture_stdout(builder); - VendorOutput { config: config.stdout() } - } -} -/// Stores the result of the vendoring step. -#[derive(Debug, Clone)] -pub(crate) struct VendorOutput { - pub(crate) config: String, + // Write .cargo/config.toml + let cargo_config_dir = self.output_dir.unwrap_or(self.root_dir).join(".cargo"); + builder.create_dir(&cargo_config_dir); + builder.create(&cargo_config_dir.join("config.toml"), &config.stdout()); + } }