@@ -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 ) ]
12791365pub 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 ( ) ) ;
0 commit comments