@@ -30,6 +30,8 @@ pub fn pkgname(builder: &Builder<'_>, component: &str) -> String {
3030 format ! ( "{}-{}" , component, builder. cargo_package_vers( ) )
3131 } else if component == "rls" {
3232 format ! ( "{}-{}" , component, builder. rls_package_vers( ) )
33+ } else if component == "rust-analyzer" {
34+ format ! ( "{}-{}" , component, builder. rust_analyzer_package_vers( ) )
3335 } else if component == "clippy" {
3436 format ! ( "{}-{}" , component, builder. clippy_package_vers( ) )
3537 } else if component == "miri" {
@@ -1107,7 +1109,10 @@ impl Step for PlainSourceTarball {
11071109 if builder. rust_info . is_git ( ) {
11081110 // Vendor all Cargo dependencies
11091111 let mut cmd = Command :: new ( & builder. initial_cargo ) ;
1110- cmd. arg ( "vendor" ) . current_dir ( & plain_dst_src) ;
1112+ cmd. arg ( "vendor" )
1113+ . arg ( "--sync" )
1114+ . arg ( builder. src . join ( "./src/tools/rust-analyzer/Cargo.toml" ) )
1115+ . current_dir ( & plain_dst_src) ;
11111116 builder. run ( & mut cmd) ;
11121117 }
11131118
@@ -1337,6 +1342,93 @@ impl Step for Rls {
13371342 }
13381343}
13391344
1345+ #[ derive( Debug , PartialOrd , Ord , Copy , Clone , Hash , PartialEq , Eq ) ]
1346+ pub struct RustAnalyzer {
1347+ pub compiler : Compiler ,
1348+ pub target : Interned < String > ,
1349+ }
1350+
1351+ impl Step for RustAnalyzer {
1352+ type Output = PathBuf ;
1353+ const ONLY_HOSTS : bool = true ;
1354+
1355+ fn should_run ( run : ShouldRun < ' _ > ) -> ShouldRun < ' _ > {
1356+ run. path ( "rust-analyzer" )
1357+ }
1358+
1359+ fn make_run ( run : RunConfig < ' _ > ) {
1360+ run. builder . ensure ( RustAnalyzer {
1361+ compiler : run. builder . compiler_for (
1362+ run. builder . top_stage ,
1363+ run. builder . config . build ,
1364+ run. target ,
1365+ ) ,
1366+ target : run. target ,
1367+ } ) ;
1368+ }
1369+
1370+ fn run ( self , builder : & Builder < ' _ > ) -> PathBuf {
1371+ let compiler = self . compiler ;
1372+ let target = self . target ;
1373+ assert ! ( builder. config. extended) ;
1374+
1375+ let src = builder. src . join ( "src/tools/rust-analyzer" ) ;
1376+ let release_num = builder. release_num ( "rust-analyzer/crates/rust-analyzer" ) ;
1377+ let name = pkgname ( builder, "rust-analyzer" ) ;
1378+ let version = builder. rust_analyzer_info . version ( builder, & release_num) ;
1379+
1380+ let tmp = tmpdir ( builder) ;
1381+ let image = tmp. join ( "rust-analyzer-image" ) ;
1382+ drop ( fs:: remove_dir_all ( & image) ) ;
1383+ builder. create_dir ( & image) ;
1384+
1385+ // Prepare the image directory
1386+ // We expect rust-analyer to always build, as it doesn't depend on rustc internals
1387+ // and doesn't have associated toolstate.
1388+ let rust_analyzer = builder
1389+ . ensure ( tool:: RustAnalyzer { compiler, target, extra_features : Vec :: new ( ) } )
1390+ . expect ( "rust-analyzer always builds" ) ;
1391+
1392+ builder. install ( & rust_analyzer, & image. join ( "bin" ) , 0o755 ) ;
1393+ let doc = image. join ( "share/doc/rust-analyzer" ) ;
1394+ builder. install ( & src. join ( "README.md" ) , & doc, 0o644 ) ;
1395+ builder. install ( & src. join ( "LICENSE-APACHE" ) , & doc, 0o644 ) ;
1396+ builder. install ( & src. join ( "LICENSE-MIT" ) , & doc, 0o644 ) ;
1397+
1398+ // Prepare the overlay
1399+ let overlay = tmp. join ( "rust-analyzer-overlay" ) ;
1400+ drop ( fs:: remove_dir_all ( & overlay) ) ;
1401+ t ! ( fs:: create_dir_all( & overlay) ) ;
1402+ builder. install ( & src. join ( "README.md" ) , & overlay, 0o644 ) ;
1403+ builder. install ( & src. join ( "LICENSE-APACHE" ) , & doc, 0o644 ) ;
1404+ builder. install ( & src. join ( "LICENSE-MIT" ) , & doc, 0o644 ) ;
1405+ builder. create ( & overlay. join ( "version" ) , & version) ;
1406+
1407+ // Generate the installer tarball
1408+ let mut cmd = rust_installer ( builder) ;
1409+ cmd. arg ( "generate" )
1410+ . arg ( "--product-name=Rust" )
1411+ . arg ( "--rel-manifest-dir=rustlib" )
1412+ . arg ( "--success-message=rust-analyzer-ready-to-serve." )
1413+ . arg ( "--image-dir" )
1414+ . arg ( & image)
1415+ . arg ( "--work-dir" )
1416+ . arg ( & tmpdir ( builder) )
1417+ . arg ( "--output-dir" )
1418+ . arg ( & distdir ( builder) )
1419+ . arg ( "--non-installed-overlay" )
1420+ . arg ( & overlay)
1421+ . arg ( format ! ( "--package-name={}-{}" , name, target) )
1422+ . arg ( "--legacy-manifest-dirs=rustlib,cargo" )
1423+ . arg ( "--component-name=rust-analyzer-preview" ) ;
1424+
1425+ builder. info ( & format ! ( "Dist rust-analyzer stage{} ({})" , compiler. stage, target) ) ;
1426+ let _time = timeit ( builder) ;
1427+ builder. run ( & mut cmd) ;
1428+ distdir ( builder) . join ( format ! ( "{}-{}.tar.gz" , name, target) )
1429+ }
1430+ }
1431+
13401432#[ derive( Debug , PartialOrd , Ord , Copy , Clone , Hash , PartialEq , Eq ) ]
13411433pub struct Clippy {
13421434 pub compiler : Compiler ,
@@ -1656,6 +1748,7 @@ impl Step for Extended {
16561748 let cargo_installer = builder. ensure ( Cargo { compiler, target } ) ;
16571749 let rustfmt_installer = builder. ensure ( Rustfmt { compiler, target } ) ;
16581750 let rls_installer = builder. ensure ( Rls { compiler, target } ) ;
1751+ let rust_analyzer_installer = builder. ensure ( RustAnalyzer { compiler, target } ) ;
16591752 let llvm_tools_installer = builder. ensure ( LlvmTools { target } ) ;
16601753 let clippy_installer = builder. ensure ( Clippy { compiler, target } ) ;
16611754 let miri_installer = builder. ensure ( Miri { compiler, target } ) ;
@@ -1690,6 +1783,7 @@ impl Step for Extended {
16901783 tarballs. push ( rustc_installer) ;
16911784 tarballs. push ( cargo_installer) ;
16921785 tarballs. extend ( rls_installer. clone ( ) ) ;
1786+ tarballs. push ( rust_analyzer_installer. clone ( ) ) ;
16931787 tarballs. push ( clippy_installer) ;
16941788 tarballs. extend ( miri_installer. clone ( ) ) ;
16951789 tarballs. extend ( rustfmt_installer. clone ( ) ) ;
@@ -1767,6 +1861,7 @@ impl Step for Extended {
17671861 if rls_installer. is_none ( ) {
17681862 contents = filter ( & contents, "rls" ) ;
17691863 }
1864+ contents = filter ( & contents, "rust-analyzer" ) ;
17701865 if miri_installer. is_none ( ) {
17711866 contents = filter ( & contents, "miri" ) ;
17721867 }
@@ -1813,6 +1908,7 @@ impl Step for Extended {
18131908 if rls_installer. is_some ( ) {
18141909 prepare ( "rls" ) ;
18151910 }
1911+ prepare ( "rust-analyzer" ) ;
18161912 if miri_installer. is_some ( ) {
18171913 prepare ( "miri" ) ;
18181914 }
@@ -1846,6 +1942,8 @@ impl Step for Extended {
18461942 format ! ( "{}-{}" , name, target)
18471943 } else if name == "rls" {
18481944 "rls-preview" . to_string ( )
1945+ } else if name == "rust-analyzer" {
1946+ "rust-analyzer-preview" . to_string ( )
18491947 } else if name == "clippy" {
18501948 "clippy-preview" . to_string ( )
18511949 } else if name == "miri" {
@@ -1868,6 +1966,7 @@ impl Step for Extended {
18681966 if rls_installer. is_some ( ) {
18691967 prepare ( "rls" ) ;
18701968 }
1969+ prepare ( "rust-analyzer" ) ;
18711970 if miri_installer. is_some ( ) {
18721971 prepare ( "miri" ) ;
18731972 }
@@ -1967,6 +2066,23 @@ impl Step for Extended {
19672066 . arg ( etc. join ( "msi/remove-duplicates.xsl" ) ) ,
19682067 ) ;
19692068 }
2069+ builder. run (
2070+ Command :: new ( & heat)
2071+ . current_dir ( & exe)
2072+ . arg ( "dir" )
2073+ . arg ( "rust-analyzer" )
2074+ . args ( & heat_flags)
2075+ . arg ( "-cg" )
2076+ . arg ( "RustAnalyzerGroup" )
2077+ . arg ( "-dr" )
2078+ . arg ( "RustAnalyzer" )
2079+ . arg ( "-var" )
2080+ . arg ( "var.RustAnalyzerDir" )
2081+ . arg ( "-out" )
2082+ . arg ( exe. join ( "RustAnalyzerGroup.wxs" ) )
2083+ . arg ( "-t" )
2084+ . arg ( etc. join ( "msi/remove-duplicates.xsl" ) ) ,
2085+ ) ;
19702086 builder. run (
19712087 Command :: new ( & heat)
19722088 . current_dir ( & exe)
@@ -2060,6 +2176,7 @@ impl Step for Extended {
20602176 if rls_installer. is_some ( ) {
20612177 cmd. arg ( "-dRlsDir=rls" ) ;
20622178 }
2179+ cmd. arg ( "-dRustAnalyzerDir=rust-analyzer" ) ;
20632180 if miri_installer. is_some ( ) {
20642181 cmd. arg ( "-dMiriDir=miri" ) ;
20652182 }
@@ -2079,6 +2196,7 @@ impl Step for Extended {
20792196 if rls_installer. is_some ( ) {
20802197 candle ( "RlsGroup.wxs" . as_ref ( ) ) ;
20812198 }
2199+ candle ( "RustAnalyzerGroup.wxs" . as_ref ( ) ) ;
20822200 if miri_installer. is_some ( ) {
20832201 candle ( "MiriGroup.wxs" . as_ref ( ) ) ;
20842202 }
@@ -2116,6 +2234,7 @@ impl Step for Extended {
21162234 if rls_installer. is_some ( ) {
21172235 cmd. arg ( "RlsGroup.wixobj" ) ;
21182236 }
2237+ cmd. arg ( "RustAnalyzerGroup.wixobj" ) ;
21192238 if miri_installer. is_some ( ) {
21202239 cmd. arg ( "MiriGroup.wixobj" ) ;
21212240 }
@@ -2209,6 +2328,7 @@ impl Step for HashSign {
22092328 cmd. arg ( addr) ;
22102329 cmd. arg ( builder. package_vers ( & builder. release_num ( "cargo" ) ) ) ;
22112330 cmd. arg ( builder. package_vers ( & builder. release_num ( "rls" ) ) ) ;
2331+ cmd. arg ( builder. package_vers ( & builder. release_num ( "rust-analyzer/crates/rust-analyzer" ) ) ) ;
22122332 cmd. arg ( builder. package_vers ( & builder. release_num ( "clippy" ) ) ) ;
22132333 cmd. arg ( builder. package_vers ( & builder. release_num ( "miri" ) ) ) ;
22142334 cmd. arg ( builder. package_vers ( & builder. release_num ( "rustfmt" ) ) ) ;
0 commit comments