From 7f915dd75c271ba1d78c15effbe1b444b5b57dd5 Mon Sep 17 00:00:00 2001 From: "Yuriy A. Dyagterev" Date: Tue, 30 Jun 2026 20:10:19 +0300 Subject: [PATCH] feat: write (or overwrite) .cargo/config.toml in x.py vendor Initially, this patch was proposed in rust-lang/rust#144124. --- src/bootstrap/src/core/build_steps/dist.rs | 10 ++----- src/bootstrap/src/core/build_steps/run.rs | 6 ++-- src/bootstrap/src/core/build_steps/vendor.rs | 30 +++++++++++--------- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/bootstrap/src/core/build_steps/dist.rs b/src/bootstrap/src/core/build_steps/dist.rs index 6121ecf513910..23269fe3565e2 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, 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; @@ -1328,16 +1328,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 1f6c2facc9c2a..81b00d10ff936 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}; @@ -271,9 +271,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 36a740c6f35fc..0648716c9320b 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 IS_HOST: bool = true; fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> { @@ -68,7 +68,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, }); } @@ -76,7 +76,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); @@ -109,15 +109,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()); + } }