diff options
| author | bors <bors@rust-lang.org> | 2019-01-09 06:42:11 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2019-01-09 06:42:11 +0000 |
| commit | 8c97b6ffbf0cec856c0b729c549141b5ac4b2d48 (patch) | |
| tree | 1a1953ff7970090096e86ceb79fa7dd3f1e18f38 /src/bootstrap | |
| parent | 167ceff01ec2f01f677fa6351646255d3dacbb98 (diff) | |
| parent | 2ab78e195a8af531012f820ab84995c44d32c5c1 (diff) | |
| download | rust-8c97b6ffbf0cec856c0b729c549141b5ac4b2d48.tar.gz rust-8c97b6ffbf0cec856c0b729c549141b5ac4b2d48.zip | |
Auto merge of #57086 - oli-obk:miri_dist, r=kennytm
Prepare everything for distributing miri via rustup The next step is to tell rustup about `cargo-miri` in https://github.com/rust-lang/rustup.rs/blob/31935e5f633a5acd3a203d23b61d1556c64a821c/src/rustup/lib.rs#L28 and https://github.com/rust-lang/rustup.rs/blob/1ccd706d1d572c777c5134bd7db7aa1a8df7f278/src/rustup-win-installer/src/lib.rs#L29
Diffstat (limited to 'src/bootstrap')
| -rw-r--r-- | src/bootstrap/builder.rs | 2 | ||||
| -rw-r--r-- | src/bootstrap/dist.rs | 121 | ||||
| -rw-r--r-- | src/bootstrap/install.rs | 11 | ||||
| -rw-r--r-- | src/bootstrap/lib.rs | 8 | ||||
| -rw-r--r-- | src/bootstrap/tool.rs | 10 |
5 files changed, 152 insertions, 0 deletions
diff --git a/src/bootstrap/builder.rs b/src/bootstrap/builder.rs index 117ff0e7214..9c58f5b179f 100644 --- a/src/bootstrap/builder.rs +++ b/src/bootstrap/builder.rs @@ -449,6 +449,7 @@ impl<'a> Builder<'a> { dist::Rls, dist::Rustfmt, dist::Clippy, + dist::Miri, dist::LlvmTools, dist::Lldb, dist::Extended, @@ -461,6 +462,7 @@ impl<'a> Builder<'a> { install::Rls, install::Rustfmt, install::Clippy, + install::Miri, install::Analysis, install::Src, install::Rustc diff --git a/src/bootstrap/dist.rs b/src/bootstrap/dist.rs index 38869bf441a..3f9a0931494 100644 --- a/src/bootstrap/dist.rs +++ b/src/bootstrap/dist.rs @@ -32,6 +32,8 @@ pub fn pkgname(builder: &Builder, component: &str) -> String { format!("{}-{}", component, builder.rls_package_vers()) } else if component == "clippy" { format!("{}-{}", component, builder.clippy_package_vers()) + } else if component == "miri" { + format!("{}-{}", component, builder.miri_package_vers()) } else if component == "rustfmt" { format!("{}-{}", component, builder.rustfmt_package_vers()) } else if component == "llvm-tools" { @@ -1276,6 +1278,90 @@ impl Step for Clippy { } #[derive(Debug, PartialOrd, Ord, Copy, Clone, Hash, PartialEq, Eq)] +pub struct Miri { + pub stage: u32, + pub target: Interned<String>, +} + +impl Step for Miri { + type Output = Option<PathBuf>; + const ONLY_HOSTS: bool = true; + + fn should_run(run: ShouldRun) -> ShouldRun { + run.path("miri") + } + + fn make_run(run: RunConfig) { + run.builder.ensure(Miri { + stage: run.builder.top_stage, + target: run.target, + }); + } + + fn run(self, builder: &Builder) -> Option<PathBuf> { + let stage = self.stage; + let target = self.target; + assert!(builder.config.extended); + + builder.info(&format!("Dist miri stage{} ({})", stage, target)); + let src = builder.src.join("src/tools/miri"); + let release_num = builder.release_num("miri"); + let name = pkgname(builder, "miri"); + let version = builder.miri_info.version(builder, &release_num); + + let tmp = tmpdir(builder); + let image = tmp.join("miri-image"); + drop(fs::remove_dir_all(&image)); + builder.create_dir(&image); + + // Prepare the image directory + // We expect miri to build, because we've exited this step above if tool + // state for miri isn't testing. + let miri = builder.ensure(tool::Miri { + compiler: builder.compiler(stage, builder.config.build), + target, extra_features: Vec::new() + }).or_else(|| { missing_tool("miri", builder.build.config.missing_tools); None })?; + let cargomiri = builder.ensure(tool::CargoMiri { + compiler: builder.compiler(stage, builder.config.build), + target, extra_features: Vec::new() + }).or_else(|| { missing_tool("cargo miri", builder.build.config.missing_tools); None })?; + + builder.install(&miri, &image.join("bin"), 0o755); + builder.install(&cargomiri, &image.join("bin"), 0o755); + let doc = image.join("share/doc/miri"); + builder.install(&src.join("README.md"), &doc, 0o644); + builder.install(&src.join("LICENSE-APACHE"), &doc, 0o644); + builder.install(&src.join("LICENSE-MIT"), &doc, 0o644); + + // Prepare the overlay + let overlay = tmp.join("miri-overlay"); + drop(fs::remove_dir_all(&overlay)); + t!(fs::create_dir_all(&overlay)); + builder.install(&src.join("README.md"), &overlay, 0o644); + builder.install(&src.join("LICENSE-APACHE"), &doc, 0o644); + builder.install(&src.join("LICENSE-MIT"), &doc, 0o644); + builder.create(&overlay.join("version"), &version); + + // Generate the installer tarball + let mut cmd = rust_installer(builder); + cmd.arg("generate") + .arg("--product-name=Rust") + .arg("--rel-manifest-dir=rustlib") + .arg("--success-message=miri-ready-to-serve.") + .arg("--image-dir").arg(&image) + .arg("--work-dir").arg(&tmpdir(builder)) + .arg("--output-dir").arg(&distdir(builder)) + .arg("--non-installed-overlay").arg(&overlay) + .arg(format!("--package-name={}-{}", name, target)) + .arg("--legacy-manifest-dirs=rustlib,cargo") + .arg("--component-name=miri-preview"); + + builder.run(&mut cmd); + Some(distdir(builder).join(format!("{}-{}.tar.gz", name, target))) + } +} + +#[derive(Debug, PartialOrd, Ord, Copy, Clone, Hash, PartialEq, Eq)] pub struct Rustfmt { pub stage: u32, pub target: Interned<String>, @@ -1396,6 +1482,7 @@ impl Step for Extended { let rls_installer = builder.ensure(Rls { stage, target }); let llvm_tools_installer = builder.ensure(LlvmTools { stage, target }); let clippy_installer = builder.ensure(Clippy { stage, target }); + let miri_installer = builder.ensure(Miri { stage, target }); let lldb_installer = builder.ensure(Lldb { target }); let mingw_installer = builder.ensure(Mingw { host: target }); let analysis_installer = builder.ensure(Analysis { @@ -1434,6 +1521,7 @@ impl Step for Extended { tarballs.push(cargo_installer); tarballs.extend(rls_installer.clone()); tarballs.extend(clippy_installer.clone()); + tarballs.extend(miri_installer.clone()); tarballs.extend(rustfmt_installer.clone()); tarballs.extend(llvm_tools_installer); tarballs.extend(lldb_installer); @@ -1506,6 +1594,9 @@ impl Step for Extended { if clippy_installer.is_none() { contents = filter(&contents, "clippy"); } + if miri_installer.is_none() { + contents = filter(&contents, "miri"); + } if rustfmt_installer.is_none() { contents = filter(&contents, "rustfmt"); } @@ -1546,6 +1637,9 @@ impl Step for Extended { if clippy_installer.is_some() { prepare("clippy"); } + if miri_installer.is_some() { + prepare("miri"); + } // create an 'uninstall' package builder.install(&etc.join("pkg/postinstall"), &pkg.join("uninstall"), 0o755); @@ -1576,6 +1670,8 @@ impl Step for Extended { "rls-preview".to_string() } else if name == "clippy" { "clippy-preview".to_string() + } else if name == "miri" { + "miri-preview".to_string() } else { name.to_string() }; @@ -1595,6 +1691,9 @@ impl Step for Extended { if clippy_installer.is_some() { prepare("clippy"); } + if miri_installer.is_some() { + prepare("miri"); + } if target.contains("windows-gnu") { prepare("rust-mingw"); } @@ -1687,6 +1786,18 @@ impl Step for Extended { .arg("-out").arg(exe.join("ClippyGroup.wxs")) .arg("-t").arg(etc.join("msi/remove-duplicates.xsl"))); } + if miri_installer.is_some() { + builder.run(Command::new(&heat) + .current_dir(&exe) + .arg("dir") + .arg("miri") + .args(&heat_flags) + .arg("-cg").arg("MiriGroup") + .arg("-dr").arg("Miri") + .arg("-var").arg("var.MiriDir") + .arg("-out").arg(exe.join("MiriGroup.wxs")) + .arg("-t").arg(etc.join("msi/remove-duplicates.xsl"))); + } builder.run(Command::new(&heat) .current_dir(&exe) .arg("dir") @@ -1732,6 +1843,9 @@ impl Step for Extended { if clippy_installer.is_some() { cmd.arg("-dClippyDir=clippy"); } + if miri_installer.is_some() { + cmd.arg("-dMiriDir=miri"); + } if target.contains("windows-gnu") { cmd.arg("-dGccDir=rust-mingw"); } @@ -1750,6 +1864,9 @@ impl Step for Extended { if clippy_installer.is_some() { candle("ClippyGroup.wxs".as_ref()); } + if miri_installer.is_some() { + candle("MiriGroup.wxs".as_ref()); + } candle("AnalysisGroup.wxs".as_ref()); if target.contains("windows-gnu") { @@ -1782,6 +1899,9 @@ impl Step for Extended { if clippy_installer.is_some() { cmd.arg("ClippyGroup.wixobj"); } + if miri_installer.is_some() { + cmd.arg("MiriGroup.wixobj"); + } if target.contains("windows-gnu") { cmd.arg("GccGroup.wixobj"); @@ -1867,6 +1987,7 @@ impl Step for HashSign { cmd.arg(builder.package_vers(&builder.release_num("cargo"))); cmd.arg(builder.package_vers(&builder.release_num("rls"))); cmd.arg(builder.package_vers(&builder.release_num("clippy"))); + cmd.arg(builder.package_vers(&builder.release_num("miri"))); cmd.arg(builder.package_vers(&builder.release_num("rustfmt"))); cmd.arg(builder.llvm_tools_package_vers()); cmd.arg(builder.lldb_package_vers()); diff --git a/src/bootstrap/install.rs b/src/bootstrap/install.rs index 669aae68c63..1265fa9eff4 100644 --- a/src/bootstrap/install.rs +++ b/src/bootstrap/install.rs @@ -32,6 +32,9 @@ pub fn install_rls(builder: &Builder, stage: u32, host: Interned<String>) { pub fn install_clippy(builder: &Builder, stage: u32, host: Interned<String>) { install_sh(builder, "clippy", "clippy", stage, Some(host)); } +pub fn install_miri(builder: &Builder, stage: u32, host: Interned<String>) { + install_sh(builder, "miri", "miri", stage, Some(host)); +} pub fn install_rustfmt(builder: &Builder, stage: u32, host: Interned<String>) { install_sh(builder, "rustfmt", "rustfmt", stage, Some(host)); @@ -217,6 +220,14 @@ install!((self, builder, _config), builder.info(&format!("skipping Install clippy stage{} ({})", self.stage, self.target)); } }; + Miri, "miri", Self::should_build(_config), only_hosts: true, { + if builder.ensure(dist::Miri { stage: self.stage, target: self.target }).is_some() || + Self::should_install(builder) { + install_miri(builder, self.stage, self.target); + } else { + builder.info(&format!("skipping Install miri stage{} ({})", self.stage, self.target)); + } + }; Rustfmt, "rustfmt", Self::should_build(_config), only_hosts: true, { if builder.ensure(dist::Rustfmt { stage: self.stage, target: self.target }).is_some() || Self::should_install(builder) { diff --git a/src/bootstrap/lib.rs b/src/bootstrap/lib.rs index e460ef5a44e..bddc6362389 100644 --- a/src/bootstrap/lib.rs +++ b/src/bootstrap/lib.rs @@ -253,6 +253,7 @@ pub struct Build { cargo_info: channel::GitInfo, rls_info: channel::GitInfo, clippy_info: channel::GitInfo, + miri_info: channel::GitInfo, rustfmt_info: channel::GitInfo, local_rebuild: bool, fail_fast: bool, @@ -374,6 +375,7 @@ impl Build { let cargo_info = channel::GitInfo::new(&config, &src.join("src/tools/cargo")); let rls_info = channel::GitInfo::new(&config, &src.join("src/tools/rls")); let clippy_info = channel::GitInfo::new(&config, &src.join("src/tools/clippy")); + let miri_info = channel::GitInfo::new(&config, &src.join("src/tools/miri")); let rustfmt_info = channel::GitInfo::new(&config, &src.join("src/tools/rustfmt")); let mut build = Build { @@ -396,6 +398,7 @@ impl Build { cargo_info, rls_info, clippy_info, + miri_info, rustfmt_info, cc: HashMap::new(), cxx: HashMap::new(), @@ -1016,6 +1019,11 @@ impl Build { self.package_vers(&self.release_num("clippy")) } + /// Returns the value of `package_vers` above for miri + fn miri_package_vers(&self) -> String { + self.package_vers(&self.release_num("miri")) + } + /// Returns the value of `package_vers` above for rustfmt fn rustfmt_package_vers(&self) -> String { self.package_vers(&self.release_num("rustfmt")) diff --git a/src/bootstrap/tool.rs b/src/bootstrap/tool.rs index d31ea0f8458..9f6db73e6f7 100644 --- a/src/bootstrap/tool.rs +++ b/src/bootstrap/tool.rs @@ -83,6 +83,7 @@ impl Step for ToolBuild { | "rls" | "cargo" | "clippy-driver" + | "miri" => {} _ => return, @@ -218,6 +219,7 @@ pub fn prepare_tool_cargo( if path.ends_with("cargo") || path.ends_with("rls") || path.ends_with("clippy") || + path.ends_with("miri") || path.ends_with("rustfmt") { cargo.env("LIBZ_SYS_STATIC", "1"); @@ -592,6 +594,14 @@ tool_extended!((self, builder), }); }; Miri, miri, "src/tools/miri", "miri", {}; + CargoMiri, miri, "src/tools/miri", "cargo-miri", { + // Miri depends on procedural macros (serde), which requires a full host + // compiler to be available, so we need to depend on that. + builder.ensure(compile::Rustc { + compiler: self.compiler, + target: builder.config.build, + }); + }; Rls, rls, "src/tools/rls", "rls", { let clippy = builder.ensure(Clippy { compiler: self.compiler, |
