@@ -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