Skip to content

Commit 8c97b6f

Browse files
committed
2 parents 167ceff + 2ab78e1 commit 8c97b6f

File tree

8 files changed

+162
-1
lines changed

8 files changed

+162
-1
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ __pycache__/
1313
.settings/
1414
.valgrindrc
1515
.vscode/
16+
.favorites.json
1617
/*-*-*-*/
1718
/*-*-*/
1819
/Makefile

Cargo.lock

+2
Original file line numberDiff line numberDiff line change
@@ -2260,8 +2260,10 @@ dependencies = [
22602260
name = "rustc-workspace-hack"
22612261
version = "1.0.0"
22622262
dependencies = [
2263+
"byteorder 1.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
22632264
"parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)",
22642265
"rand 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)",
2266+
"scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
22652267
"serde 1.0.82 (registry+https://github.com/rust-lang/crates.io-index)",
22662268
"serde_json 1.0.33 (registry+https://github.com/rust-lang/crates.io-index)",
22672269
"smallvec 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)",

src/bootstrap/builder.rs

+2
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

+121
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ pub fn pkgname(builder: &Builder, component: &str) -> String {
3232
format!("{}-{}", component, builder.rls_package_vers())
3333
} else if component == "clippy" {
3434
format!("{}-{}", component, builder.clippy_package_vers())
35+
} else if component == "miri" {
36+
format!("{}-{}", component, builder.miri_package_vers())
3537
} else if component == "rustfmt" {
3638
format!("{}-{}", component, builder.rustfmt_package_vers())
3739
} else if component == "llvm-tools" {
@@ -1275,6 +1277,90 @@ impl Step for Clippy {
12751277
}
12761278
}
12771279

1280+
#[derive(Debug, PartialOrd, Ord, Copy, Clone, Hash, PartialEq, Eq)]
1281+
pub struct Miri {
1282+
pub stage: u32,
1283+
pub target: Interned<String>,
1284+
}
1285+
1286+
impl Step for Miri {
1287+
type Output = Option<PathBuf>;
1288+
const ONLY_HOSTS: bool = true;
1289+
1290+
fn should_run(run: ShouldRun) -> ShouldRun {
1291+
run.path("miri")
1292+
}
1293+
1294+
fn make_run(run: RunConfig) {
1295+
run.builder.ensure(Miri {
1296+
stage: run.builder.top_stage,
1297+
target: run.target,
1298+
});
1299+
}
1300+
1301+
fn run(self, builder: &Builder) -> Option<PathBuf> {
1302+
let stage = self.stage;
1303+
let target = self.target;
1304+
assert!(builder.config.extended);
1305+
1306+
builder.info(&format!("Dist miri stage{} ({})", stage, target));
1307+
let src = builder.src.join("src/tools/miri");
1308+
let release_num = builder.release_num("miri");
1309+
let name = pkgname(builder, "miri");
1310+
let version = builder.miri_info.version(builder, &release_num);
1311+
1312+
let tmp = tmpdir(builder);
1313+
let image = tmp.join("miri-image");
1314+
drop(fs::remove_dir_all(&image));
1315+
builder.create_dir(&image);
1316+
1317+
// Prepare the image directory
1318+
// We expect miri to build, because we've exited this step above if tool
1319+
// state for miri isn't testing.
1320+
let miri = builder.ensure(tool::Miri {
1321+
compiler: builder.compiler(stage, builder.config.build),
1322+
target, extra_features: Vec::new()
1323+
}).or_else(|| { missing_tool("miri", builder.build.config.missing_tools); None })?;
1324+
let cargomiri = builder.ensure(tool::CargoMiri {
1325+
compiler: builder.compiler(stage, builder.config.build),
1326+
target, extra_features: Vec::new()
1327+
}).or_else(|| { missing_tool("cargo miri", builder.build.config.missing_tools); None })?;
1328+
1329+
builder.install(&miri, &image.join("bin"), 0o755);
1330+
builder.install(&cargomiri, &image.join("bin"), 0o755);
1331+
let doc = image.join("share/doc/miri");
1332+
builder.install(&src.join("README.md"), &doc, 0o644);
1333+
builder.install(&src.join("LICENSE-APACHE"), &doc, 0o644);
1334+
builder.install(&src.join("LICENSE-MIT"), &doc, 0o644);
1335+
1336+
// Prepare the overlay
1337+
let overlay = tmp.join("miri-overlay");
1338+
drop(fs::remove_dir_all(&overlay));
1339+
t!(fs::create_dir_all(&overlay));
1340+
builder.install(&src.join("README.md"), &overlay, 0o644);
1341+
builder.install(&src.join("LICENSE-APACHE"), &doc, 0o644);
1342+
builder.install(&src.join("LICENSE-MIT"), &doc, 0o644);
1343+
builder.create(&overlay.join("version"), &version);
1344+
1345+
// Generate the installer tarball
1346+
let mut cmd = rust_installer(builder);
1347+
cmd.arg("generate")
1348+
.arg("--product-name=Rust")
1349+
.arg("--rel-manifest-dir=rustlib")
1350+
.arg("--success-message=miri-ready-to-serve.")
1351+
.arg("--image-dir").arg(&image)
1352+
.arg("--work-dir").arg(&tmpdir(builder))
1353+
.arg("--output-dir").arg(&distdir(builder))
1354+
.arg("--non-installed-overlay").arg(&overlay)
1355+
.arg(format!("--package-name={}-{}", name, target))
1356+
.arg("--legacy-manifest-dirs=rustlib,cargo")
1357+
.arg("--component-name=miri-preview");
1358+
1359+
builder.run(&mut cmd);
1360+
Some(distdir(builder).join(format!("{}-{}.tar.gz", name, target)))
1361+
}
1362+
}
1363+
12781364
#[derive(Debug, PartialOrd, Ord, Copy, Clone, Hash, PartialEq, Eq)]
12791365
pub struct Rustfmt {
12801366
pub stage: u32,
@@ -1396,6 +1482,7 @@ impl Step for Extended {
13961482
let rls_installer = builder.ensure(Rls { stage, target });
13971483
let llvm_tools_installer = builder.ensure(LlvmTools { stage, target });
13981484
let clippy_installer = builder.ensure(Clippy { stage, target });
1485+
let miri_installer = builder.ensure(Miri { stage, target });
13991486
let lldb_installer = builder.ensure(Lldb { target });
14001487
let mingw_installer = builder.ensure(Mingw { host: target });
14011488
let analysis_installer = builder.ensure(Analysis {
@@ -1434,6 +1521,7 @@ impl Step for Extended {
14341521
tarballs.push(cargo_installer);
14351522
tarballs.extend(rls_installer.clone());
14361523
tarballs.extend(clippy_installer.clone());
1524+
tarballs.extend(miri_installer.clone());
14371525
tarballs.extend(rustfmt_installer.clone());
14381526
tarballs.extend(llvm_tools_installer);
14391527
tarballs.extend(lldb_installer);
@@ -1506,6 +1594,9 @@ impl Step for Extended {
15061594
if clippy_installer.is_none() {
15071595
contents = filter(&contents, "clippy");
15081596
}
1597+
if miri_installer.is_none() {
1598+
contents = filter(&contents, "miri");
1599+
}
15091600
if rustfmt_installer.is_none() {
15101601
contents = filter(&contents, "rustfmt");
15111602
}
@@ -1546,6 +1637,9 @@ impl Step for Extended {
15461637
if clippy_installer.is_some() {
15471638
prepare("clippy");
15481639
}
1640+
if miri_installer.is_some() {
1641+
prepare("miri");
1642+
}
15491643

15501644
// create an 'uninstall' package
15511645
builder.install(&etc.join("pkg/postinstall"), &pkg.join("uninstall"), 0o755);
@@ -1576,6 +1670,8 @@ impl Step for Extended {
15761670
"rls-preview".to_string()
15771671
} else if name == "clippy" {
15781672
"clippy-preview".to_string()
1673+
} else if name == "miri" {
1674+
"miri-preview".to_string()
15791675
} else {
15801676
name.to_string()
15811677
};
@@ -1595,6 +1691,9 @@ impl Step for Extended {
15951691
if clippy_installer.is_some() {
15961692
prepare("clippy");
15971693
}
1694+
if miri_installer.is_some() {
1695+
prepare("miri");
1696+
}
15981697
if target.contains("windows-gnu") {
15991698
prepare("rust-mingw");
16001699
}
@@ -1687,6 +1786,18 @@ impl Step for Extended {
16871786
.arg("-out").arg(exe.join("ClippyGroup.wxs"))
16881787
.arg("-t").arg(etc.join("msi/remove-duplicates.xsl")));
16891788
}
1789+
if miri_installer.is_some() {
1790+
builder.run(Command::new(&heat)
1791+
.current_dir(&exe)
1792+
.arg("dir")
1793+
.arg("miri")
1794+
.args(&heat_flags)
1795+
.arg("-cg").arg("MiriGroup")
1796+
.arg("-dr").arg("Miri")
1797+
.arg("-var").arg("var.MiriDir")
1798+
.arg("-out").arg(exe.join("MiriGroup.wxs"))
1799+
.arg("-t").arg(etc.join("msi/remove-duplicates.xsl")));
1800+
}
16901801
builder.run(Command::new(&heat)
16911802
.current_dir(&exe)
16921803
.arg("dir")
@@ -1732,6 +1843,9 @@ impl Step for Extended {
17321843
if clippy_installer.is_some() {
17331844
cmd.arg("-dClippyDir=clippy");
17341845
}
1846+
if miri_installer.is_some() {
1847+
cmd.arg("-dMiriDir=miri");
1848+
}
17351849
if target.contains("windows-gnu") {
17361850
cmd.arg("-dGccDir=rust-mingw");
17371851
}
@@ -1750,6 +1864,9 @@ impl Step for Extended {
17501864
if clippy_installer.is_some() {
17511865
candle("ClippyGroup.wxs".as_ref());
17521866
}
1867+
if miri_installer.is_some() {
1868+
candle("MiriGroup.wxs".as_ref());
1869+
}
17531870
candle("AnalysisGroup.wxs".as_ref());
17541871

17551872
if target.contains("windows-gnu") {
@@ -1782,6 +1899,9 @@ impl Step for Extended {
17821899
if clippy_installer.is_some() {
17831900
cmd.arg("ClippyGroup.wixobj");
17841901
}
1902+
if miri_installer.is_some() {
1903+
cmd.arg("MiriGroup.wixobj");
1904+
}
17851905

17861906
if target.contains("windows-gnu") {
17871907
cmd.arg("GccGroup.wixobj");
@@ -1867,6 +1987,7 @@ impl Step for HashSign {
18671987
cmd.arg(builder.package_vers(&builder.release_num("cargo")));
18681988
cmd.arg(builder.package_vers(&builder.release_num("rls")));
18691989
cmd.arg(builder.package_vers(&builder.release_num("clippy")));
1990+
cmd.arg(builder.package_vers(&builder.release_num("miri")));
18701991
cmd.arg(builder.package_vers(&builder.release_num("rustfmt")));
18711992
cmd.arg(builder.llvm_tools_package_vers());
18721993
cmd.arg(builder.lldb_package_vers());

src/bootstrap/install.rs

+11
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::Miri { 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

+8
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(),
@@ -1016,6 +1019,11 @@ impl Build {
10161019
self.package_vers(&self.release_num("clippy"))
10171020
}
10181021

1022+
/// Returns the value of `package_vers` above for miri
1023+
fn miri_package_vers(&self) -> String {
1024+
self.package_vers(&self.release_num("miri"))
1025+
}
1026+
10191027
/// Returns the value of `package_vers` above for rustfmt
10201028
fn rustfmt_package_vers(&self) -> String {
10211029
self.package_vers(&self.release_num("rustfmt"))

src/bootstrap/tool.rs

+10
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ impl Step for ToolBuild {
8383
| "rls"
8484
| "cargo"
8585
| "clippy-driver"
86+
| "miri"
8687
=> {}
8788

8889
_ => return,
@@ -218,6 +219,7 @@ pub fn prepare_tool_cargo(
218219
if path.ends_with("cargo") ||
219220
path.ends_with("rls") ||
220221
path.ends_with("clippy") ||
222+
path.ends_with("miri") ||
221223
path.ends_with("rustfmt")
222224
{
223225
cargo.env("LIBZ_SYS_STATIC", "1");
@@ -592,6 +594,14 @@ tool_extended!((self, builder),
592594
});
593595
};
594596
Miri, miri, "src/tools/miri", "miri", {};
597+
CargoMiri, miri, "src/tools/miri", "cargo-miri", {
598+
// Miri depends on procedural macros (serde), which requires a full host
599+
// compiler to be available, so we need to depend on that.
600+
builder.ensure(compile::Rustc {
601+
compiler: self.compiler,
602+
target: builder.config.build,
603+
});
604+
};
595605
Rls, rls, "src/tools/rls", "rls", {
596606
let clippy = builder.ensure(Clippy {
597607
compiler: self.compiler,

src/tools/rustc-workspace-hack/Cargo.toml

+7-1
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,21 @@ features = [
2727
"errhandlingapi",
2828
"jobapi",
2929
"jobapi2",
30+
"knownfolders",
3031
"lmcons",
3132
"memoryapi",
3233
"minschannel",
3334
"minwinbase",
3435
"ntsecapi",
3536
"ntstatus",
37+
"objbase",
3638
"profileapi",
3739
"processenv",
3840
"psapi",
3941
"schannel",
4042
"securitybaseapi",
4143
"shellapi",
44+
"shlobj",
4245
"sspi",
4346
"synchapi",
4447
"sysinfoapi",
@@ -50,12 +53,15 @@ features = [
5053
]
5154

5255
[dependencies]
53-
curl-sys = { version = "0.4.13", optional = true }
56+
curl-sys = { version = "0.4.13", features = ["http2", "libnghttp2-sys"], optional = true }
5457
parking_lot = { version = "0.6", features = ['nightly'] }
5558
rand = { version = "0.5.5", features = ["i128_support"] }
5659
serde = { version = "1.0.82", features = ['derive'] }
5760
serde_json = { version = "1.0.31", features = ["raw_value"] }
5861
smallvec = { version = "0.6", features = ['union'] }
62+
scopeguard = { version = "0.3.3", features = ["use_std", "default"]}
63+
byteorder = { version = "1.2.7", features = ["i128"]}
64+
5965

6066
[target.'cfg(not(windows))'.dependencies]
6167
openssl = { version = "0.10.12", optional = true }

0 commit comments

Comments
 (0)