Skip to content

Commit ddf8263

Browse files
committed
bootstrap: convert build-manifest to use the new Tarball struct
1 parent 3ffea60 commit ddf8263

File tree

3 files changed

+146
-88
lines changed

3 files changed

+146
-88
lines changed

src/bootstrap/dist.rs

Lines changed: 21 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ use crate::builder::{Builder, RunConfig, ShouldRun, Step};
1919
use crate::cache::{Interned, INTERNER};
2020
use crate::compile;
2121
use crate::config::TargetSelection;
22+
use crate::tarball::{OverlayKind, Tarball};
2223
use crate::tool::{self, Tool};
2324
use crate::util::{exe, is_dylib, timeit};
2425
use crate::{Compiler, DependencyType, Mode, LLVM_TOOLS};
@@ -2517,68 +2518,36 @@ impl Step for RustDev {
25172518

25182519
builder.info(&format!("Dist RustDev ({})", target));
25192520
let _time = timeit(builder);
2520-
let src = builder.src.join("src/llvm-project/llvm");
2521-
let name = pkgname(builder, "rust-dev");
2522-
2523-
let tmp = tmpdir(builder);
2524-
let image = tmp.join("rust-dev-image");
2525-
drop(fs::remove_dir_all(&image));
25262521

2527-
// Prepare the image directory
2528-
let dst_bindir = image.join("bin");
2529-
t!(fs::create_dir_all(&dst_bindir));
2522+
let mut tarball = Tarball::new(builder, "rust-dev", &target.triple);
2523+
tarball.set_overlay(OverlayKind::LLVM);
25302524

25312525
let src_bindir = builder.llvm_out(target).join("bin");
2532-
let install_bin =
2533-
|name| builder.install(&src_bindir.join(exe(name, target)), &dst_bindir, 0o755);
2534-
install_bin("llvm-config");
2535-
install_bin("llvm-ar");
2536-
install_bin("llvm-objdump");
2537-
install_bin("llvm-profdata");
2538-
install_bin("llvm-bcanalyzer");
2539-
install_bin("llvm-cov");
2540-
install_bin("llvm-dwp");
2541-
builder.install(&builder.llvm_filecheck(target), &dst_bindir, 0o755);
2526+
for bin in &[
2527+
"llvm-config",
2528+
"llvm-ar",
2529+
"llvm-objdump",
2530+
"llvm-profdata",
2531+
"llvm-bcanalyzer",
2532+
"llvm-cov",
2533+
"llvm-dwp",
2534+
] {
2535+
tarball.add_file(src_bindir.join(exe(bin, target)), "bin", 0o755);
2536+
}
2537+
tarball.add_file(&builder.llvm_filecheck(target), "bin", 0o755);
25422538

25432539
// Copy the include directory as well; needed mostly to build
25442540
// librustc_llvm properly (e.g., llvm-config.h is in here). But also
25452541
// just broadly useful to be able to link against the bundled LLVM.
2546-
builder.cp_r(&builder.llvm_out(target).join("include"), &image.join("include"));
2542+
tarball.add_dir(&builder.llvm_out(target).join("include"), ".");
25472543

25482544
// Copy libLLVM.so to the target lib dir as well, so the RPATH like
25492545
// `$ORIGIN/../lib` can find it. It may also be used as a dependency
25502546
// of `rustc-dev` to support the inherited `-lLLVM` when using the
25512547
// compiler libraries.
2552-
maybe_install_llvm(builder, target, &image.join("lib"));
2553-
2554-
// Prepare the overlay
2555-
let overlay = tmp.join("rust-dev-overlay");
2556-
drop(fs::remove_dir_all(&overlay));
2557-
builder.create_dir(&overlay);
2558-
builder.install(&src.join("README.txt"), &overlay, 0o644);
2559-
builder.install(&src.join("LICENSE.TXT"), &overlay, 0o644);
2560-
builder.create(&overlay.join("version"), &builder.rust_version());
2548+
maybe_install_llvm(builder, target, &tarball.image_dir().join("lib"));
25612549

2562-
// Generate the installer tarball
2563-
let mut cmd = rust_installer(builder);
2564-
cmd.arg("generate")
2565-
.arg("--product-name=Rust")
2566-
.arg("--rel-manifest-dir=rustlib")
2567-
.arg("--success-message=rust-dev-installed.")
2568-
.arg("--image-dir")
2569-
.arg(&image)
2570-
.arg("--work-dir")
2571-
.arg(&tmpdir(builder))
2572-
.arg("--output-dir")
2573-
.arg(&distdir(builder))
2574-
.arg("--non-installed-overlay")
2575-
.arg(&overlay)
2576-
.arg(format!("--package-name={}-{}", name, target.triple))
2577-
.arg("--legacy-manifest-dirs=rustlib,cargo")
2578-
.arg("--component-name=rust-dev");
2579-
2580-
builder.run(&mut cmd);
2581-
Some(distdir(builder).join(format!("{}-{}.tar.gz", name, target.triple)))
2550+
Some(tarball.generate())
25822551
}
25832552
}
25842553

