@@ -47,6 +47,8 @@ pub fn pkgname(builder: &Builder, component: &str) -> String {
4747 format ! ( "{}-{}" , component, builder. rustfmt_package_vers( ) )
4848 } else if component == "llvm-tools" {
4949 format ! ( "{}-{}" , component, builder. llvm_tools_package_vers( ) )
50+ } else if component == "lldb" {
51+ format ! ( "{}-{}" , component, builder. lldb_package_vers( ) )
5052 } else {
5153 assert ! ( component. starts_with( "rust" ) ) ;
5254 format ! ( "{}-{}" , component, builder. rust_package_vers( ) )
@@ -1396,6 +1398,7 @@ impl Step for Extended {
13961398 let rls_installer = builder. ensure ( Rls { stage, target } ) ;
13971399 let llvm_tools_installer = builder. ensure ( LlvmTools { stage, target } ) ;
13981400 let clippy_installer = builder. ensure ( Clippy { stage, target } ) ;
1401+ let lldb_installer = builder. ensure ( Lldb { target } ) ;
13991402 let mingw_installer = builder. ensure ( Mingw { host : target } ) ;
14001403 let analysis_installer = builder. ensure ( Analysis {
14011404 compiler : builder. compiler ( stage, self . host ) ,
@@ -1435,6 +1438,7 @@ impl Step for Extended {
14351438 tarballs. extend ( clippy_installer. clone ( ) ) ;
14361439 tarballs. extend ( rustfmt_installer. clone ( ) ) ;
14371440 tarballs. extend ( llvm_tools_installer. clone ( ) ) ;
1441+ tarballs. extend ( lldb_installer. clone ( ) ) ;
14381442 tarballs. push ( analysis_installer) ;
14391443 tarballs. push ( std_installer) ;
14401444 if builder. config . docs {
@@ -1869,6 +1873,7 @@ impl Step for HashSign {
18691873 cmd. arg ( builder. package_vers ( & builder. release_num ( "clippy" ) ) ) ;
18701874 cmd. arg ( builder. package_vers ( & builder. release_num ( "rustfmt" ) ) ) ;
18711875 cmd. arg ( builder. llvm_tools_package_vers ( ) ) ;
1876+ cmd. arg ( builder. lldb_package_vers ( ) ) ;
18721877 cmd. arg ( addr) ;
18731878
18741879 builder. create_dir ( & distdir ( builder) ) ;
@@ -1963,3 +1968,121 @@ impl Step for LlvmTools {
19631968 Some ( distdir ( builder) . join ( format ! ( "{}-{}.tar.gz" , name, target) ) )
19641969 }
19651970}
1971+
1972+ #[ derive( Clone , Debug , Eq , Hash , PartialEq ) ]
1973+ pub struct Lldb {
1974+ pub target : Interned < String > ,
1975+ }
1976+
1977+ impl Step for Lldb {
1978+ type Output = Option < PathBuf > ;
1979+ const ONLY_HOSTS : bool = true ;
1980+ const DEFAULT : bool = true ;
1981+
1982+ fn should_run ( run : ShouldRun ) -> ShouldRun {
1983+ run. path ( "src/tools/lldb" )
1984+ }
1985+
1986+ fn make_run ( run : RunConfig ) {
1987+ run. builder . ensure ( Lldb {
1988+ target : run. target ,
1989+ } ) ;
1990+ }
1991+
1992+ fn run ( self , builder : & Builder ) -> Option < PathBuf > {
1993+ let target = self . target ;
1994+
1995+ if builder. config . dry_run {
1996+ return None ;
1997+ }
1998+
1999+ let bindir = builder
2000+ . llvm_out ( target)
2001+ . join ( "bin" ) ;
2002+ let lldb_exe = bindir. join ( exe ( "lldb" , & target) ) ;
2003+ if !lldb_exe. exists ( ) {
2004+ return None ;
2005+ }
2006+
2007+ builder. info ( & format ! ( "Dist Lldb ({})" , target) ) ;
2008+ let src = builder. src . join ( "src/tools/lldb" ) ;
2009+ let name = pkgname ( builder, "lldb" ) ;
2010+
2011+ let tmp = tmpdir ( builder) ;
2012+ let image = tmp. join ( "lldb-image" ) ;
2013+ drop ( fs:: remove_dir_all ( & image) ) ;
2014+
2015+ // Prepare the image directory
2016+ let dst = image. join ( "bin" ) ;
2017+ t ! ( fs:: create_dir_all( & dst) ) ;
2018+ for program in & [ "lldb" , "lldb-argdumper" , "lldb-mi" , "lldb-server" ] {
2019+ let exe = bindir. join ( exe ( program, & target) ) ;
2020+ builder. install ( & exe, & dst, 0o755 ) ;
2021+ }
2022+
2023+ // The libraries.
2024+ let libdir = builder. llvm_out ( target) . join ( "lib" ) ;
2025+ let dst = image. join ( "lib" ) ;
2026+ t ! ( fs:: create_dir_all( & dst) ) ;
2027+ for entry in t ! ( fs:: read_dir( & libdir) ) {
2028+ // let entry = t!(entry);
2029+ let entry = entry. unwrap ( ) ;
2030+ if let Ok ( name) = entry. file_name ( ) . into_string ( ) {
2031+ if name. starts_with ( "liblldb." ) && !name. ends_with ( ".a" ) {
2032+ if t ! ( entry. file_type( ) ) . is_symlink ( ) {
2033+ builder. copy_to_folder ( & entry. path ( ) , & dst) ;
2034+ } else {
2035+ builder. install ( & entry. path ( ) , & dst, 0o755 ) ;
2036+ }
2037+ }
2038+ }
2039+ }
2040+
2041+ // The lldb scripts might be installed in lib/python$version
2042+ // or in lib64/python$version. If lib64 exists, use it;
2043+ // otherwise lib.
2044+ let libdir = builder. llvm_out ( target) . join ( "lib64" ) ;
2045+ let ( libdir, libdir_name) = if libdir. exists ( ) {
2046+ ( libdir, "lib64" )
2047+ } else {
2048+ ( builder. llvm_out ( target) . join ( "lib" ) , "lib" )
2049+ } ;
2050+ for entry in t ! ( fs:: read_dir( & libdir) ) {
2051+ let entry = t ! ( entry) ;
2052+ if let Ok ( name) = entry. file_name ( ) . into_string ( ) {
2053+ if name. starts_with ( "python" ) {
2054+ let dst = image. join ( libdir_name)
2055+ . join ( entry. file_name ( ) ) ;
2056+ t ! ( fs:: create_dir_all( & dst) ) ;
2057+ builder. cp_r ( & entry. path ( ) , & dst) ;
2058+ break ;
2059+ }
2060+ }
2061+ }
2062+
2063+ // Prepare the overlay
2064+ let overlay = tmp. join ( "lldb-overlay" ) ;
2065+ drop ( fs:: remove_dir_all ( & overlay) ) ;
2066+ builder. create_dir ( & overlay) ;
2067+ builder. install ( & src. join ( "LICENSE.TXT" ) , & overlay, 0o644 ) ;
2068+ builder. create ( & overlay. join ( "version" ) , & builder. lldb_vers ( ) ) ;
2069+
2070+ // Generate the installer tarball
2071+ let mut cmd = rust_installer ( builder) ;
2072+ cmd. arg ( "generate" )
2073+ . arg ( "--product-name=Rust" )
2074+ . arg ( "--rel-manifest-dir=rustlib" )
2075+ . arg ( "--success-message=lldb-installed." )
2076+ . arg ( "--image-dir" ) . arg ( & image)
2077+ . arg ( "--work-dir" ) . arg ( & tmpdir ( builder) )
2078+ . arg ( "--output-dir" ) . arg ( & distdir ( builder) )
2079+ . arg ( "--non-installed-overlay" ) . arg ( & overlay)
2080+ . arg ( format ! ( "--package-name={}-{}" , name, target) )
2081+ . arg ( "--legacy-manifest-dirs=rustlib,cargo" )
2082+ . arg ( "--component-name=lldb-preview" ) ;
2083+
2084+
2085+ builder. run ( & mut cmd) ;
2086+ Some ( distdir ( builder) . join ( format ! ( "{}-{}.tar.gz" , name, target) ) )
2087+ }
2088+ }
0 commit comments