bootstrap/core/build_steps/
vendor.rs
1use std::path::PathBuf;
6
7use crate::core::build_steps::tool::SUBMODULES_FOR_RUSTBOOK;
8use crate::core::builder::{Builder, RunConfig, ShouldRun, Step};
9use crate::utils::exec::command;
10
11pub const VENDOR_DIR: &str = "vendor";
13
14pub fn default_paths_to_vendor(builder: &Builder<'_>) -> Vec<(PathBuf, Vec<&'static str>)> {
20 [
21 ("src/tools/cargo/Cargo.toml", vec!["src/tools/cargo"]),
22 ("src/tools/rust-analyzer/Cargo.toml", vec![]),
23 ("compiler/rustc_codegen_cranelift/Cargo.toml", vec![]),
24 ("compiler/rustc_codegen_gcc/Cargo.toml", vec![]),
25 ("library/Cargo.toml", vec![]),
26 ("src/bootstrap/Cargo.toml", vec![]),
27 ("src/tools/rustbook/Cargo.toml", SUBMODULES_FOR_RUSTBOOK.into()),
28 ("src/tools/rustc-perf/Cargo.toml", vec!["src/tools/rustc-perf"]),
29 ("src/tools/opt-dist/Cargo.toml", vec![]),
30 ("src/doc/book/packages/trpl/Cargo.toml", vec![]),
31 ]
32 .into_iter()
33 .map(|(path, submodules)| (builder.src.join(path), submodules))
34 .collect()
35}
36
37#[derive(Debug, Clone, Hash, PartialEq, Eq)]
42pub(crate) struct Vendor {
43 pub(crate) sync_args: Vec<PathBuf>,
45 pub(crate) versioned_dirs: bool,
47 pub(crate) root_dir: PathBuf,
49 pub(crate) output_dir: PathBuf,
51}
52
53impl Step for Vendor {
54 type Output = VendorOutput;
55 const DEFAULT: bool = true;
56 const ONLY_HOSTS: bool = true;
57
58 fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> {
59 run.alias("placeholder").default_condition(true)
60 }
61
62 fn make_run(run: RunConfig<'_>) {
63 run.builder.ensure(Vendor {
64 sync_args: run.builder.config.cmd.vendor_sync_args(),
65 versioned_dirs: run.builder.config.cmd.vendor_versioned_dirs(),
66 root_dir: run.builder.src.clone(),
67 output_dir: run.builder.src.join(VENDOR_DIR),
68 });
69 }
70
71 fn run(self, builder: &Builder<'_>) -> Self::Output {
76 builder.info(&format!("Vendoring sources to {:?}", self.root_dir));
77
78 let mut cmd = command(&builder.initial_cargo);
79 cmd.arg("vendor");
80
81 if self.versioned_dirs {
82 cmd.arg("--versioned-dirs");
83 }
84
85 let to_vendor = default_paths_to_vendor(builder);
86 for (_, submodules) in &to_vendor {
88 for submodule in submodules {
89 builder.build.require_submodule(submodule, None);
90 }
91 }
92
93 for (p, _) in &to_vendor {
95 cmd.arg("--sync").arg(p);
96 }
97
98 for sync_arg in self.sync_args {
100 cmd.arg("--sync").arg(sync_arg);
101 }
102
103 cmd.env("RUSTC_BOOTSTRAP", "1");
106 cmd.env("RUSTC", &builder.initial_rustc);
107
108 cmd.current_dir(self.root_dir).arg(&self.output_dir);
109
110 let config = cmd.run_capture_stdout(builder);
111 VendorOutput { config: config.stdout() }
112 }
113}
114
115#[derive(Debug, Clone)]
117pub(crate) struct VendorOutput {
118 pub(crate) config: String,
119}