@@ -2607,45 +2576,9 @@ impl Step for BuildManifest {
26072576
fn run(self, builder: &Builder<'_>) -> PathBuf {
26082577
let build_manifest = builder.tool_exe(Tool::BuildManifest);
26092578

2610-
let name = pkgname(builder, "build-manifest");
2611-
let tmp = tmpdir(builder);
2612-
2613-
// Prepare the image.
2614-
let image = tmp.join("build-manifest-image");
2615-
let image_bin = image.join("bin");
2616-
let _ = fs::remove_dir_all(&image);
2617-
t!(fs::create_dir_all(&image_bin));
2618-
builder.install(&build_manifest, &image_bin, 0o755);
2619-
2620-
// Prepare the overlay.
2621-
let overlay = tmp.join("build-manifest-overlay");
2622-
let _ = fs::remove_dir_all(&overlay);
2623-
builder.create_dir(&overlay);
2624-
builder.create(&overlay.join("version"), &builder.rust_version());
2625-
for file in &["COPYRIGHT", "LICENSE-APACHE", "LICENSE-MIT", "README.md"] {
2626-
builder.install(&builder.src.join(file), &overlay, 0o644);
2627-
}
2628-
2629-
// Create the final tarball.
2630-
let mut cmd = rust_installer(builder);
2631-
cmd.arg("generate")
2632-
.arg("--product-name=Rust")
2633-
.arg("--rel-manifest-dir=rustlib")
2634-
.arg("--success-message=build-manifest installed.")
2635-
.arg("--image-dir")
2636-
.arg(&image)
2637-
.arg("--work-dir")
2638-
.arg(&tmpdir(builder))
2639-
.arg("--output-dir")
2640-
.arg(&distdir(builder))
2641-
.arg("--non-installed-overlay")
2642-
.arg(&overlay)
2643-
.arg(format!("--package-name={}-{}", name, self.target.triple))
2644-
.arg("--legacy-manifest-dirs=rustlib,cargo")
2645-
.arg("--component-name=build-manifest");
2646-
2647-
builder.run(&mut cmd);
2648-
distdir(builder).join(format!("{}-{}.tar.gz", name, self.target.triple))
2579+
let tarball = Tarball::new(builder, "build-manifest", &self.target.triple);
2580+
tarball.add_file(&build_manifest, "bin", 0o755);
2581+
tarball.generate()
26492582
}
26502583
}
26512584

src/bootstrap/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ mod native;
142142
mod run;
143143
mod sanity;
144144
mod setup;
145+
mod tarball;
145146
mod test;
146147
mod tool;
147148
mod toolstate;

