Skip to content

Commit

Permalink
Auto merge of rust-lang#109448 - ozkanonur:download-beta-compiler-too…
Browse files Browse the repository at this point in the history
…lchain, r=Mark-Simulacrum

Download beta compiler toolchain in bootstrap if it doesn't yet exist

Blocker for rust-lang#107812 and rust-lang#99989

See: rust-lang#107812 (comment)

r? `@jyn514`
  • Loading branch information
bors committed Apr 7, 2023
2 parents 23ee2af + eeec732 commit ba86600
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 17 deletions.
21 changes: 15 additions & 6 deletions src/bootstrap/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -227,25 +227,34 @@ pub struct Config {
pub reuse: Option<PathBuf>,
pub cargo_native_static: bool,
pub configure_args: Vec<String>,
pub out: PathBuf,
pub rust_info: channel::GitInfo,

// These are either the stage0 downloaded binaries or the locally installed ones.
pub initial_cargo: PathBuf,
pub initial_rustc: PathBuf,

#[cfg(not(test))]
initial_rustfmt: RefCell<RustfmtState>,
#[cfg(test)]
pub initial_rustfmt: RefCell<RustfmtState>,
pub out: PathBuf,
pub rust_info: channel::GitInfo,
}

#[derive(Default, Deserialize)]
#[cfg_attr(test, derive(Clone))]
pub struct Stage0Metadata {
pub compiler: CompilerMetadata,
pub config: Stage0Config,
pub checksums_sha256: HashMap<String, String>,
pub rustfmt: Option<RustfmtMetadata>,
}
#[derive(Default, Deserialize)]
#[cfg_attr(test, derive(Clone))]
pub struct CompilerMetadata {
pub date: String,
pub version: String,
}

#[derive(Default, Deserialize)]
#[cfg_attr(test, derive(Clone))]
pub struct Stage0Config {
Expand Down Expand Up @@ -1000,10 +1009,10 @@ impl Config {
config.out = crate::util::absolute(&config.out);
}

config.initial_rustc = build
.rustc
.map(PathBuf::from)
.unwrap_or_else(|| config.out.join(config.build.triple).join("stage0/bin/rustc"));
config.initial_rustc = build.rustc.map(PathBuf::from).unwrap_or_else(|| {
config.download_beta_toolchain();
config.out.join(config.build.triple).join("stage0/bin/rustc")
});
config.initial_cargo = build
.cargo
.map(PathBuf::from)
Expand Down
64 changes: 54 additions & 10 deletions src/bootstrap/download.rs
Original file line number Diff line number Diff line change
Expand Up @@ -367,26 +367,70 @@ impl Config {

pub(crate) fn download_ci_rustc(&self, commit: &str) {
self.verbose(&format!("using downloaded stage2 artifacts from CI (commit {commit})"));

let version = self.artifact_version_part(commit);
// download-rustc doesn't need its own cargo, it can just use beta's. But it does need the
// `rustc_private` crates for tools.
let extra_components = ["rustc-dev"];

self.download_toolchain(
&version,
"ci-rustc",
commit,
&extra_components,
Self::download_ci_component,
);
}

pub(crate) fn download_beta_toolchain(&self) {
self.verbose(&format!("downloading stage0 beta artifacts"));

let date = &self.stage0_metadata.compiler.date;
let version = &self.stage0_metadata.compiler.version;
let extra_components = ["cargo"];

let download_beta_component = |config: &Config, filename, prefix: &_, date: &_| {
config.download_component(DownloadSource::Dist, filename, prefix, date, "stage0")
};

self.download_toolchain(
version,
"stage0",
date,
&extra_components,
download_beta_component,
);
}

fn download_toolchain(
&self,
// FIXME(ozkanonur) use CompilerMetadata instead of `version: &str`
version: &str,
sysroot: &str,
stamp_key: &str,
extra_components: &[&str],
download_component: fn(&Config, String, &str, &str),
) {
let host = self.build.triple;
let bin_root = self.out.join(host).join("ci-rustc");
let bin_root = self.out.join(host).join(sysroot);
let rustc_stamp = bin_root.join(".rustc-stamp");

if !bin_root.join("bin").join("rustc").exists() || program_out_of_date(&rustc_stamp, commit)
if !bin_root.join("bin").join(exe("rustc", self.build)).exists()
|| program_out_of_date(&rustc_stamp, stamp_key)
{
if bin_root.exists() {
t!(fs::remove_dir_all(&bin_root));
}
let filename = format!("rust-std-{version}-{host}.tar.xz");
let pattern = format!("rust-std-{host}");
self.download_ci_component(filename, &pattern, commit);
download_component(self, filename, &pattern, stamp_key);
let filename = format!("rustc-{version}-{host}.tar.xz");
self.download_ci_component(filename, "rustc", commit);
// download-rustc doesn't need its own cargo, it can just use beta's.
let filename = format!("rustc-dev-{version}-{host}.tar.xz");
self.download_ci_component(filename, "rustc-dev", commit);
let filename = format!("rust-src-{version}.tar.xz");
self.download_ci_component(filename, "rust-src", commit);
download_component(self, filename, "rustc", stamp_key);

for component in extra_components {
let filename = format!("{component}-{version}-{host}.tar.xz");
download_component(self, filename, component, stamp_key);
}

if self.should_fix_bins_and_dylibs() {
self.fix_bin_or_dylib(&bin_root.join("bin").join("rustc"));
Expand All @@ -403,7 +447,7 @@ impl Config {
}
}

t!(fs::write(rustc_stamp, commit));
t!(fs::write(rustc_stamp, stamp_key));
}
}

Expand Down
2 changes: 1 addition & 1 deletion src/bootstrap/test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1133,7 +1133,7 @@ impl Step for Tidy {
if builder.config.channel == "dev" || builder.config.channel == "nightly" {
builder.info("fmt check");
if builder.initial_rustfmt().is_none() {
let inferred_rustfmt_dir = builder.config.initial_rustc.parent().unwrap();
let inferred_rustfmt_dir = builder.initial_rustc.parent().unwrap();
eprintln!(
"\
error: no `rustfmt` binary found in {PATH}
Expand Down

0 comments on commit ba86600

Please sign in to comment.