11use  crate :: config:: { Channel ,  ConfigInfo } ; 
2- use  crate :: utils:: { run_command,  run_command_with_output_and_env,  walk_dir} ; 
2+ use  crate :: utils:: { 
3+  copy_file,  create_dir,  get_sysroot_dir,  run_command,  run_command_with_output_and_env,  walk_dir, 
4+ } ; 
35use  std:: collections:: HashMap ; 
46use  std:: ffi:: OsStr ; 
57use  std:: fs; 
@@ -55,8 +57,7 @@ impl BuildArg {
5557 } 
5658} 
5759
58- pub  fn  build_sysroot ( env :  & HashMap < String ,  String > ,  config :  & ConfigInfo )  -> Result < ( ) ,  String >  { 
59-  let  start_dir = Path :: new ( "build_sysroot" ) ; 
60+ fn  cleanup_sysroot_previous_build ( start_dir :  & Path )  { 
6061 // Cleanup for previous run 
6162 // Clean target dir except for build scripts and incremental cache 
6263 let  _ = walk_dir ( 
@@ -100,6 +101,26 @@ pub fn build_sysroot(env: &HashMap<String, String>, config: &ConfigInfo) -> Resu
100101 let  _ = fs:: remove_file ( start_dir. join ( "Cargo.lock" ) ) ; 
101102 let  _ = fs:: remove_file ( start_dir. join ( "test_target/Cargo.lock" ) ) ; 
102103 let  _ = fs:: remove_dir_all ( start_dir. join ( "sysroot" ) ) ; 
104+ } 
105+ 
106+ pub  fn  create_build_sysroot_content ( start_dir :  & Path )  -> Result < ( ) ,  String >  { 
107+  if  !start_dir. is_dir ( )  { 
108+  create_dir ( start_dir) ?; 
109+  } 
110+  copy_file ( "build_system/build_sysroot/Cargo.toml" ,  & start_dir. join ( "Cargo.toml" ) ) ?; 
111+ 
112+  let  src_dir = start_dir. join ( "src" ) ; 
113+  if  !src_dir. is_dir ( )  { 
114+  create_dir ( & src_dir) ?; 
115+  } 
116+  copy_file ( "build_system/build_sysroot/lib.rs" ,  & start_dir. join ( "src/lib.rs" ) ) 
117+ } 
118+ 
119+ pub  fn  build_sysroot ( env :  & HashMap < String ,  String > ,  config :  & ConfigInfo )  -> Result < ( ) ,  String >  { 
120+  let  start_dir = get_sysroot_dir ( ) ; 
121+ 
122+  cleanup_sysroot_previous_build ( & start_dir) ; 
123+  create_build_sysroot_content ( & start_dir) ?; 
103124
104125 // Builds libs 
105126 let  mut  rustflags = env. get ( "RUSTFLAGS" ) . cloned ( ) . unwrap_or_default ( ) ; 
@@ -110,7 +131,6 @@ pub fn build_sysroot(env: &HashMap<String, String>, config: &ConfigInfo) -> Resu
110131 if  config. no_default_features  { 
111132 rustflags. push_str ( " -Csymbol-mangling-version=v0" ) ; 
112133 } 
113-  let  mut  env = env. clone ( ) ; 
114134
115135 let  mut  args:  Vec < & dyn  AsRef < OsStr > >  = vec ! [ & "cargo" ,  & "build" ,  & "--target" ,  & config. target] ; 
116136
@@ -127,18 +147,13 @@ pub fn build_sysroot(env: &HashMap<String, String>, config: &ConfigInfo) -> Resu
127147 "debug" 
128148 } ; 
129149
150+  let  mut  env = env. clone ( ) ; 
130151 env. insert ( "RUSTFLAGS" . to_string ( ) ,  rustflags) ; 
131-  run_command_with_output_and_env ( & args,  Some ( start_dir) ,  Some ( & env) ) ?; 
152+  run_command_with_output_and_env ( & args,  Some ( & start_dir) ,  Some ( & env) ) ?; 
132153
133154 // Copy files to sysroot 
134155 let  sysroot_path = start_dir. join ( format ! ( "sysroot/lib/rustlib/{}/lib/" ,  config. target_triple) ) ; 
135-  fs:: create_dir_all ( & sysroot_path) . map_err ( |error| { 
136-  format ! ( 
137-  "Failed to create directory `{}`: {:?}" , 
138-  sysroot_path. display( ) , 
139-  error
140-  ) 
141-  } ) ?; 
156+  create_dir ( & sysroot_path) ?; 
142157 let  copier = |dir_to_copy :  & Path | { 
143158 // FIXME: should not use shell command! 
144159 run_command ( & [ & "cp" ,  & "-r" ,  & dir_to_copy,  & sysroot_path] ,  None ) . map ( |_| ( ) ) 
@@ -151,43 +166,20 @@ pub fn build_sysroot(env: &HashMap<String, String>, config: &ConfigInfo) -> Resu
151166
152167 // Copy the source files to the sysroot (Rust for Linux needs this). 
153168 let  sysroot_src_path = start_dir. join ( "sysroot/lib/rustlib/src/rust" ) ; 
154-  fs:: create_dir_all ( & sysroot_src_path) . map_err ( |error| { 
155-  format ! ( 
156-  "Failed to create directory `{}`: {:?}" , 
157-  sysroot_src_path. display( ) , 
158-  error
159-  ) 
160-  } ) ?; 
161-  run_command ( 
162-  & [ 
163-  & "cp" , 
164-  & "-r" , 
165-  & start_dir. join ( "sysroot_src/library/" ) , 
166-  & sysroot_src_path, 
167-  ] , 
168-  None , 
169-  ) ?; 
169+  create_dir ( & sysroot_src_path) ?; 
170+  run_command ( & [ & "cp" ,  & "-r" ,  & start_dir. join ( "sysroot_src/library/" ) ,  & sysroot_src_path] ,  None ) ?; 
170171
171172 Ok ( ( ) ) 
172173} 
173174
174175fn  build_codegen ( args :  & mut  BuildArg )  -> Result < ( ) ,  String >  { 
175176 let  mut  env = HashMap :: new ( ) ; 
176177
177-  env. insert ( 
178-  "LD_LIBRARY_PATH" . to_string ( ) , 
179-  args. config_info . gcc_path . clone ( ) , 
180-  ) ; 
181-  env. insert ( 
182-  "LIBRARY_PATH" . to_string ( ) , 
183-  args. config_info . gcc_path . clone ( ) , 
184-  ) ; 
178+  env. insert ( "LD_LIBRARY_PATH" . to_string ( ) ,  args. config_info . gcc_path . clone ( ) ) ; 
179+  env. insert ( "LIBRARY_PATH" . to_string ( ) ,  args. config_info . gcc_path . clone ( ) ) ; 
185180
186181 if  args. config_info . no_default_features  { 
187-  env. insert ( 
188-  "RUSTFLAGS" . to_string ( ) , 
189-  "-Csymbol-mangling-version=v0" . to_string ( ) , 
190-  ) ; 
182+  env. insert ( "RUSTFLAGS" . to_string ( ) ,  "-Csymbol-mangling-version=v0" . to_string ( ) ) ; 
191183 } 
192184
193185 let  mut  command:  Vec < & dyn  AsRef < OsStr > >  = vec ! [ & "cargo" ,  & "rustc" ] ; 
@@ -212,12 +204,7 @@ fn build_codegen(args: &mut BuildArg) -> Result<(), String> {
212204 // We voluntarily ignore the error. 
213205 let  _ = fs:: remove_dir_all ( "target/out" ) ; 
214206 let  gccjit_target = "target/out/gccjit" ; 
215-  fs:: create_dir_all ( gccjit_target) . map_err ( |error| { 
216-  format ! ( 
217-  "Failed to create directory `{}`: {:?}" , 
218-  gccjit_target,  error
219-  ) 
220-  } ) ?; 
207+  create_dir ( gccjit_target) ?; 
221208
222209 println ! ( "[BUILD] sysroot" ) ; 
223210 build_sysroot ( & env,  & args. config_info ) ?; 
0 commit comments