Skip to content

Commit

Permalink
bootstrap: convert rust to use Tarball
Browse files Browse the repository at this point in the history
  • Loading branch information
pietroalbini committed Dec 23, 2020
1 parent 1906c42 commit 48924ab
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 63 deletions.
43 changes: 5 additions & 38 deletions src/bootstrap/dist.rs
Expand Up @@ -1314,21 +1314,7 @@ impl Step for Extended {
let std_installer =
builder.ensure(Std { compiler: builder.compiler(stage, target), target });

let tmp = tmpdir(builder);
let overlay = tmp.join("extended-overlay");
let etc = builder.src.join("src/etc/installer");
let work = tmp.join("work");

let _ = fs::remove_dir_all(&overlay);
builder.install(&builder.src.join("COPYRIGHT"), &overlay, 0o644);
builder.install(&builder.src.join("LICENSE-APACHE"), &overlay, 0o644);
builder.install(&builder.src.join("LICENSE-MIT"), &overlay, 0o644);
let version = builder.rust_version();
builder.create(&overlay.join("version"), &version);
if let Some(sha) = builder.rust_sha() {
builder.create(&overlay.join("git-commit-hash"), &sha);
}
builder.install(&etc.join("README.md"), &overlay, 0o644);

// When rust-std package split from rustc, we needed to ensure that during
// upgrades rustc was upgraded before rust-std. To avoid rustc clobbering
Expand All @@ -1353,31 +1339,12 @@ impl Step for Extended {
if target.contains("pc-windows-gnu") {
tarballs.push(mingw_installer.unwrap());
}
let mut input_tarballs = tarballs[0].as_os_str().to_owned();
for tarball in &tarballs[1..] {
input_tarballs.push(",");
input_tarballs.push(tarball);
}

builder.info("building combined installer");
let mut cmd = rust_installer(builder);
cmd.arg("combine")
.arg("--product-name=Rust")
.arg("--rel-manifest-dir=rustlib")
.arg("--success-message=Rust-is-ready-to-roll.")
.arg("--work-dir")
.arg(&work)
.arg("--output-dir")
.arg(&distdir(builder))
.arg(format!("--package-name={}-{}", pkgname(builder, "rust"), target.triple))
.arg("--legacy-manifest-dirs=rustlib,cargo")
.arg("--input-tarballs")
.arg(input_tarballs)
.arg("--non-installed-overlay")
.arg(&overlay);
let time = timeit(&builder);
builder.run(&mut cmd);
drop(time);
let mut tarball = Tarball::new(builder, "rust", &target.triple);
let work = tarball.persist_work_dir();
tarball.combine(&tarballs);

let tmp = tmpdir(builder).join("combined-tarball");

let mut license = String::new();
license += &builder.read(&builder.src.join("COPYRIGHT"));
Expand Down
85 changes: 60 additions & 25 deletions src/bootstrap/tarball.rs
@@ -1,4 +1,7 @@
use std::path::{Path, PathBuf};
use std::{
path::{Path, PathBuf},
process::Command,
};

use build_helper::t;

Expand Down Expand Up @@ -95,6 +98,7 @@ pub(crate) struct Tarball<'a> {

include_target_in_component_name: bool,
is_preview: bool,
delete_temp_dir: bool,
}

impl<'a> Tarball<'a> {
Expand Down Expand Up @@ -132,6 +136,7 @@ impl<'a> Tarball<'a> {

include_target_in_component_name: false,
is_preview: false,
delete_temp_dir: true,
}
}

Expand Down Expand Up @@ -193,7 +198,53 @@ impl<'a> Tarball<'a> {
self.builder.cp_r(src.as_ref(), &dest);
}

pub(crate) fn persist_work_dir(&mut self) -> PathBuf {
self.delete_temp_dir = false;
self.work_dir.clone()
}

pub(crate) fn generate(self) -> PathBuf {
let mut component_name = self.component.clone();
if self.is_preview {
component_name.push_str("-preview");
}
if self.include_target_in_component_name {
component_name.push('-');
component_name.push_str(
&self
.target
.as_ref()
.expect("include_target_in_component_name used in a targetless tarball"),
);
}

self.run(|this, cmd| {
cmd.arg("generate")
.arg("--image-dir")
.arg(&this.image_dir)
.arg("--non-installed-overlay")
.arg(&this.overlay_dir)
.arg(format!("--component-name={}", &component_name));
})
}

pub(crate) fn combine(self, tarballs: &[PathBuf]) {
let mut input_tarballs = tarballs[0].as_os_str().to_os_string();
for tarball in &tarballs[1..] {
input_tarballs.push(",");
input_tarballs.push(tarball);
}

self.run(|this, cmd| {
cmd.arg("combine")
.arg("--input-tarballs")
.arg(input_tarballs)
.arg("--non-installed-overlay")
.arg(&this.overlay_dir);
});
}

fn run(self, build_cli: impl FnOnce(&Tarball<'a>, &mut Command)) -> PathBuf {
t!(std::fs::create_dir_all(&self.overlay_dir));
self.builder.create(&self.overlay_dir.join("version"), &self.overlay.version(self.builder));
if let Some(sha) = self.builder.rust_sha() {
Expand All @@ -215,37 +266,21 @@ impl<'a> Tarball<'a> {

let _time = crate::util::timeit(self.builder);

let mut component_name = self.component.clone();
if self.is_preview {
component_name.push_str("-preview");
}
if self.include_target_in_component_name {
component_name.push('-');
component_name.push_str(
&self
.target
.expect("include_target_in_component_name used in a targetless tarball"),
);
}

let distdir = crate::dist::distdir(self.builder);
cmd.arg("generate")
build_cli(&self, &mut cmd);
cmd.arg("--rel-manifest-dir=rustlib")
.arg("--legacy-manifest-dirs=rustlib,cargo")
.arg(format!("--product-name={}", self.product_name))
.arg("--rel-manifest-dir=rustlib")
.arg(format!("--success-message={} installed.", self.component))
.arg("--image-dir")
.arg(self.image_dir)
.arg(format!("--package-name={}", package_name))
.arg("--work-dir")
.arg(self.work_dir)
.arg("--output-dir")
.arg(&distdir)
.arg("--non-installed-overlay")
.arg(self.overlay_dir)
.arg(format!("--package-name={}", package_name))
.arg("--legacy-manifest-dirs=rustlib,cargo")
.arg(format!("--component-name={}", component_name));
.arg(&distdir);
self.builder.run(&mut cmd);
t!(std::fs::remove_dir_all(&self.temp_dir));
if self.delete_temp_dir {
t!(std::fs::remove_dir_all(&self.temp_dir));
}

distdir.join(format!("{}.tar.gz", package_name))
}
Expand Down

0 comments on commit 48924ab

Please sign in to comment.