Skip to content

Commit 78d39e3

Browse files
committed
Prepare everything for distributing miri via rustup
1 parent 15a2c73 commit 78d39e3

File tree

5 files changed

+108
-0
lines changed

5 files changed

+108
-0
lines changed

src/bootstrap/builder.rs

+2
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,7 @@ impl<'a> Builder<'a> {
459459
dist::Rls,
460460
dist::Rustfmt,
461461
dist::Clippy,
462+
dist::Miri,
462463
dist::LlvmTools,
463464
dist::Lldb,
464465
dist::Extended,
@@ -471,6 +472,7 @@ impl<'a> Builder<'a> {
471472
install::Rls,
472473
install::Rustfmt,
473474
install::Clippy,
475+
install::Miri,
474476
install::Analysis,
475477
install::Src,
476478
install::Rustc

src/bootstrap/dist.rs

+84
Original file line numberDiff line numberDiff line change
@@ -1278,6 +1278,90 @@ impl Step for Clippy {
12781278
}
12791279
}
12801280

1281+
#[derive(Debug, PartialOrd, Ord, Copy, Clone, Hash, PartialEq, Eq)]
1282+
pub struct Miri {
1283+
pub stage: u32,
1284+
pub target: Interned<String>,
1285+
}
1286+
1287+
impl Step for Miri {
1288+
type Output = Option<PathBuf>;
1289+
const ONLY_HOSTS: bool = true;
1290+
1291+
fn should_run(run: ShouldRun) -> ShouldRun {
1292+
run.path("miri")
1293+
}
1294+
1295+
fn make_run(run: RunConfig) {
1296+
run.builder.ensure(Miri {
1297+
stage: run.builder.top_stage,
1298+
target: run.target,
1299+
});
1300+
}
1301+
1302+
fn run(self, builder: &Builder) -> Option<PathBuf> {
1303+
let stage = self.stage;
1304+
let target = self.target;
1305+
assert!(builder.config.extended);
1306+
1307+
builder.info(&format!("Dist miri stage{} ({})", stage, target));
1308+
let src = builder.src.join("src/tools/miri");
1309+
let release_num = builder.release_num("miri");
1310+
let name = pkgname(builder, "miri");
1311+
let version = builder.miri_info.version(builder, &release_num);
1312+
1313+
let tmp = tmpdir(builder);
1314+
let image = tmp.join("miri-image");
1315+
drop(fs::remove_dir_all(&image));
1316+
builder.create_dir(&image);
1317+
1318+
// Prepare the image directory
1319+
// We expect miri to build, because we've exited this step above if tool
1320+
// state for miri isn't testing.
1321+
let miri = builder.ensure(tool::Miri {
1322+
compiler: builder.compiler(stage, builder.config.build),
1323+
target, extra_features: Vec::new()
1324+
}).or_else(|| { missing_tool("miri", builder.build.config.missing_tools); None })?;
1325+
let cargomiri = builder.ensure(tool::CargoMiri {
1326+
compiler: builder.compiler(stage, builder.config.build),
1327+
target, extra_features: Vec::new()
1328+
}).or_else(|| { missing_tool("cargo miri", builder.build.config.missing_tools); None })?;
1329+
1330+
builder.install(&miri, &image.join("bin"), 0o755);
1331+
builder.install(&cargomiri, &image.join("bin"), 0o755);
1332+
let doc = image.join("share/doc/miri");
1333+
builder.install(&src.join("README.md"), &doc, 0o644);
1334+
builder.install(&src.join("LICENSE-APACHE"), &doc, 0o644);
1335+
builder.install(&src.join("LICENSE-MIT"), &doc, 0o644);
1336+
1337+
// Prepare the overlay
1338+
let overlay = tmp.join("miri-overlay");
1339+
drop(fs::remove_dir_all(&overlay));
1340+
t!(fs::create_dir_all(&overlay));
1341+
builder.install(&src.join("README.md"), &overlay, 0o644);
1342+
builder.install(&src.join("LICENSE-APACHE"), &doc, 0o644);
1343+
builder.install(&src.join("LICENSE-MIT"), &doc, 0o644);
1344+
builder.create(&overlay.join("version"), &version);
1345+
1346+
// Generate the installer tarball
1347+
let mut cmd = rust_installer(builder);
1348+
cmd.arg("generate")
1349+
.arg("--product-name=Rust")
1350+
.arg("--rel-manifest-dir=rustlib")
1351+
.arg("--success-message=miri-ready-to-serve.")
1352+
.arg("--image-dir").arg(&image)
1353+
.arg("--work-dir").arg(&tmpdir(builder))
1354+
.arg("--output-dir").arg(&distdir(builder))
1355+
.arg("--non-installed-overlay").arg(&overlay)
1356+
.arg(format!("--package-name={}-{}", name, target))
1357+
.arg("--legacy-manifest-dirs=rustlib,cargo")
1358+
.arg("--component-name=miri-preview");
1359+
1360+
builder.run(&mut cmd);
1361+
Some(distdir(builder).join(format!("{}-{}.tar.gz", name, target)))
1362+
}
1363+
}
1364+
12811365
#[derive(Debug, PartialOrd, Ord, Copy, Clone, Hash, PartialEq, Eq)]
12821366
pub struct Rustfmt {
12831367
pub stage: u32,

src/bootstrap/install.rs

+11
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ pub fn install_rls(builder: &Builder, stage: u32, host: Interned<String>) {
4242
pub fn install_clippy(builder: &Builder, stage: u32, host: Interned<String>) {
4343
install_sh(builder, "clippy", "clippy", stage, Some(host));
4444
}
45+
pub fn install_miri(builder: &Builder, stage: u32, host: Interned<String>) {
46+
install_sh(builder, "miri", "miri", stage, Some(host));
47+
}
4548

4649
pub fn install_rustfmt(builder: &Builder, stage: u32, host: Interned<String>) {
4750
install_sh(builder, "rustfmt", "rustfmt", stage, Some(host));
@@ -227,6 +230,14 @@ install!((self, builder, _config),
227230
builder.info(&format!("skipping Install clippy stage{} ({})", self.stage, self.target));
228231
}
229232
};
233+
Miri, "miri", Self::should_build(_config), only_hosts: true, {
234+
if builder.ensure(dist::Clippy { stage: self.stage, target: self.target }).is_some() ||
235+
Self::should_install(builder) {
236+
install_miri(builder, self.stage, self.target);
237+
} else {
238+
builder.info(&format!("skipping Install miri stage{} ({})", self.stage, self.target));
239+
}
240+
};
230241
Rustfmt, "rustfmt", Self::should_build(_config), only_hosts: true, {
231242
if builder.ensure(dist::Rustfmt { stage: self.stage, target: self.target }).is_some() ||
232243
Self::should_install(builder) {

src/bootstrap/lib.rs

+3
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,7 @@ pub struct Build {
263263
cargo_info: channel::GitInfo,
264264
rls_info: channel::GitInfo,
265265
clippy_info: channel::GitInfo,
266+
miri_info: channel::GitInfo,
266267
rustfmt_info: channel::GitInfo,
267268
local_rebuild: bool,
268269
fail_fast: bool,
@@ -384,6 +385,7 @@ impl Build {
384385
let cargo_info = channel::GitInfo::new(&config, &src.join("src/tools/cargo"));
385386
let rls_info = channel::GitInfo::new(&config, &src.join("src/tools/rls"));
386387
let clippy_info = channel::GitInfo::new(&config, &src.join("src/tools/clippy"));
388+
let miri_info = channel::GitInfo::new(&config, &src.join("src/tools/miri"));
387389
let rustfmt_info = channel::GitInfo::new(&config, &src.join("src/tools/rustfmt"));
388390

389391
let mut build = Build {
@@ -406,6 +408,7 @@ impl Build {
406408
cargo_info,
407409
rls_info,
408410
clippy_info,
411+
miri_info,
409412
rustfmt_info,
410413
cc: HashMap::new(),
411414
cxx: HashMap::new(),

src/bootstrap/tool.rs

+8
Original file line numberDiff line numberDiff line change
@@ -602,6 +602,14 @@ tool_extended!((self, builder),
602602
});
603603
};
604604
Miri, miri, "src/tools/miri", "miri", {};
605+
CargoMiri, clippy, "src/tools/miri", "cargo-miri", {
606+
// Miri depends on procedural macros (serde), which requires a full host
607+
// compiler to be available, so we need to depend on that.
608+
builder.ensure(compile::Rustc {
609+
compiler: self.compiler,
610+
target: builder.config.build,
611+
});
612+
};
605613
Rls, rls, "src/tools/rls", "rls", {
606614
let clippy = builder.ensure(Clippy {
607615
compiler: self.compiler,

0 commit comments

Comments
 (0)