src/bootstrap/tarball.rs

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
use std::path::{Path, PathBuf};
2+
3+
use build_helper::t;
4+
5+
use crate::builder::Builder;
6+
7+
#[derive(Copy, Clone)]
8+
pub(crate) enum OverlayKind {
9+
Rust,
10+
LLVM,
11+
}
12+
13+
impl OverlayKind {
14+
fn included_files(&self) -> &[&str] {
15+
match self {
16+
OverlayKind::Rust => &["COPYRIGHT", "LICENSE-APACHE", "LICENSE-MIT", "README.md"],
17+
OverlayKind::LLVM => {
18+
&["src/llvm-project/llvm/LICENSE.TXT", "src/llvm-project/llvm/README.txt"]
19+
}
20+
}
21+
}
22+
}
23+
24+
pub(crate) struct Tarball<'a> {
25+
builder: &'a Builder<'a>,
26+
27+
pkgname: String,
28+
component: String,
29+
target: String,
30+
overlay: OverlayKind,
31+
32+
temp_dir: PathBuf,
33+
image_dir: PathBuf,
34+
overlay_dir: PathBuf,
35+
work_dir: PathBuf,
36+
}
37+
38+
impl<'a> Tarball<'a> {
39+
pub(crate) fn new(builder: &'a Builder<'a>, component: &str, target: &str) -> Self {
40+
let pkgname = crate::dist::pkgname(builder, component);
41+
42+
let temp_dir = builder.out.join("tmp").join("tarball").join(component);
43+
let _ = std::fs::remove_dir_all(&temp_dir);
44+
45+
let image_dir = temp_dir.join("image");
46+
let overlay_dir = temp_dir.join("overlay");
47+
let work_dir = temp_dir.join("work");
48+
49+
Self {
50+
builder,
51+
52+
pkgname,
53+
component: component.into(),
54+
target: target.into(),
55+
overlay: OverlayKind::Rust,
56+
57+
temp_dir,
58+
image_dir,
59+
overlay_dir,
60+
work_dir,
61+
}
62+
}
63+
64+
pub(crate) fn set_overlay(&mut self, overlay: OverlayKind) {
65+
self.overlay = overlay;
66+
}
67+
68+
pub(crate) fn image_dir(&self) -> &Path {
69+
t!(std::fs::create_dir_all(&self.image_dir));
70+
&self.image_dir
71+
}
72+
73+
pub(crate) fn add_file(&self, src: impl AsRef<Path>, destdir: impl AsRef<Path>, perms: u32) {
74+
// create_dir_all fails to create `foo/bar/.`, so when the destination is "." this simply
75+
// uses the base directory as the destination directory.
76+
let destdir = if destdir.as_ref() == Path::new(".") {
77+
self.image_dir.clone()
78+
} else {
79+
self.image_dir.join(destdir.as_ref())
80+
};
81+
82+
t!(std::fs::create_dir_all(&destdir));
83+
self.builder.install(src.as_ref(), &destdir, perms);
84+
}
85+
86+
pub(crate) fn add_dir(&self, src: impl AsRef<Path>, destdir: impl AsRef<Path>) {
87+
t!(std::fs::create_dir_all(destdir.as_ref()));
88+
self.builder.cp_r(
89+
src.as_ref(),
90+
&self.image_dir.join(destdir.as_ref()).join(src.as_ref().file_name().unwrap()),
91+
);
92+
}
93+
94+
pub(crate) fn generate(self) -> PathBuf {
95+
t!(std::fs::create_dir_all(&self.overlay_dir));
96+
self.builder.create(&self.overlay_dir.join("version"), &self.builder.rust_version());
97+
for file in self.overlay.included_files() {
98+
self.builder.install(&self.builder.src.join(file), &self.overlay_dir, 0o644);
99+
}
100+
101+
let distdir = crate::dist::distdir(self.builder);
102+
let mut cmd = self.builder.tool_cmd(crate::tool::Tool::RustInstaller);
103+
cmd.arg("generate")
104+
.arg("--product-name=Rust")
105+
.arg("--rel-manifest-dir=rustlib")
106+
.arg(format!("--success-message={} installed.", self.component))
107+
.arg("--image-dir")
108+
.arg(self.image_dir)
109+
.arg("--work-dir")
110+
.arg(self.work_dir)
111+
.arg("--output-dir")
112+
.arg(&distdir)
113+
.arg("--non-installed-overlay")
114+
.arg(self.overlay_dir)
115+
.arg(format!("--package-name={}-{}", self.pkgname, self.target))
116+
.arg("--legacy-manifest-dirs=rustlib,cargo")
117+
.arg(format!("--component-name={}", self.component));
118+
self.builder.run(&mut cmd);
119+
120+
t!(std::fs::remove_dir_all(&self.temp_dir));
121+
122+
distdir.join(format!("{}-{}.tar.gz", self.pkgname, self.target))
123+
}
124+
}

0 commit comments

Comments
 (0)