@@ -102,10 +102,10 @@ def verify(path, sha_path, verbose):
102102 return verified
103103
104104
105- def unpack (tarball , dst , verbose = False , match = None ):
105+ def unpack (tarball , tarball_suffix , dst , verbose = False , match = None ):
106106 """Unpack the given tarball file"""
107107 print ("extracting" , tarball )
108- fname = os .path .basename (tarball ).replace (".tar.gz" , "" )
108+ fname = os .path .basename (tarball ).replace (tarball_suffix , "" )
109109 with contextlib .closing (tarfile .open (tarball )) as tar :
110110 for member in tar .getnames ():
111111 if "/" not in member :
@@ -331,6 +331,7 @@ def __init__(self):
331331 self .use_vendored_sources = ''
332332 self .verbose = False
333333
334+
334335 def download_stage0 (self ):
335336 """Fetch the build system for Rust, written in Rust
336337
@@ -344,18 +345,30 @@ def download_stage0(self):
344345 rustc_channel = self .rustc_channel
345346 cargo_channel = self .cargo_channel
346347
348+ def support_xz ():
349+ try :
350+ with tempfile .NamedTemporaryFile (delete = False ) as temp_file :
351+ temp_path = temp_file .name
352+ with tarfile .open (temp_path , "w:xz" ) as tar :
353+ pass
354+ return True
355+ except tarfile .CompressionError :
356+ return False
357+
347358 if self .rustc ().startswith (self .bin_root ()) and \
348359 (not os .path .exists (self .rustc ()) or
349360 self .program_out_of_date (self .rustc_stamp ())):
350361 if os .path .exists (self .bin_root ()):
351362 shutil .rmtree (self .bin_root ())
352- filename = "rust-std-{}-{}.tar.gz" .format (
353- rustc_channel , self .build )
363+ tarball_suffix = '.tar.xz' if support_xz () else '.tar.gz'
364+ filename = "rust-std-{}-{}{}" .format (
365+ rustc_channel , self .build , tarball_suffix )
354366 pattern = "rust-std-{}" .format (self .build )
355- self ._download_stage0_helper (filename , pattern )
367+ self ._download_stage0_helper (filename , pattern , tarball_suffix )
356368
357- filename = "rustc-{}-{}.tar.gz" .format (rustc_channel , self .build )
358- self ._download_stage0_helper (filename , "rustc" )
369+ filename = "rustc-{}-{}{}" .format (rustc_channel , self .build ,
370+ tarball_suffix )
371+ self ._download_stage0_helper (filename , "rustc" , tarball_suffix )
359372 self .fix_executable ("{}/bin/rustc" .format (self .bin_root ()))
360373 self .fix_executable ("{}/bin/rustdoc" .format (self .bin_root ()))
361374 with output (self .rustc_stamp ()) as rust_stamp :
@@ -365,20 +378,22 @@ def download_stage0(self):
365378 # libraries/binaries that are included in rust-std with
366379 # the system MinGW ones.
367380 if "pc-windows-gnu" in self .build :
368- filename = "rust-mingw-{}-{}.tar.gz " .format (
369- rustc_channel , self .build )
370- self ._download_stage0_helper (filename , "rust-mingw" )
381+ filename = "rust-mingw-{}-{}{} " .format (
382+ rustc_channel , self .build , tarball_suffix )
383+ self ._download_stage0_helper (filename , "rust-mingw" , tarball_suffix )
371384
372385 if self .cargo ().startswith (self .bin_root ()) and \
373386 (not os .path .exists (self .cargo ()) or
374387 self .program_out_of_date (self .cargo_stamp ())):
375- filename = "cargo-{}-{}.tar.gz" .format (cargo_channel , self .build )
376- self ._download_stage0_helper (filename , "cargo" )
388+ tarball_suffix = '.tar.xz' if support_xz () else '.tar.gz'
389+ filename = "cargo-{}-{}{}" .format (cargo_channel , self .build ,
390+ tarball_suffix )
391+ self ._download_stage0_helper (filename , "cargo" , tarball_suffix )
377392 self .fix_executable ("{}/bin/cargo" .format (self .bin_root ()))
378393 with output (self .cargo_stamp ()) as cargo_stamp :
379394 cargo_stamp .write (self .date )
380395
381- def _download_stage0_helper (self , filename , pattern ):
396+ def _download_stage0_helper (self , filename , pattern , tarball_suffix ):
382397 cache_dst = os .path .join (self .build_dir , "cache" )
383398 rustc_cache = os .path .join (cache_dst , self .date )
384399 if not os .path .exists (rustc_cache ):
@@ -388,7 +403,7 @@ def _download_stage0_helper(self, filename, pattern):
388403 tarball = os .path .join (rustc_cache , filename )
389404 if not os .path .exists (tarball ):
390405 get ("{}/{}" .format (url , filename ), tarball , verbose = self .verbose )
391- unpack (tarball , self .bin_root (), match = pattern , verbose = self .verbose )
406+ unpack (tarball , tarball_suffix , self .bin_root (), match = pattern , verbose = self .verbose )
392407
393408 @staticmethod
394409 def fix_executable (fname ):
0 commit comments