Skip to content

Commit eba513e

Browse files
committed
Prepare everything for distributing miri via rustup
1 parent e2a93c2 commit eba513e

File tree

5 files changed

+108
-0
lines changed

5 files changed

+108
-0
lines changed

src/bootstrap/builder.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -449,6 +449,7 @@ impl<'a> Builder<'a> {
449449
dist::Rls,
450450
dist::Rustfmt,
451451
dist::Clippy,
452+
dist::Miri,
452453
dist::LlvmTools,
453454
dist::Lldb,
454455
dist::Extended,
@@ -461,6 +462,7 @@ impl<'a> Builder<'a> {
461462
install::Rls,
462463
install::Rustfmt,
463464
install::Clippy,
465+
install::Miri,
464466
install::Analysis,
465467
install::Src,
466468
install::Rustc

src/bootstrap/dist.rs

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1267,6 +1267,90 @@ impl Step for Clippy {
12671267
}
12681268
}
12691269

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

src/bootstrap/install.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@ pub fn install_rls(builder: &Builder, stage: u32, host: Interned<String>) {
3232
pub fn install_clippy(builder: &Builder, stage: u32, host: Interned<String>) {
3333
install_sh(builder, "clippy", "clippy", stage, Some(host));
3434
}
35+
pub fn install_miri(builder: &Builder, stage: u32, host: Interned<String>) {
36+
install_sh(builder, "miri", "miri", stage, Some(host));
37+
}
3538

3639
pub fn install_rustfmt(builder: &Builder, stage: u32, host: Interned<String>) {
3740
install_sh(builder, "rustfmt", "rustfmt", stage, Some(host));
@@ -217,6 +220,14 @@ install!((self, builder, _config),
217220
builder.info(&format!("skipping Install clippy stage{} ({})", self.stage, self.target));
218221
}
219222
};
223+
Miri, "miri", Self::should_build(_config), only_hosts: true, {
224+
if builder.ensure(dist::Clippy { stage: self.stage, target: self.target }).is_some() ||
225+
Self::should_install(builder) {
226+
install_miri(builder, self.stage, self.target);
227+
} else {
228+
builder.info(&format!("skipping Install miri stage{} ({})", self.stage, self.target));
229+
}
230+
};
220231
Rustfmt, "rustfmt", Self::should_build(_config), only_hosts: true, {
221232
if builder.ensure(dist::Rustfmt { stage: self.stage, target: self.target }).is_some() ||
222233
Self::should_install(builder) {

src/bootstrap/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,7 @@ pub struct Build {
253253
cargo_info: channel::GitInfo,
254254
rls_info: channel::GitInfo,
255255
clippy_info: channel::GitInfo,
256+
miri_info: channel::GitInfo,
256257
rustfmt_info: channel::GitInfo,
257258
local_rebuild: bool,
258259
fail_fast: bool,
@@ -374,6 +375,7 @@ impl Build {
374375
let cargo_info = channel::GitInfo::new(&config, &src.join("src/tools/cargo"));
375376
let rls_info = channel::GitInfo::new(&config, &src.join("src/tools/rls"));
376377
let clippy_info = channel::GitInfo::new(&config, &src.join("src/tools/clippy"));
378+
let miri_info = channel::GitInfo::new(&config, &src.join("src/tools/miri"));
377379
let rustfmt_info = channel::GitInfo::new(&config, &src.join("src/tools/rustfmt"));
378380

379381
let mut build = Build {
@@ -396,6 +398,7 @@ impl Build {
396398
cargo_info,
397399
rls_info,
398400
clippy_info,
401+
miri_info,
399402
rustfmt_info,
400403
cc: HashMap::new(),
401404
cxx: HashMap::new(),

src/bootstrap/tool.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -592,6 +592,14 @@ tool_extended!((self, builder),
592592
});
593593
};
594594
Miri, miri, "src/tools/miri", "miri", {};
595+
CargoMiri, clippy, "src/tools/miri", "cargo-miri", {
596+
// Miri depends on procedural macros (serde), which requires a full host
597+
// compiler to be available, so we need to depend on that.
598+
builder.ensure(compile::Rustc {
599+
compiler: self.compiler,
600+
target: builder.config.build,
601+
});
602+
};
595603
Rls, rls, "src/tools/rls", "rls", {
596604
let clippy = builder.ensure(Clippy {
597605
compiler: self.compiler,

0 commit comments

Comments
 (0)