diff --git a/src/bootstrap/src/core/build_steps/dist.rs b/src/bootstrap/src/core/build_steps/dist.rs index 222b982073280..360b8418d2194 100644 --- a/src/bootstrap/src/core/build_steps/dist.rs +++ b/src/bootstrap/src/core/build_steps/dist.rs @@ -27,7 +27,7 @@ use crate::core::build_steps::gcc::GccTargetPair; use crate::core::build_steps::tool::{ self, RustcPrivateCompilers, 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::{GccCiMode, TargetSelection}; @@ -1211,6 +1211,19 @@ impl Step for Src { &dst_src, ); + // Vendor all Cargo dependencies + let vendor = builder.ensure(Vendor { + sync_args: vec![], + versioned_dirs: true, + root_dir: dst_src.clone(), + output_dir: None, + only_library_workspace: true, + }); + + let library_cargo_config_dir = dst_src.join("library").join(".cargo"); + builder.create_dir(&library_cargo_config_dir); + builder.create(&library_cargo_config_dir.join("config.toml"), &vendor.config_library); + tarball.generate() } @@ -1376,12 +1389,17 @@ fn prepare_source_tarball<'a>( sync_args: pkgs_for_pgo_training.collect(), versioned_dirs: true, root_dir: plain_dst_src.into(), - output_dir: VENDOR_DIR.into(), + output_dir: None, + only_library_workspace: false, }); 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); + + let library_cargo_config_dir = plain_dst_src.join("library").join(".cargo"); + builder.create_dir(&library_cargo_config_dir); + builder.create(&library_cargo_config_dir.join("config.toml"), &vendor.config_library); } // Delete extraneous directories diff --git a/src/bootstrap/src/core/build_steps/run.rs b/src/bootstrap/src/core/build_steps/run.rs index 897e03ce71813..2329bb93b4d3d 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}; @@ -275,9 +275,10 @@ 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()), + only_library_workspace: false, }); - 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 36a740c6f35fc..246598550553a 100644 --- a/src/bootstrap/src/core/build_steps/vendor.rs +++ b/src/bootstrap/src/core/build_steps/vendor.rs @@ -46,9 +46,15 @@ pub(crate) struct Vendor { /// Determines whether vendored dependencies use versioned directories. pub(crate) versioned_dirs: bool, /// The root directory of the source code. + /// + /// Vendored dependencies will be stored in /vendor and + /// /library/vendor unless overridden by `output_dir`. pub(crate) root_dir: PathBuf, - /// The target directory for storing vendored dependencies. - pub(crate) output_dir: PathBuf, + /// The root directory for storing vendored dependencies in /vendor + /// and /library/vendor. + pub(crate) output_dir: Option, + /// Only vendor crates necessary by the library workspace. + pub(crate) only_library_workspace: bool, } impl Step for Vendor { @@ -68,7 +74,8 @@ 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, + only_library_workspace: false, }); } @@ -79,29 +86,53 @@ impl Step for Vendor { fn run(self, builder: &Builder<'_>) -> Self::Output { let _guard = builder.group(&format!("Vendoring sources to {:?}", self.root_dir)); - let mut cmd = command(&builder.initial_cargo); - cmd.arg("vendor"); + let config = if self.only_library_workspace { + String::new() + } else { + let mut cmd = command(&builder.initial_cargo); + cmd.arg("vendor"); - if self.versioned_dirs { - cmd.arg("--versioned-dirs"); - } + if self.versioned_dirs { + cmd.arg("--versioned-dirs"); + } - let to_vendor = default_paths_to_vendor(builder); - // These submodules must be present for `x vendor` to work. - for (_, submodules) in &to_vendor { - for submodule in submodules { - builder.build.require_submodule(submodule, None); + let to_vendor = default_paths_to_vendor(builder); + // These submodules must be present for `x vendor` to work. + for (_, submodules) in &to_vendor { + for submodule in submodules { + builder.build.require_submodule(submodule, None); + } } - } - // Sync these paths by default. - for (p, _) in &to_vendor { - cmd.arg("--sync").arg(p); - } + // Sync these paths by default. + for (p, _) in &to_vendor { + cmd.arg("--sync").arg(p); + } - // Also sync explicitly requested paths. - for sync_arg in self.sync_args { - cmd.arg("--sync").arg(sync_arg); + // Also sync explicitly requested paths. + for sync_arg in self.sync_args { + cmd.arg("--sync").arg(sync_arg); + } + + // Will read the libstd Cargo.toml + // which uses the unstable `public-dependency` feature. + cmd.env("RUSTC_BOOTSTRAP", "1"); + cmd.env("RUSTC", &builder.initial_rustc); + + cmd.current_dir(&self.root_dir); + match &self.output_dir { + None => cmd.arg(VENDOR_DIR), + Some(output_dir) => cmd.arg(output_dir.join(VENDOR_DIR)), + }; + + cmd.run_capture_stdout(builder).stdout() + }; + + let mut cmd = command(&builder.initial_cargo); + cmd.arg("vendor"); + + if self.versioned_dirs { + cmd.arg("--versioned-dirs"); } // Will read the libstd Cargo.toml @@ -109,10 +140,15 @@ 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.join("library")); + match &self.output_dir { + None => cmd.arg(VENDOR_DIR), + Some(output_dir) => cmd.arg(output_dir.join("library").join(VENDOR_DIR)), + }; + + let config_library = cmd.run_capture_stdout(builder).stdout(); - let config = cmd.run_capture_stdout(builder); - VendorOutput { config: config.stdout() } + VendorOutput { config, config_library } } } @@ -120,4 +156,5 @@ impl Step for Vendor { #[derive(Debug, Clone)] pub(crate) struct VendorOutput { pub(crate) config: String, + pub(crate) config_library: String, }