@@ -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" {
@@ -1267,6 +1269,90 @@ impl Step for Clippy {
12671269 }
12681270}
12691271
1272+ #[ derive( Debug , PartialOrd , Ord , Copy , Clone , Hash , PartialEq , Eq ) ]
1273+ pub struct Miri {
1274+ pub stage : u32 ,
1275+ pub target : Interned < String > ,
1276+ }
1277+
1278+ impl Step for Miri {
1279+ type Output = Option < PathBuf > ;
1280+ const ONLY_HOSTS : bool = true ;
1281+
1282+ fn should_run ( run : ShouldRun ) -> ShouldRun {
1283+ run. path ( "miri" )
1284+ }
1285+
1286+ fn make_run ( run : RunConfig ) {
1287+ run. builder . ensure ( Miri {
1288+ stage : run. builder . top_stage ,
1289+ target : run. target ,
1290+ } ) ;
1291+ }
1292+
1293+ fn run ( self , builder : & Builder ) -> Option < PathBuf > {
1294+ let stage = self . stage ;
1295+ let target = self . target ;
1296+ assert ! ( builder. config. extended) ;
1297+
1298+ builder. info ( & format ! ( "Dist miri stage{} ({})" , stage, target) ) ;
1299+ let src = builder. src . join ( "src/tools/miri" ) ;
1300+ let release_num = builder. release_num ( "miri" ) ;
1301+ let name = pkgname ( builder, "miri" ) ;
1302+ let version = builder. miri_info . version ( builder, & release_num) ;
1303+
1304+ let tmp = tmpdir ( builder) ;
1305+ let image = tmp. join ( "miri-image" ) ;
1306+ drop ( fs:: remove_dir_all ( & image) ) ;
1307+ builder. create_dir ( & image) ;
1308+
1309+ // Prepare the image directory
1310+ // We expect miri to build, because we've exited this step above if tool
1311+ // state for miri isn't testing.
1312+ let miri = builder. ensure ( tool:: Miri {
1313+ compiler : builder. compiler ( stage, builder. config . build ) ,
1314+ target, extra_features : Vec :: new ( )
1315+ } ) . or_else ( || { missing_tool ( "miri" , builder. build . config . missing_tools ) ; None } ) ?;
1316+ let cargomiri = builder. ensure ( tool:: CargoMiri {
1317+ compiler : builder. compiler ( stage, builder. config . build ) ,
1318+ target, extra_features : Vec :: new ( )
1319+ } ) . or_else ( || { missing_tool ( "cargo miri" , builder. build . config . missing_tools ) ; None } ) ?;
1320+
1321+ builder. install ( & miri, & image. join ( "bin" ) , 0o755 ) ;
1322+ builder. install ( & cargomiri, & image. join ( "bin" ) , 0o755 ) ;
1323+ let doc = image. join ( "share/doc/miri" ) ;
1324+ builder. install ( & src. join ( "README.md" ) , & doc, 0o644 ) ;
1325+ builder. install ( & src. join ( "LICENSE-APACHE" ) , & doc, 0o644 ) ;
1326+ builder. install ( & src. join ( "LICENSE-MIT" ) , & doc, 0o644 ) ;
1327+
1328+ // Prepare the overlay
1329+ let overlay = tmp. join ( "miri-overlay" ) ;
1330+ drop ( fs:: remove_dir_all ( & overlay) ) ;
1331+ t ! ( fs:: create_dir_all( & overlay) ) ;
1332+ builder. install ( & src. join ( "README.md" ) , & overlay, 0o644 ) ;
1333+ builder. install ( & src. join ( "LICENSE-APACHE" ) , & doc, 0o644 ) ;
1334+ builder. install ( & src. join ( "LICENSE-MIT" ) , & doc, 0o644 ) ;
1335+ builder. create ( & overlay. join ( "version" ) , & version) ;
1336+
1337+ // Generate the installer tarball
1338+ let mut cmd = rust_installer ( builder) ;
1339+ cmd. arg ( "generate" )
1340+ . arg ( "--product-name=Rust" )
1341+ . arg ( "--rel-manifest-dir=rustlib" )
1342+ . arg ( "--success-message=miri-ready-to-serve." )
1343+ . arg ( "--image-dir" ) . arg ( & image)
1344+ . arg ( "--work-dir" ) . arg ( & tmpdir ( builder) )
1345+ . arg ( "--output-dir" ) . arg ( & distdir ( builder) )
1346+ . arg ( "--non-installed-overlay" ) . arg ( & overlay)
1347+ . arg ( format ! ( "--package-name={}-{}" , name, target) )
1348+ . arg ( "--legacy-manifest-dirs=rustlib,cargo" )
1349+ . arg ( "--component-name=miri-preview" ) ;
1350+
1351+ builder. run ( & mut cmd) ;
1352+ Some ( distdir ( builder) . join ( format ! ( "{}-{}.tar.gz" , name, target) ) )
1353+ }
1354+ }
1355+
12701356#[ derive( Debug , PartialOrd , Ord , Copy , Clone , Hash , PartialEq , Eq ) ]
12711357pub struct Rustfmt {
12721358 pub stage : u32 ,
@@ -1388,6 +1474,7 @@ impl Step for Extended {
13881474 let rls_installer = builder. ensure ( Rls { stage, target } ) ;
13891475 let llvm_tools_installer = builder. ensure ( LlvmTools { stage, target } ) ;
13901476 let clippy_installer = builder. ensure ( Clippy { stage, target } ) ;
1477+ let miri_installer = builder. ensure ( Miri { stage, target } ) ;
13911478 let lldb_installer = builder. ensure ( Lldb { target } ) ;
13921479 let mingw_installer = builder. ensure ( Mingw { host : target } ) ;
13931480 let analysis_installer = builder. ensure ( Analysis {
@@ -1426,6 +1513,7 @@ impl Step for Extended {
14261513 tarballs. push ( cargo_installer) ;
14271514 tarballs. extend ( rls_installer. clone ( ) ) ;
14281515 tarballs. extend ( clippy_installer. clone ( ) ) ;
1516+ tarballs. extend ( miri_installer. clone ( ) ) ;
14291517 tarballs. extend ( rustfmt_installer. clone ( ) ) ;
14301518 tarballs. extend ( llvm_tools_installer) ;
14311519 tarballs. extend ( lldb_installer) ;
@@ -1498,6 +1586,9 @@ impl Step for Extended {
14981586 if clippy_installer. is_none ( ) {
14991587 contents = filter ( & contents, "clippy" ) ;
15001588 }
1589+ if miri_installer. is_none ( ) {
1590+ contents = filter ( & contents, "miri" ) ;
1591+ }
15011592 if rustfmt_installer. is_none ( ) {
15021593 contents = filter ( & contents, "rustfmt" ) ;
15031594 }
@@ -1538,6 +1629,9 @@ impl Step for Extended {
15381629 if clippy_installer. is_some ( ) {
15391630 prepare ( "clippy" ) ;
15401631 }
1632+ if miri_installer. is_some ( ) {
1633+ prepare ( "miri" ) ;
1634+ }
15411635
15421636 // create an 'uninstall' package
15431637 builder. install ( & etc. join ( "pkg/postinstall" ) , & pkg. join ( "uninstall" ) , 0o755 ) ;
@@ -1568,6 +1662,8 @@ impl Step for Extended {
15681662 "rls-preview" . to_string ( )
15691663 } else if name == "clippy" {
15701664 "clippy-preview" . to_string ( )
1665+ } else if name == "miri" {
1666+ "miri-preview" . to_string ( )
15711667 } else {
15721668 name. to_string ( )
15731669 } ;
@@ -1587,6 +1683,9 @@ impl Step for Extended {
15871683 if clippy_installer. is_some ( ) {
15881684 prepare ( "clippy" ) ;
15891685 }
1686+ if miri_installer. is_some ( ) {
1687+ prepare ( "miri" ) ;
1688+ }
15901689 if target. contains ( "windows-gnu" ) {
15911690 prepare ( "rust-mingw" ) ;
15921691 }
@@ -1679,6 +1778,18 @@ impl Step for Extended {
16791778 . arg ( "-out" ) . arg ( exe. join ( "ClippyGroup.wxs" ) )
16801779 . arg ( "-t" ) . arg ( etc. join ( "msi/remove-duplicates.xsl" ) ) ) ;
16811780 }
1781+ if miri_installer. is_some ( ) {
1782+ builder. run ( Command :: new ( & heat)
1783+ . current_dir ( & exe)
1784+ . arg ( "dir" )
1785+ . arg ( "miri" )
1786+ . args ( & heat_flags)
1787+ . arg ( "-cg" ) . arg ( "MiriGroup" )
1788+ . arg ( "-dr" ) . arg ( "Miri" )
1789+ . arg ( "-var" ) . arg ( "var.MiriDir" )
1790+ . arg ( "-out" ) . arg ( exe. join ( "MiriGroup.wxs" ) )
1791+ . arg ( "-t" ) . arg ( etc. join ( "msi/remove-duplicates.xsl" ) ) ) ;
1792+ }
16821793 builder. run ( Command :: new ( & heat)
16831794 . current_dir ( & exe)
16841795 . arg ( "dir" )
@@ -1724,6 +1835,9 @@ impl Step for Extended {
17241835 if clippy_installer. is_some ( ) {
17251836 cmd. arg ( "-dClippyDir=clippy" ) ;
17261837 }
1838+ if miri_installer. is_some ( ) {
1839+ cmd. arg ( "-dMiriDir=miri" ) ;
1840+ }
17271841 if target. contains ( "windows-gnu" ) {
17281842 cmd. arg ( "-dGccDir=rust-mingw" ) ;
17291843 }
@@ -1742,6 +1856,9 @@ impl Step for Extended {
17421856 if clippy_installer. is_some ( ) {
17431857 candle ( "ClippyGroup.wxs" . as_ref ( ) ) ;
17441858 }
1859+ if miri_installer. is_some ( ) {
1860+ candle ( "MiriGroup.wxs" . as_ref ( ) ) ;
1861+ }
17451862 candle ( "AnalysisGroup.wxs" . as_ref ( ) ) ;
17461863
17471864 if target. contains ( "windows-gnu" ) {
@@ -1774,6 +1891,9 @@ impl Step for Extended {
17741891 if clippy_installer. is_some ( ) {
17751892 cmd. arg ( "ClippyGroup.wixobj" ) ;
17761893 }
1894+ if miri_installer. is_some ( ) {
1895+ cmd. arg ( "MiriGroup.wixobj" ) ;
1896+ }
17771897
17781898 if target. contains ( "windows-gnu" ) {
17791899 cmd. arg ( "GccGroup.wixobj" ) ;
@@ -1859,6 +1979,7 @@ impl Step for HashSign {
18591979 cmd. arg ( builder. package_vers ( & builder. release_num ( "cargo" ) ) ) ;
18601980 cmd. arg ( builder. package_vers ( & builder. release_num ( "rls" ) ) ) ;
18611981 cmd. arg ( builder. package_vers ( & builder. release_num ( "clippy" ) ) ) ;
1982+ cmd. arg ( builder. package_vers ( & builder. release_num ( "miri" ) ) ) ;
18621983 cmd. arg ( builder. package_vers ( & builder. release_num ( "rustfmt" ) ) ) ;
18631984 cmd. arg ( builder. llvm_tools_package_vers ( ) ) ;
18641985 cmd. arg ( builder. lldb_package_vers ( ) ) ;
0 commit comments