Hex Artifact Content
Not logged in

Artifact 6512ebcb005f53956fa4ca8d1ced76312ee6620b:


0000: 23 20 43 6f 70 79 72 69 67 68 74 20 32 30 31 35  # Copyright 2015
0010: 2d 32 30 31 36 20 54 68 65 20 52 75 73 74 20 50  -2016 The Rust P
0020: 72 6f 6a 65 63 74 20 44 65 76 65 6c 6f 70 65 72  roject Developer
0030: 73 2e 20 53 65 65 20 74 68 65 20 43 4f 50 59 52  s. See the COPYR
0040: 49 47 48 54 0a 23 20 66 69 6c 65 20 61 74 20 74  IGHT.# file at t
0050: 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 64 69 72  he top-level dir
0060: 65 63 74 6f 72 79 20 6f 66 20 74 68 69 73 20 64  ectory of this d
0070: 69 73 74 72 69 62 75 74 69 6f 6e 20 61 6e 64 20  istribution and 
0080: 61 74 0a 23 20 68 74 74 70 3a 2f 2f 72 75 73 74  at.# http://rust
0090: 2d 6c 61 6e 67 2e 6f 72 67 2f 43 4f 50 59 52 49  -lang.org/COPYRI
00a0: 47 48 54 2e 0a 23 0a 23 20 4c 69 63 65 6e 73 65  GHT..#.# License
00b0: 64 20 75 6e 64 65 72 20 74 68 65 20 41 70 61 63  d under the Apac
00c0: 68 65 20 4c 69 63 65 6e 73 65 2c 20 56 65 72 73  he License, Vers
00d0: 69 6f 6e 20 32 2e 30 20 3c 4c 49 43 45 4e 53 45  ion 2.0 <LICENSE
00e0: 2d 41 50 41 43 48 45 20 6f 72 0a 23 20 68 74 74  -APACHE or.# htt
00f0: 70 3a 2f 2f 77 77 77 2e 61 70 61 63 68 65 2e 6f  p://www.apache.o
0100: 72 67 2f 6c 69 63 65 6e 73 65 73 2f 4c 49 43 45  rg/licenses/LICE
0110: 4e 53 45 2d 32 2e 30 3e 20 6f 72 20 74 68 65 20  NSE-2.0> or the 
0120: 4d 49 54 20 6c 69 63 65 6e 73 65 0a 23 20 3c 4c  MIT license.# <L
0130: 49 43 45 4e 53 45 2d 4d 49 54 20 6f 72 20 68 74  ICENSE-MIT or ht
0140: 74 70 3a 2f 2f 6f 70 65 6e 73 6f 75 72 63 65 2e  tp://opensource.
0150: 6f 72 67 2f 6c 69 63 65 6e 73 65 73 2f 4d 49 54  org/licenses/MIT
0160: 3e 2c 20 61 74 20 79 6f 75 72 0a 23 20 6f 70 74  >, at your.# opt
0170: 69 6f 6e 2e 20 54 68 69 73 20 66 69 6c 65 20 6d  ion. This file m
0180: 61 79 20 6e 6f 74 20 62 65 20 63 6f 70 69 65 64  ay not be copied
0190: 2c 20 6d 6f 64 69 66 69 65 64 2c 20 6f 72 20 64  , modified, or d
01a0: 69 73 74 72 69 62 75 74 65 64 0a 23 20 65 78 63  istributed.# exc
01b0: 65 70 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ept according to
01c0: 20 74 68 6f 73 65 20 74 65 72 6d 73 2e 0a 0a 66   those terms...f
01d0: 72 6f 6d 20 5f 5f 66 75 74 75 72 65 5f 5f 20 69  rom __future__ i
01e0: 6d 70 6f 72 74 20 70 72 69 6e 74 5f 66 75 6e 63  mport print_func
01f0: 74 69 6f 6e 0a 69 6d 70 6f 72 74 20 61 72 67 70  tion.import argp
0200: 61 72 73 65 0a 69 6d 70 6f 72 74 20 63 6f 6e 74  arse.import cont
0210: 65 78 74 6c 69 62 0a 69 6d 70 6f 72 74 20 64 61  extlib.import da
0220: 74 65 74 69 6d 65 0a 69 6d 70 6f 72 74 20 68 61  tetime.import ha
0230: 73 68 6c 69 62 0a 69 6d 70 6f 72 74 20 6f 73 0a  shlib.import os.
0240: 69 6d 70 6f 72 74 20 73 68 75 74 69 6c 0a 69 6d  import shutil.im
0250: 70 6f 72 74 20 73 75 62 70 72 6f 63 65 73 73 0a  port subprocess.
0260: 69 6d 70 6f 72 74 20 73 79 73 0a 69 6d 70 6f 72  import sys.impor
0270: 74 20 74 61 72 66 69 6c 65 0a 69 6d 70 6f 72 74  t tarfile.import
0280: 20 74 65 6d 70 66 69 6c 65 0a 0a 66 72 6f 6d 20   tempfile..from 
0290: 74 69 6d 65 20 69 6d 70 6f 72 74 20 74 69 6d 65  time import time
02a0: 0a 0a 0a 64 65 66 20 67 65 74 28 75 72 6c 2c 20  ...def get(url, 
02b0: 70 61 74 68 2c 20 76 65 72 62 6f 73 65 3d 46 61  path, verbose=Fa
02c0: 6c 73 65 29 3a 0a 20 20 20 20 73 68 61 5f 75 72  lse):.    sha_ur
02d0: 6c 20 3d 20 75 72 6c 20 2b 20 22 2e 73 68 61 32  l = url + ".sha2
02e0: 35 36 22 0a 20 20 20 20 77 69 74 68 20 74 65 6d  56".    with tem
02f0: 70 66 69 6c 65 2e 4e 61 6d 65 64 54 65 6d 70 6f  pfile.NamedTempo
0300: 72 61 72 79 46 69 6c 65 28 64 65 6c 65 74 65 3d  raryFile(delete=
0310: 46 61 6c 73 65 29 20 61 73 20 74 65 6d 70 5f 66  False) as temp_f
0320: 69 6c 65 3a 0a 20 20 20 20 20 20 20 20 74 65 6d  ile:.        tem
0330: 70 5f 70 61 74 68 20 3d 20 74 65 6d 70 5f 66 69  p_path = temp_fi
0340: 6c 65 2e 6e 61 6d 65 0a 20 20 20 20 77 69 74 68  le.name.    with
0350: 20 74 65 6d 70 66 69 6c 65 2e 4e 61 6d 65 64 54   tempfile.NamedT
0360: 65 6d 70 6f 72 61 72 79 46 69 6c 65 28 73 75 66  emporaryFile(suf
0370: 66 69 78 3d 22 2e 73 68 61 32 35 36 22 2c 20 64  fix=".sha256", d
0380: 65 6c 65 74 65 3d 46 61 6c 73 65 29 20 61 73 20  elete=False) as 
0390: 73 68 61 5f 66 69 6c 65 3a 0a 20 20 20 20 20 20  sha_file:.      
03a0: 20 20 73 68 61 5f 70 61 74 68 20 3d 20 73 68 61    sha_path = sha
03b0: 5f 66 69 6c 65 2e 6e 61 6d 65 0a 0a 20 20 20 20  _file.name..    
03c0: 74 72 79 3a 0a 20 20 20 20 20 20 20 20 64 6f 77  try:.        dow
03d0: 6e 6c 6f 61 64 28 73 68 61 5f 70 61 74 68 2c 20  nload(sha_path, 
03e0: 73 68 61 5f 75 72 6c 2c 20 46 61 6c 73 65 2c 20  sha_url, False, 
03f0: 76 65 72 62 6f 73 65 29 0a 20 20 20 20 20 20 20  verbose).       
0400: 20 69 66 20 6f 73 2e 70 61 74 68 2e 65 78 69 73   if os.path.exis
0410: 74 73 28 70 61 74 68 29 3a 0a 20 20 20 20 20 20  ts(path):.      
0420: 20 20 20 20 20 20 69 66 20 76 65 72 69 66 79 28        if verify(
0430: 70 61 74 68 2c 20 73 68 61 5f 70 61 74 68 2c 20  path, sha_path, 
0440: 46 61 6c 73 65 29 3a 0a 20 20 20 20 20 20 20 20  False):.        
0450: 20 20 20 20 20 20 20 20 69 66 20 76 65 72 62 6f          if verbo
0460: 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  se:.            
0470: 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 22 75          print("u
0480: 73 69 6e 67 20 61 6c 72 65 61 64 79 2d 64 6f 77  sing already-dow
0490: 6e 6c 6f 61 64 20 66 69 6c 65 20 22 20 2b 20 70  nload file " + p
04a0: 61 74 68 29 0a 20 20 20 20 20 20 20 20 20 20 20  ath).           
04b0: 20 20 20 20 20 72 65 74 75 72 6e 0a 20 20 20 20       return.    
04c0: 20 20 20 20 20 20 20 20 65 6c 73 65 3a 0a 20 20          else:.  
04d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
04e0: 20 76 65 72 62 6f 73 65 3a 0a 20 20 20 20 20 20   verbose:.      
04f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
0500: 69 6e 74 28 22 69 67 6e 6f 72 69 6e 67 20 61 6c  int("ignoring al
0510: 72 65 61 64 79 2d 64 6f 77 6e 6c 6f 61 64 20 66  ready-download f
0520: 69 6c 65 20 22 20 2b 20 70 61 74 68 20 2b 20 22  ile " + path + "
0530: 20 64 75 65 20 74 6f 20 66 61 69 6c 65 64 20 76   due to failed v
0540: 65 72 69 66 69 63 61 74 69 6f 6e 22 29 0a 20 20  erification").  
0550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 73                os
0560: 2e 75 6e 6c 69 6e 6b 28 70 61 74 68 29 0a 20 20  .unlink(path).  
0570: 20 20 20 20 20 20 64 6f 77 6e 6c 6f 61 64 28 74        download(t
0580: 65 6d 70 5f 70 61 74 68 2c 20 75 72 6c 2c 20 54  emp_path, url, T
0590: 72 75 65 2c 20 76 65 72 62 6f 73 65 29 0a 20 20  rue, verbose).  
05a0: 20 20 20 20 20 20 69 66 20 6e 6f 74 20 76 65 72        if not ver
05b0: 69 66 79 28 74 65 6d 70 5f 70 61 74 68 2c 20 73  ify(temp_path, s
05c0: 68 61 5f 70 61 74 68 2c 20 76 65 72 62 6f 73 65  ha_path, verbose
05d0: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ):.            r
05e0: 61 69 73 65 20 52 75 6e 74 69 6d 65 45 72 72 6f  aise RuntimeErro
05f0: 72 28 22 66 61 69 6c 65 64 20 76 65 72 69 66 69  r("failed verifi
0600: 63 61 74 69 6f 6e 22 29 0a 20 20 20 20 20 20 20  cation").       
0610: 20 69 66 20 76 65 72 62 6f 73 65 3a 0a 20 20 20   if verbose:.   
0620: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 22           print("
0630: 6d 6f 76 69 6e 67 20 7b 7d 20 74 6f 20 7b 7d 22  moving {} to {}"
0640: 2e 66 6f 72 6d 61 74 28 74 65 6d 70 5f 70 61 74  .format(temp_pat
0650: 68 2c 20 70 61 74 68 29 29 0a 20 20 20 20 20 20  h, path)).      
0660: 20 20 73 68 75 74 69 6c 2e 6d 6f 76 65 28 74 65    shutil.move(te
0670: 6d 70 5f 70 61 74 68 2c 20 70 61 74 68 29 0a 20  mp_path, path). 
0680: 20 20 20 66 69 6e 61 6c 6c 79 3a 0a 20 20 20 20     finally:.    
0690: 20 20 20 20 64 65 6c 65 74 65 5f 69 66 5f 70 72      delete_if_pr
06a0: 65 73 65 6e 74 28 73 68 61 5f 70 61 74 68 2c 20  esent(sha_path, 
06b0: 76 65 72 62 6f 73 65 29 0a 20 20 20 20 20 20 20  verbose).       
06c0: 20 64 65 6c 65 74 65 5f 69 66 5f 70 72 65 73 65   delete_if_prese
06d0: 6e 74 28 74 65 6d 70 5f 70 61 74 68 2c 20 76 65  nt(temp_path, ve
06e0: 72 62 6f 73 65 29 0a 0a 0a 64 65 66 20 64 65 6c  rbose)...def del
06f0: 65 74 65 5f 69 66 5f 70 72 65 73 65 6e 74 28 70  ete_if_present(p
0700: 61 74 68 2c 20 76 65 72 62 6f 73 65 29 3a 0a 20  ath, verbose):. 
0710: 20 20 20 69 66 20 6f 73 2e 70 61 74 68 2e 69 73     if os.path.is
0720: 66 69 6c 65 28 70 61 74 68 29 3a 0a 20 20 20 20  file(path):.    
0730: 20 20 20 20 69 66 20 76 65 72 62 6f 73 65 3a 0a      if verbose:.
0740: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e              prin
0750: 74 28 22 72 65 6d 6f 76 69 6e 67 20 22 20 2b 20  t("removing " + 
0760: 70 61 74 68 29 0a 20 20 20 20 20 20 20 20 6f 73  path).        os
0770: 2e 75 6e 6c 69 6e 6b 28 70 61 74 68 29 0a 0a 0a  .unlink(path)...
0780: 64 65 66 20 64 6f 77 6e 6c 6f 61 64 28 70 61 74  def download(pat
0790: 68 2c 20 75 72 6c 2c 20 70 72 6f 62 61 62 6c 79  h, url, probably
07a0: 5f 62 69 67 2c 20 76 65 72 62 6f 73 65 29 3a 0a  _big, verbose):.
07b0: 20 20 20 20 66 6f 72 20 78 20 69 6e 20 72 61 6e      for x in ran
07c0: 67 65 28 30 2c 20 34 29 3a 0a 20 20 20 20 20 20  ge(0, 4):.      
07d0: 20 20 74 72 79 3a 0a 20 20 20 20 20 20 20 20 20    try:.         
07e0: 20 20 20 5f 64 6f 77 6e 6c 6f 61 64 28 70 61 74     _download(pat
07f0: 68 2c 20 75 72 6c 2c 20 70 72 6f 62 61 62 6c 79  h, url, probably
0800: 5f 62 69 67 2c 20 76 65 72 62 6f 73 65 2c 20 54  _big, verbose, T
0810: 72 75 65 29 0a 20 20 20 20 20 20 20 20 20 20 20  rue).           
0820: 20 72 65 74 75 72 6e 0a 20 20 20 20 20 20 20 20   return.        
0830: 65 78 63 65 70 74 20 52 75 6e 74 69 6d 65 45 72  except RuntimeEr
0840: 72 6f 72 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ror:.           
0850: 20 70 72 69 6e 74 28 22 5c 6e 73 70 75 72 69 6f   print("\nspurio
0860: 75 73 20 66 61 69 6c 75 72 65 2c 20 74 72 79 69  us failure, tryi
0870: 6e 67 20 61 67 61 69 6e 22 29 0a 20 20 20 20 5f  ng again").    _
0880: 64 6f 77 6e 6c 6f 61 64 28 70 61 74 68 2c 20 75  download(path, u
0890: 72 6c 2c 20 70 72 6f 62 61 62 6c 79 5f 62 69 67  rl, probably_big
08a0: 2c 20 76 65 72 62 6f 73 65 2c 20 46 61 6c 73 65  , verbose, False
08b0: 29 0a 0a 0a 64 65 66 20 5f 64 6f 77 6e 6c 6f 61  )...def _downloa
08c0: 64 28 70 61 74 68 2c 20 75 72 6c 2c 20 70 72 6f  d(path, url, pro
08d0: 62 61 62 6c 79 5f 62 69 67 2c 20 76 65 72 62 6f  bably_big, verbo
08e0: 73 65 2c 20 65 78 63 65 70 74 69 6f 6e 29 3a 0a  se, exception):.
08f0: 20 20 20 20 69 66 20 70 72 6f 62 61 62 6c 79 5f      if probably_
0900: 62 69 67 20 6f 72 20 76 65 72 62 6f 73 65 3a 0a  big or verbose:.
0910: 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 22 64          print("d
0920: 6f 77 6e 6c 6f 61 64 69 6e 67 20 7b 7d 22 2e 66  ownloading {}".f
0930: 6f 72 6d 61 74 28 75 72 6c 29 29 0a 20 20 20 20  ormat(url)).    
0940: 23 20 73 65 65 20 68 74 74 70 3a 2f 2f 73 65 72  # see http://ser
0950: 76 65 72 66 61 75 6c 74 2e 63 6f 6d 2f 71 75 65  verfault.com/que
0960: 73 74 69 6f 6e 73 2f 33 30 31 31 32 38 2f 68 6f  stions/301128/ho
0970: 77 2d 74 6f 2d 64 6f 77 6e 6c 6f 61 64 0a 20 20  w-to-download.  
0980: 20 20 69 66 20 73 79 73 2e 70 6c 61 74 66 6f 72    if sys.platfor
0990: 6d 20 3d 3d 20 27 77 69 6e 33 32 27 3a 0a 20 20  m == 'win32':.  
09a0: 20 20 20 20 20 20 72 75 6e 28 5b 22 50 6f 77 65        run(["Powe
09b0: 72 53 68 65 6c 6c 2e 65 78 65 22 2c 20 22 2f 6e  rShell.exe", "/n
09c0: 6f 6c 6f 67 6f 22 2c 20 22 2d 43 6f 6d 6d 61 6e  ologo", "-Comman
09d0: 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  d",.            
09e0: 20 22 28 4e 65 77 2d 4f 62 6a 65 63 74 20 53 79   "(New-Object Sy
09f0: 73 74 65 6d 2e 4e 65 74 2e 57 65 62 43 6c 69 65  stem.Net.WebClie
0a00: 6e 74 29 22 0a 20 20 20 20 20 20 20 20 20 20 20  nt)".           
0a10: 20 20 22 2e 44 6f 77 6e 6c 6f 61 64 46 69 6c 65    ".DownloadFile
0a20: 28 27 7b 7d 27 2c 20 27 7b 7d 27 29 22 2e 66 6f  ('{}', '{}')".fo
0a30: 72 6d 61 74 28 75 72 6c 2c 20 70 61 74 68 29 5d  rmat(url, path)]
0a40: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 65  ,.            ve
0a50: 72 62 6f 73 65 3d 76 65 72 62 6f 73 65 2c 0a 20  rbose=verbose,. 
0a60: 20 20 20 20 20 20 20 20 20 20 20 65 78 63 65 70             excep
0a70: 74 69 6f 6e 3d 65 78 63 65 70 74 69 6f 6e 29 0a  tion=exception).
0a80: 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20      else:.      
0a90: 20 20 69 66 20 70 72 6f 62 61 62 6c 79 5f 62 69    if probably_bi
0aa0: 67 20 6f 72 20 76 65 72 62 6f 73 65 3a 0a 20 20  g or verbose:.  
0ab0: 20 20 20 20 20 20 20 20 20 20 6f 70 74 69 6f 6e            option
0ac0: 20 3d 20 22 2d 23 22 0a 20 20 20 20 20 20 20 20   = "-#".        
0ad0: 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20  else:.          
0ae0: 20 20 6f 70 74 69 6f 6e 20 3d 20 22 2d 73 22 0a    option = "-s".
0af0: 20 20 20 20 20 20 20 20 72 75 6e 28 5b 22 63 75          run(["cu
0b00: 72 6c 22 2c 20 6f 70 74 69 6f 6e 2c 20 22 2d 2d  rl", option, "--
0b10: 72 65 74 72 79 22 2c 20 22 33 22 2c 20 22 2d 53  retry", "3", "-S
0b20: 66 22 2c 20 22 2d 6f 22 2c 20 70 61 74 68 2c 20  f", "-o", path, 
0b30: 75 72 6c 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  url],.          
0b40: 20 20 76 65 72 62 6f 73 65 3d 76 65 72 62 6f 73    verbose=verbos
0b50: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  e,.            e
0b60: 78 63 65 70 74 69 6f 6e 3d 65 78 63 65 70 74 69  xception=excepti
0b70: 6f 6e 29 0a 0a 0a 64 65 66 20 76 65 72 69 66 79  on)...def verify
0b80: 28 70 61 74 68 2c 20 73 68 61 5f 70 61 74 68 2c  (path, sha_path,
0b90: 20 76 65 72 62 6f 73 65 29 3a 0a 20 20 20 20 69   verbose):.    i
0ba0: 66 20 76 65 72 62 6f 73 65 3a 0a 20 20 20 20 20  f verbose:.     
0bb0: 20 20 20 70 72 69 6e 74 28 22 76 65 72 69 66 79     print("verify
0bc0: 69 6e 67 20 22 20 2b 20 70 61 74 68 29 0a 20 20  ing " + path).  
0bd0: 20 20 77 69 74 68 20 6f 70 65 6e 28 70 61 74 68    with open(path
0be0: 2c 20 22 72 62 22 29 20 61 73 20 66 3a 0a 20 20  , "rb") as f:.  
0bf0: 20 20 20 20 20 20 66 6f 75 6e 64 20 3d 20 68 61        found = ha
0c00: 73 68 6c 69 62 2e 73 68 61 32 35 36 28 66 2e 72  shlib.sha256(f.r
0c10: 65 61 64 28 29 29 2e 68 65 78 64 69 67 65 73 74  ead()).hexdigest
0c20: 28 29 0a 20 20 20 20 77 69 74 68 20 6f 70 65 6e  ().    with open
0c30: 28 73 68 61 5f 70 61 74 68 2c 20 22 72 22 29 20  (sha_path, "r") 
0c40: 61 73 20 66 3a 0a 20 20 20 20 20 20 20 20 65 78  as f:.        ex
0c50: 70 65 63 74 65 64 20 3d 20 66 2e 72 65 61 64 6c  pected = f.readl
0c60: 69 6e 65 28 29 2e 73 70 6c 69 74 28 29 5b 30 5d  ine().split()[0]
0c70: 0a 20 20 20 20 76 65 72 69 66 69 65 64 20 3d 20  .    verified = 
0c80: 66 6f 75 6e 64 20 3d 3d 20 65 78 70 65 63 74 65  found == expecte
0c90: 64 0a 20 20 20 20 69 66 20 6e 6f 74 20 76 65 72  d.    if not ver
0ca0: 69 66 69 65 64 3a 0a 20 20 20 20 20 20 20 20 70  ified:.        p
0cb0: 72 69 6e 74 28 22 69 6e 76 61 6c 69 64 20 63 68  rint("invalid ch
0cc0: 65 63 6b 73 75 6d 3a 5c 6e 22 0a 20 20 20 20 20  ecksum:\n".     
0cd0: 20 20 20 20 20 20 20 20 20 20 22 20 20 20 20 66            "    f
0ce0: 6f 75 6e 64 3a 20 20 20 20 7b 7d 5c 6e 22 0a 20  ound:    {}\n". 
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
0d00: 20 20 20 65 78 70 65 63 74 65 64 3a 20 7b 7d 22     expected: {}"
0d10: 2e 66 6f 72 6d 61 74 28 66 6f 75 6e 64 2c 20 65  .format(found, e
0d20: 78 70 65 63 74 65 64 29 29 0a 20 20 20 20 72 65  xpected)).    re
0d30: 74 75 72 6e 20 76 65 72 69 66 69 65 64 0a 0a 0a  turn verified...
0d40: 64 65 66 20 75 6e 70 61 63 6b 28 74 61 72 62 61  def unpack(tarba
0d50: 6c 6c 2c 20 64 73 74 2c 20 76 65 72 62 6f 73 65  ll, dst, verbose
0d60: 3d 46 61 6c 73 65 2c 20 6d 61 74 63 68 3d 4e 6f  =False, match=No
0d70: 6e 65 29 3a 0a 20 20 20 20 70 72 69 6e 74 28 22  ne):.    print("
0d80: 65 78 74 72 61 63 74 69 6e 67 20 22 20 2b 20 74  extracting " + t
0d90: 61 72 62 61 6c 6c 29 0a 20 20 20 20 66 6e 61 6d  arball).    fnam
0da0: 65 20 3d 20 6f 73 2e 70 61 74 68 2e 62 61 73 65  e = os.path.base
0db0: 6e 61 6d 65 28 74 61 72 62 61 6c 6c 29 2e 72 65  name(tarball).re
0dc0: 70 6c 61 63 65 28 22 2e 74 61 72 2e 67 7a 22 2c  place(".tar.gz",
0dd0: 20 22 22 29 0a 20 20 20 20 77 69 74 68 20 63 6f   "").    with co
0de0: 6e 74 65 78 74 6c 69 62 2e 63 6c 6f 73 69 6e 67  ntextlib.closing
0df0: 28 74 61 72 66 69 6c 65 2e 6f 70 65 6e 28 74 61  (tarfile.open(ta
0e00: 72 62 61 6c 6c 29 29 20 61 73 20 74 61 72 3a 0a  rball)) as tar:.
0e10: 20 20 20 20 20 20 20 20 66 6f 72 20 70 20 69 6e          for p in
0e20: 20 74 61 72 2e 67 65 74 6e 61 6d 65 73 28 29 3a   tar.getnames():
0e30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
0e40: 22 2f 22 20 6e 6f 74 20 69 6e 20 70 3a 0a 20 20  "/" not in p:.  
0e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
0e60: 6e 74 69 6e 75 65 0a 20 20 20 20 20 20 20 20 20  ntinue.         
0e70: 20 20 20 6e 61 6d 65 20 3d 20 70 2e 72 65 70 6c     name = p.repl
0e80: 61 63 65 28 66 6e 61 6d 65 20 2b 20 22 2f 22 2c  ace(fname + "/",
0e90: 20 22 22 2c 20 31 29 0a 20 20 20 20 20 20 20 20   "", 1).        
0ea0: 20 20 20 20 69 66 20 6d 61 74 63 68 20 69 73 20      if match is 
0eb0: 6e 6f 74 20 4e 6f 6e 65 20 61 6e 64 20 6e 6f 74  not None and not
0ec0: 20 6e 61 6d 65 2e 73 74 61 72 74 73 77 69 74 68   name.startswith
0ed0: 28 6d 61 74 63 68 29 3a 0a 20 20 20 20 20 20 20  (match):.       
0ee0: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
0ef0: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 61  e.            na
0f00: 6d 65 20 3d 20 6e 61 6d 65 5b 6c 65 6e 28 6d 61  me = name[len(ma
0f10: 74 63 68 29 20 2b 20 31 3a 5d 0a 0a 20 20 20 20  tch) + 1:]..    
0f20: 20 20 20 20 20 20 20 20 66 70 20 3d 20 6f 73 2e          fp = os.
0f30: 70 61 74 68 2e 6a 6f 69 6e 28 64 73 74 2c 20 6e  path.join(dst, n
0f40: 61 6d 65 29 0a 20 20 20 20 20 20 20 20 20 20 20  ame).           
0f50: 20 69 66 20 76 65 72 62 6f 73 65 3a 0a 20 20 20   if verbose:.   
0f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69               pri
0f70: 6e 74 28 22 20 20 65 78 74 72 61 63 74 69 6e 67  nt("  extracting
0f80: 20 22 20 2b 20 70 29 0a 20 20 20 20 20 20 20 20   " + p).        
0f90: 20 20 20 20 74 61 72 2e 65 78 74 72 61 63 74 28      tar.extract(
0fa0: 70 2c 20 64 73 74 29 0a 20 20 20 20 20 20 20 20  p, dst).        
0fb0: 20 20 20 20 74 70 20 3d 20 6f 73 2e 70 61 74 68      tp = os.path
0fc0: 2e 6a 6f 69 6e 28 64 73 74 2c 20 70 29 0a 20 20  .join(dst, p).  
0fd0: 20 20 20 20 20 20 20 20 20 20 69 66 20 6f 73 2e            if os.
0fe0: 70 61 74 68 2e 69 73 64 69 72 28 74 70 29 20 61  path.isdir(tp) a
0ff0: 6e 64 20 6f 73 2e 70 61 74 68 2e 65 78 69 73 74  nd os.path.exist
1000: 73 28 66 70 29 3a 0a 20 20 20 20 20 20 20 20 20  s(fp):.         
1010: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 0a         continue.
1020: 20 20 20 20 20 20 20 20 20 20 20 20 73 68 75 74              shut
1030: 69 6c 2e 6d 6f 76 65 28 74 70 2c 20 66 70 29 0a  il.move(tp, fp).
1040: 20 20 20 20 73 68 75 74 69 6c 2e 72 6d 74 72 65      shutil.rmtre
1050: 65 28 6f 73 2e 70 61 74 68 2e 6a 6f 69 6e 28 64  e(os.path.join(d
1060: 73 74 2c 20 66 6e 61 6d 65 29 29 0a 0a 64 65 66  st, fname))..def
1070: 20 72 75 6e 28 61 72 67 73 2c 20 76 65 72 62 6f   run(args, verbo
1080: 73 65 3d 46 61 6c 73 65 2c 20 65 78 63 65 70 74  se=False, except
1090: 69 6f 6e 3d 46 61 6c 73 65 29 3a 0a 20 20 20 20  ion=False):.    
10a0: 69 66 20 76 65 72 62 6f 73 65 3a 0a 20 20 20 20  if verbose:.    
10b0: 20 20 20 20 70 72 69 6e 74 28 22 72 75 6e 6e 69      print("runni
10c0: 6e 67 3a 20 22 20 2b 20 27 20 27 2e 6a 6f 69 6e  ng: " + ' '.join
10d0: 28 61 72 67 73 29 29 0a 20 20 20 20 73 79 73 2e  (args)).    sys.
10e0: 73 74 64 6f 75 74 2e 66 6c 75 73 68 28 29 0a 20  stdout.flush(). 
10f0: 20 20 20 23 20 55 73 65 20 50 6f 70 65 6e 20 68     # Use Popen h
1100: 65 72 65 20 69 6e 73 74 65 61 64 20 6f 66 20 63  ere instead of c
1110: 61 6c 6c 28 29 20 61 73 20 69 74 20 61 70 70 61  all() as it appa
1120: 72 65 6e 74 6c 79 20 61 6c 6c 6f 77 73 20 70 6f  rently allows po
1130: 77 65 72 73 68 65 6c 6c 20 6f 6e 0a 20 20 20 20  wershell on.    
1140: 23 20 57 69 6e 64 6f 77 73 20 74 6f 20 6e 6f 74  # Windows to not
1150: 20 6c 6f 63 6b 20 75 70 20 77 61 69 74 69 6e 67   lock up waiting
1160: 20 66 6f 72 20 69 6e 70 75 74 20 70 72 65 73 75   for input presu
1170: 6d 61 62 6c 79 2e 0a 20 20 20 20 72 65 74 20 3d  mably..    ret =
1180: 20 73 75 62 70 72 6f 63 65 73 73 2e 50 6f 70 65   subprocess.Pope
1190: 6e 28 61 72 67 73 29 0a 20 20 20 20 63 6f 64 65  n(args).    code
11a0: 20 3d 20 72 65 74 2e 77 61 69 74 28 29 0a 20 20   = ret.wait().  
11b0: 20 20 69 66 20 63 6f 64 65 20 21 3d 20 30 3a 0a    if code != 0:.
11c0: 20 20 20 20 20 20 20 20 65 72 72 20 3d 20 22 66          err = "f
11d0: 61 69 6c 65 64 20 74 6f 20 72 75 6e 3a 20 22 20  ailed to run: " 
11e0: 2b 20 27 20 27 2e 6a 6f 69 6e 28 61 72 67 73 29  + ' '.join(args)
11f0: 0a 20 20 20 20 20 20 20 20 69 66 20 76 65 72 62  .        if verb
1200: 6f 73 65 20 6f 72 20 65 78 63 65 70 74 69 6f 6e  ose or exception
1210: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 61  :.            ra
1220: 69 73 65 20 52 75 6e 74 69 6d 65 45 72 72 6f 72  ise RuntimeError
1230: 28 65 72 72 29 0a 20 20 20 20 20 20 20 20 73 79  (err).        sy
1240: 73 2e 65 78 69 74 28 65 72 72 29 0a 0a 64 65 66  s.exit(err)..def
1250: 20 73 74 61 67 65 30 5f 64 61 74 61 28 72 75 73   stage0_data(rus
1260: 74 5f 72 6f 6f 74 29 3a 0a 20 20 20 20 6e 69 67  t_root):.    nig
1270: 68 74 6c 69 65 73 20 3d 20 6f 73 2e 70 61 74 68  htlies = os.path
1280: 2e 6a 6f 69 6e 28 72 75 73 74 5f 72 6f 6f 74 2c  .join(rust_root,
1290: 20 22 73 72 63 2f 73 74 61 67 65 30 2e 74 78 74   "src/stage0.txt
12a0: 22 29 0a 20 20 20 20 64 61 74 61 20 3d 20 7b 7d  ").    data = {}
12b0: 0a 20 20 20 20 77 69 74 68 20 6f 70 65 6e 28 6e  .    with open(n
12c0: 69 67 68 74 6c 69 65 73 2c 20 27 72 27 29 20 61  ightlies, 'r') a
12d0: 73 20 6e 69 67 68 74 6c 69 65 73 3a 0a 20 20 20  s nightlies:.   
12e0: 20 20 20 20 20 66 6f 72 20 6c 69 6e 65 20 69 6e       for line in
12f0: 20 6e 69 67 68 74 6c 69 65 73 3a 0a 20 20 20 20   nightlies:.    
1300: 20 20 20 20 20 20 20 20 6c 69 6e 65 20 3d 20 6c          line = l
1310: 69 6e 65 2e 72 73 74 72 69 70 28 29 20 20 23 20  ine.rstrip()  # 
1320: 53 74 72 69 70 20 6e 65 77 6c 69 6e 65 20 63 68  Strip newline ch
1330: 61 72 61 63 74 65 72 2c 20 27 5c 6e 27 0a 20 20  aracter, '\n'.  
1340: 20 20 20 20 20 20 20 20 20 20 69 66 20 6c 69 6e            if lin
1350: 65 2e 73 74 61 72 74 73 77 69 74 68 28 22 23 22  e.startswith("#"
1360: 29 20 6f 72 20 6c 69 6e 65 20 3d 3d 20 27 27 3a  ) or line == '':
1370: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1380: 20 63 6f 6e 74 69 6e 75 65 0a 20 20 20 20 20 20   continue.      
1390: 20 20 20 20 20 20 61 2c 20 62 20 3d 20 6c 69 6e        a, b = lin
13a0: 65 2e 73 70 6c 69 74 28 22 3a 20 22 2c 20 31 29  e.split(": ", 1)
13b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74  .            dat
13c0: 61 5b 61 5d 20 3d 20 62 0a 20 20 20 20 72 65 74  a[a] = b.    ret
13d0: 75 72 6e 20 64 61 74 61 0a 0a 64 65 66 20 66 6f  urn data..def fo
13e0: 72 6d 61 74 5f 62 75 69 6c 64 5f 74 69 6d 65 28  rmat_build_time(
13f0: 64 75 72 61 74 69 6f 6e 29 3a 0a 20 20 20 20 72  duration):.    r
1400: 65 74 75 72 6e 20 73 74 72 28 64 61 74 65 74 69  eturn str(dateti
1410: 6d 65 2e 74 69 6d 65 64 65 6c 74 61 28 73 65 63  me.timedelta(sec
1420: 6f 6e 64 73 3d 69 6e 74 28 64 75 72 61 74 69 6f  onds=int(duratio
1430: 6e 29 29 29 0a 0a 0a 63 6c 61 73 73 20 52 75 73  n)))...class Rus
1440: 74 42 75 69 6c 64 28 6f 62 6a 65 63 74 29 3a 0a  tBuild(object):.
1450: 20 20 20 20 64 65 66 20 64 6f 77 6e 6c 6f 61 64      def download
1460: 5f 73 74 61 67 65 30 28 73 65 6c 66 29 3a 0a 20  _stage0(self):. 
1470: 20 20 20 20 20 20 20 63 61 63 68 65 5f 64 73 74         cache_dst
1480: 20 3d 20 6f 73 2e 70 61 74 68 2e 6a 6f 69 6e 28   = os.path.join(
1490: 73 65 6c 66 2e 62 75 69 6c 64 5f 64 69 72 2c 20  self.build_dir, 
14a0: 22 63 61 63 68 65 22 29 0a 20 20 20 20 20 20 20  "cache").       
14b0: 20 72 75 73 74 63 5f 63 61 63 68 65 20 3d 20 6f   rustc_cache = o
14c0: 73 2e 70 61 74 68 2e 6a 6f 69 6e 28 63 61 63 68  s.path.join(cach
14d0: 65 5f 64 73 74 2c 20 73 65 6c 66 2e 73 74 61 67  e_dst, self.stag
14e0: 65 30 5f 72 75 73 74 63 5f 64 61 74 65 28 29 29  e0_rustc_date())
14f0: 0a 20 20 20 20 20 20 20 20 63 61 72 67 6f 5f 63  .        cargo_c
1500: 61 63 68 65 20 3d 20 6f 73 2e 70 61 74 68 2e 6a  ache = os.path.j
1510: 6f 69 6e 28 63 61 63 68 65 5f 64 73 74 2c 20 73  oin(cache_dst, s
1520: 65 6c 66 2e 73 74 61 67 65 30 5f 63 61 72 67 6f  elf.stage0_cargo
1530: 5f 72 65 76 28 29 29 0a 20 20 20 20 20 20 20 20  _rev()).        
1540: 69 66 20 6e 6f 74 20 6f 73 2e 70 61 74 68 2e 65  if not os.path.e
1550: 78 69 73 74 73 28 72 75 73 74 63 5f 63 61 63 68  xists(rustc_cach
1560: 65 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  e):.            
1570: 6f 73 2e 6d 61 6b 65 64 69 72 73 28 72 75 73 74  os.makedirs(rust
1580: 63 5f 63 61 63 68 65 29 0a 20 20 20 20 20 20 20  c_cache).       
1590: 20 69 66 20 6e 6f 74 20 6f 73 2e 70 61 74 68 2e   if not os.path.
15a0: 65 78 69 73 74 73 28 63 61 72 67 6f 5f 63 61 63  exists(cargo_cac
15b0: 68 65 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  he):.           
15c0: 20 6f 73 2e 6d 61 6b 65 64 69 72 73 28 63 61 72   os.makedirs(car
15d0: 67 6f 5f 63 61 63 68 65 29 0a 0a 20 20 20 20 20  go_cache)..     
15e0: 20 20 20 69 66 20 73 65 6c 66 2e 72 75 73 74 63     if self.rustc
15f0: 28 29 2e 73 74 61 72 74 73 77 69 74 68 28 73 65  ().startswith(se
1600: 6c 66 2e 62 69 6e 5f 72 6f 6f 74 28 29 29 20 61  lf.bin_root()) a
1610: 6e 64 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  nd \.           
1620: 20 20 20 20 20 28 6e 6f 74 20 6f 73 2e 70 61 74       (not os.pat
1630: 68 2e 65 78 69 73 74 73 28 73 65 6c 66 2e 72 75  h.exists(self.ru
1640: 73 74 63 28 29 29 20 6f 72 20 73 65 6c 66 2e 72  stc()) or self.r
1650: 75 73 74 63 5f 6f 75 74 5f 6f 66 5f 64 61 74 65  ustc_out_of_date
1660: 28 29 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ()):.           
1670: 20 73 65 6c 66 2e 70 72 69 6e 74 5f 77 68 61 74   self.print_what
1680: 5f 69 74 5f 6d 65 61 6e 73 5f 74 6f 5f 62 6f 6f  _it_means_to_boo
1690: 74 73 74 72 61 70 28 29 0a 20 20 20 20 20 20 20  tstrap().       
16a0: 20 20 20 20 20 69 66 20 6f 73 2e 70 61 74 68 2e       if os.path.
16b0: 65 78 69 73 74 73 28 73 65 6c 66 2e 62 69 6e 5f  exists(self.bin_
16c0: 72 6f 6f 74 28 29 29 3a 0a 20 20 20 20 20 20 20  root()):.       
16d0: 20 20 20 20 20 20 20 20 20 73 68 75 74 69 6c 2e           shutil.
16e0: 72 6d 74 72 65 65 28 73 65 6c 66 2e 62 69 6e 5f  rmtree(self.bin_
16f0: 72 6f 6f 74 28 29 29 0a 20 20 20 20 20 20 20 20  root()).        
1700: 20 20 20 20 63 68 61 6e 6e 65 6c 20 3d 20 73 65      channel = se
1710: 6c 66 2e 73 74 61 67 65 30 5f 72 75 73 74 63 5f  lf.stage0_rustc_
1720: 63 68 61 6e 6e 65 6c 28 29 0a 20 20 20 20 20 20  channel().      
1730: 20 20 20 20 20 20 66 69 6c 65 6e 61 6d 65 20 3d        filename =
1740: 20 22 72 75 73 74 2d 73 74 64 2d 7b 7d 2d 7b 7d   "rust-std-{}-{}
1750: 2e 74 61 72 2e 67 7a 22 2e 66 6f 72 6d 61 74 28  .tar.gz".format(
1760: 63 68 61 6e 6e 65 6c 2c 20 73 65 6c 66 2e 62 75  channel, self.bu
1770: 69 6c 64 29 0a 20 20 20 20 20 20 20 20 20 20 20  ild).           
1780: 20 75 72 6c 20 3d 20 22 68 74 74 70 73 3a 2f 2f   url = "https://
1790: 73 74 61 74 69 63 2e 72 75 73 74 2d 6c 61 6e 67  static.rust-lang
17a0: 2e 6f 72 67 2f 64 69 73 74 2f 22 20 2b 20 73 65  .org/dist/" + se
17b0: 6c 66 2e 73 74 61 67 65 30 5f 72 75 73 74 63 5f  lf.stage0_rustc_
17c0: 64 61 74 65 28 29 0a 20 20 20 20 20 20 20 20 20  date().         
17d0: 20 20 20 74 61 72 62 61 6c 6c 20 3d 20 6f 73 2e     tarball = os.
17e0: 70 61 74 68 2e 6a 6f 69 6e 28 72 75 73 74 63 5f  path.join(rustc_
17f0: 63 61 63 68 65 2c 20 66 69 6c 65 6e 61 6d 65 29  cache, filename)
1800: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
1810: 6e 6f 74 20 6f 73 2e 70 61 74 68 2e 65 78 69 73  not os.path.exis
1820: 74 73 28 74 61 72 62 61 6c 6c 29 3a 0a 20 20 20  ts(tarball):.   
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74               get
1840: 28 22 7b 7d 2f 7b 7d 22 2e 66 6f 72 6d 61 74 28  ("{}/{}".format(
1850: 75 72 6c 2c 20 66 69 6c 65 6e 61 6d 65 29 2c 20  url, filename), 
1860: 74 61 72 62 61 6c 6c 2c 20 76 65 72 62 6f 73 65  tarball, verbose
1870: 3d 73 65 6c 66 2e 76 65 72 62 6f 73 65 29 0a 20  =self.verbose). 
1880: 20 20 20 20 20 20 20 20 20 20 20 75 6e 70 61 63             unpac
1890: 6b 28 74 61 72 62 61 6c 6c 2c 20 73 65 6c 66 2e  k(tarball, self.
18a0: 62 69 6e 5f 72 6f 6f 74 28 29 2c 0a 20 20 20 20  bin_root(),.    
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
18c0: 61 74 63 68 3d 22 72 75 73 74 2d 73 74 64 2d 22  atch="rust-std-"
18d0: 20 2b 20 73 65 6c 66 2e 62 75 69 6c 64 2c 0a 20   + self.build,. 
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f0: 20 20 76 65 72 62 6f 73 65 3d 73 65 6c 66 2e 76    verbose=self.v
1900: 65 72 62 6f 73 65 29 0a 0a 20 20 20 20 20 20 20  erbose)..       
1910: 20 20 20 20 20 66 69 6c 65 6e 61 6d 65 20 3d 20       filename = 
1920: 22 72 75 73 74 63 2d 7b 7d 2d 7b 7d 2e 74 61 72  "rustc-{}-{}.tar
1930: 2e 67 7a 22 2e 66 6f 72 6d 61 74 28 63 68 61 6e  .gz".format(chan
1940: 6e 65 6c 2c 20 73 65 6c 66 2e 62 75 69 6c 64 29  nel, self.build)
1950: 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 72 6c  .            url
1960: 20 3d 20 22 68 74 74 70 73 3a 2f 2f 73 74 61 74   = "https://stat
1970: 69 63 2e 72 75 73 74 2d 6c 61 6e 67 2e 6f 72 67  ic.rust-lang.org
1980: 2f 64 69 73 74 2f 22 20 2b 20 73 65 6c 66 2e 73  /dist/" + self.s
1990: 74 61 67 65 30 5f 72 75 73 74 63 5f 64 61 74 65  tage0_rustc_date
19a0: 28 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ().            t
19b0: 61 72 62 61 6c 6c 20 3d 20 6f 73 2e 70 61 74 68  arball = os.path
19c0: 2e 6a 6f 69 6e 28 72 75 73 74 63 5f 63 61 63 68  .join(rustc_cach
19d0: 65 2c 20 66 69 6c 65 6e 61 6d 65 29 0a 20 20 20  e, filename).   
19e0: 20 20 20 20 20 20 20 20 20 69 66 20 6e 6f 74 20           if not 
19f0: 6f 73 2e 70 61 74 68 2e 65 78 69 73 74 73 28 74  os.path.exists(t
1a00: 61 72 62 61 6c 6c 29 3a 0a 20 20 20 20 20 20 20  arball):.       
1a10: 20 20 20 20 20 20 20 20 20 67 65 74 28 22 7b 7d           get("{}
1a20: 2f 7b 7d 22 2e 66 6f 72 6d 61 74 28 75 72 6c 2c  /{}".format(url,
1a30: 20 66 69 6c 65 6e 61 6d 65 29 2c 20 74 61 72 62   filename), tarb
1a40: 61 6c 6c 2c 20 76 65 72 62 6f 73 65 3d 73 65 6c  all, verbose=sel
1a50: 66 2e 76 65 72 62 6f 73 65 29 0a 20 20 20 20 20  f.verbose).     
1a60: 20 20 20 20 20 20 20 75 6e 70 61 63 6b 28 74 61         unpack(ta
1a70: 72 62 61 6c 6c 2c 20 73 65 6c 66 2e 62 69 6e 5f  rball, self.bin_
1a80: 72 6f 6f 74 28 29 2c 20 6d 61 74 63 68 3d 22 72  root(), match="r
1a90: 75 73 74 63 22 2c 20 76 65 72 62 6f 73 65 3d 73  ustc", verbose=s
1aa0: 65 6c 66 2e 76 65 72 62 6f 73 65 29 0a 20 20 20  elf.verbose).   
1ab0: 20 20 20 20 20 20 20 20 20 73 65 6c 66 2e 66 69           self.fi
1ac0: 78 5f 65 78 65 63 75 74 61 62 6c 65 28 73 65 6c  x_executable(sel
1ad0: 66 2e 62 69 6e 5f 72 6f 6f 74 28 29 20 2b 20 22  f.bin_root() + "
1ae0: 2f 62 69 6e 2f 72 75 73 74 63 22 29 0a 20 20 20  /bin/rustc").   
1af0: 20 20 20 20 20 20 20 20 20 73 65 6c 66 2e 66 69           self.fi
1b00: 78 5f 65 78 65 63 75 74 61 62 6c 65 28 73 65 6c  x_executable(sel
1b10: 66 2e 62 69 6e 5f 72 6f 6f 74 28 29 20 2b 20 22  f.bin_root() + "
1b20: 2f 62 69 6e 2f 72 75 73 74 64 6f 63 22 29 0a 20  /bin/rustdoc"). 
1b30: 20 20 20 20 20 20 20 20 20 20 20 77 69 74 68 20             with 
1b40: 6f 70 65 6e 28 73 65 6c 66 2e 72 75 73 74 63 5f  open(self.rustc_
1b50: 73 74 61 6d 70 28 29 2c 20 27 77 27 29 20 61 73  stamp(), 'w') as
1b60: 20 66 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20   f:.            
1b70: 20 20 20 20 66 2e 77 72 69 74 65 28 73 65 6c 66      f.write(self
1b80: 2e 73 74 61 67 65 30 5f 72 75 73 74 63 5f 64 61  .stage0_rustc_da
1b90: 74 65 28 29 29 0a 0a 20 20 20 20 20 20 20 20 69  te())..        i
1ba0: 66 20 73 65 6c 66 2e 63 61 72 67 6f 28 29 2e 73  f self.cargo().s
1bb0: 74 61 72 74 73 77 69 74 68 28 73 65 6c 66 2e 62  tartswith(self.b
1bc0: 69 6e 5f 72 6f 6f 74 28 29 29 20 61 6e 64 20 5c  in_root()) and \
1bd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1be0: 20 28 6e 6f 74 20 6f 73 2e 70 61 74 68 2e 65 78   (not os.path.ex
1bf0: 69 73 74 73 28 73 65 6c 66 2e 63 61 72 67 6f 28  ists(self.cargo(
1c00: 29 29 20 6f 72 20 73 65 6c 66 2e 63 61 72 67 6f  )) or self.cargo
1c10: 5f 6f 75 74 5f 6f 66 5f 64 61 74 65 28 29 29 3a  _out_of_date()):
1c20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 6c  .            sel
1c30: 66 2e 70 72 69 6e 74 5f 77 68 61 74 5f 69 74 5f  f.print_what_it_
1c40: 6d 65 61 6e 73 5f 74 6f 5f 62 6f 6f 74 73 74 72  means_to_bootstr
1c50: 61 70 28 29 0a 20 20 20 20 20 20 20 20 20 20 20  ap().           
1c60: 20 66 69 6c 65 6e 61 6d 65 20 3d 20 22 63 61 72   filename = "car
1c70: 67 6f 2d 6e 69 67 68 74 6c 79 2d 7b 7d 2e 74 61  go-nightly-{}.ta
1c80: 72 2e 67 7a 22 2e 66 6f 72 6d 61 74 28 73 65 6c  r.gz".format(sel
1c90: 66 2e 62 75 69 6c 64 29 0a 20 20 20 20 20 20 20  f.build).       
1ca0: 20 20 20 20 20 75 72 6c 20 3d 20 22 68 74 74 70       url = "http
1cb0: 73 3a 2f 2f 73 33 2e 61 6d 61 7a 6f 6e 61 77 73  s://s3.amazonaws
1cc0: 2e 63 6f 6d 2f 72 75 73 74 2d 6c 61 6e 67 2d 63  .com/rust-lang-c
1cd0: 69 2f 63 61 72 67 6f 2d 62 75 69 6c 64 73 2f 22  i/cargo-builds/"
1ce0: 20 2b 20 73 65 6c 66 2e 73 74 61 67 65 30 5f 63   + self.stage0_c
1cf0: 61 72 67 6f 5f 72 65 76 28 29 0a 20 20 20 20 20  argo_rev().     
1d00: 20 20 20 20 20 20 20 74 61 72 62 61 6c 6c 20 3d         tarball =
1d10: 20 6f 73 2e 70 61 74 68 2e 6a 6f 69 6e 28 63 61   os.path.join(ca
1d20: 72 67 6f 5f 63 61 63 68 65 2c 20 66 69 6c 65 6e  rgo_cache, filen
1d30: 61 6d 65 29 0a 20 20 20 20 20 20 20 20 20 20 20  ame).           
1d40: 20 69 66 20 6e 6f 74 20 6f 73 2e 70 61 74 68 2e   if not os.path.
1d50: 65 78 69 73 74 73 28 74 61 72 62 61 6c 6c 29 3a  exists(tarball):
1d60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d70: 20 67 65 74 28 22 7b 7d 2f 7b 7d 22 2e 66 6f 72   get("{}/{}".for
1d80: 6d 61 74 28 75 72 6c 2c 20 66 69 6c 65 6e 61 6d  mat(url, filenam
1d90: 65 29 2c 20 74 61 72 62 61 6c 6c 2c 20 76 65 72  e), tarball, ver
1da0: 62 6f 73 65 3d 73 65 6c 66 2e 76 65 72 62 6f 73  bose=self.verbos
1db0: 65 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  e).            u
1dc0: 6e 70 61 63 6b 28 74 61 72 62 61 6c 6c 2c 20 73  npack(tarball, s
1dd0: 65 6c 66 2e 62 69 6e 5f 72 6f 6f 74 28 29 2c 20  elf.bin_root(), 
1de0: 6d 61 74 63 68 3d 22 63 61 72 67 6f 22 2c 20 76  match="cargo", v
1df0: 65 72 62 6f 73 65 3d 73 65 6c 66 2e 76 65 72 62  erbose=self.verb
1e00: 6f 73 65 29 0a 20 20 20 20 20 20 20 20 20 20 20  ose).           
1e10: 20 73 65 6c 66 2e 66 69 78 5f 65 78 65 63 75 74   self.fix_execut
1e20: 61 62 6c 65 28 73 65 6c 66 2e 62 69 6e 5f 72 6f  able(self.bin_ro
1e30: 6f 74 28 29 20 2b 20 22 2f 62 69 6e 2f 63 61 72  ot() + "/bin/car
1e40: 67 6f 22 29 0a 20 20 20 20 20 20 20 20 20 20 20  go").           
1e50: 20 77 69 74 68 20 6f 70 65 6e 28 73 65 6c 66 2e   with open(self.
1e60: 63 61 72 67 6f 5f 73 74 61 6d 70 28 29 2c 20 27  cargo_stamp(), '
1e70: 77 27 29 20 61 73 20 66 3a 0a 20 20 20 20 20 20  w') as f:.      
1e80: 20 20 20 20 20 20 20 20 20 20 66 2e 77 72 69 74            f.writ
1e90: 65 28 73 65 6c 66 2e 73 74 61 67 65 30 5f 63 61  e(self.stage0_ca
1ea0: 72 67 6f 5f 72 65 76 28 29 29 0a 0a 20 20 20 20  rgo_rev())..    
1eb0: 64 65 66 20 66 69 78 5f 65 78 65 63 75 74 61 62  def fix_executab
1ec0: 6c 65 28 73 65 6c 66 2c 20 66 6e 61 6d 65 29 3a  le(self, fname):
1ed0: 0a 20 20 20 20 20 20 20 20 23 20 49 66 20 77 65  .        # If we
1ee0: 27 72 65 20 6f 6e 20 4e 69 78 4f 53 20 77 65 20  're on NixOS we 
1ef0: 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74  need to change t
1f00: 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 64  he path to the d
1f10: 79 6e 61 6d 69 63 20 6c 6f 61 64 65 72 0a 0a 20  ynamic loader.. 
1f20: 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 5f 65         default_e
1f30: 6e 63 6f 64 69 6e 67 20 3d 20 73 79 73 2e 67 65  ncoding = sys.ge
1f40: 74 64 65 66 61 75 6c 74 65 6e 63 6f 64 69 6e 67  tdefaultencoding
1f50: 28 29 0a 20 20 20 20 20 20 20 20 74 72 79 3a 0a  ().        try:.
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 74 79              osty
1f70: 70 65 20 3d 20 73 75 62 70 72 6f 63 65 73 73 2e  pe = subprocess.
1f80: 63 68 65 63 6b 5f 6f 75 74 70 75 74 28 5b 27 75  check_output(['u
1f90: 6e 61 6d 65 27 2c 20 27 2d 73 27 5d 29 2e 73 74  name', '-s']).st
1fa0: 72 69 70 28 29 2e 64 65 63 6f 64 65 28 64 65 66  rip().decode(def
1fb0: 61 75 6c 74 5f 65 6e 63 6f 64 69 6e 67 29 0a 20  ault_encoding). 
1fc0: 20 20 20 20 20 20 20 65 78 63 65 70 74 20 28 73         except (s
1fd0: 75 62 70 72 6f 63 65 73 73 2e 43 61 6c 6c 65 64  ubprocess.Called
1fe0: 50 72 6f 63 65 73 73 45 72 72 6f 72 2c 20 57 69  ProcessError, Wi
1ff0: 6e 64 6f 77 73 45 72 72 6f 72 29 3a 0a 20 20 20  ndowsError):.   
2000: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 0a           return.
2010: 0a 20 20 20 20 20 20 20 20 69 66 20 6f 73 74 79  .        if osty
2020: 70 65 20 21 3d 20 22 4c 69 6e 75 78 22 3a 0a 20  pe != "Linux":. 
2030: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
2040: 6e 0a 0a 20 20 20 20 20 20 20 20 69 66 20 6e 6f  n..        if no
2050: 74 20 6f 73 2e 70 61 74 68 2e 65 78 69 73 74 73  t os.path.exists
2060: 28 22 2f 65 74 63 2f 4e 49 58 4f 53 22 29 3a 0a  ("/etc/NIXOS"):.
2070: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2080: 72 6e 0a 20 20 20 20 20 20 20 20 69 66 20 6f 73  rn.        if os
2090: 2e 70 61 74 68 2e 65 78 69 73 74 73 28 22 2f 6c  .path.exists("/l
20a0: 69 62 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20  ib"):.          
20b0: 20 20 72 65 74 75 72 6e 0a 0a 20 20 20 20 20 20    return..      
20c0: 20 20 23 20 41 74 20 74 68 69 73 20 70 6f 69 6e    # At this poin
20d0: 74 20 77 65 27 72 65 20 70 72 65 74 74 79 20 73  t we're pretty s
20e0: 75 72 65 20 74 68 65 20 75 73 65 72 20 69 73 20  ure the user is 
20f0: 72 75 6e 6e 69 6e 67 20 4e 69 78 4f 53 0a 20 20  running NixOS.  
2100: 20 20 20 20 20 20 70 72 69 6e 74 28 22 69 6e 66        print("inf
2110: 6f 3a 20 79 6f 75 20 73 65 65 6d 20 74 6f 20 62  o: you seem to b
2120: 65 20 72 75 6e 6e 69 6e 67 20 4e 69 78 4f 53 2e  e running NixOS.
2130: 20 41 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 70   Attempting to p
2140: 61 74 63 68 20 22 20 2b 20 66 6e 61 6d 65 29 0a  atch " + fname).
2150: 0a 20 20 20 20 20 20 20 20 74 72 79 3a 0a 20 20  .        try:.  
2160: 20 20 20 20 20 20 20 20 20 20 69 6e 74 65 72 70            interp
2170: 72 65 74 65 72 20 3d 20 73 75 62 70 72 6f 63 65  reter = subproce
2180: 73 73 2e 63 68 65 63 6b 5f 6f 75 74 70 75 74 28  ss.check_output(
2190: 5b 22 70 61 74 63 68 65 6c 66 22 2c 20 22 2d 2d  ["patchelf", "--
21a0: 70 72 69 6e 74 2d 69 6e 74 65 72 70 72 65 74 65  print-interprete
21b0: 72 22 2c 20 66 6e 61 6d 65 5d 29 0a 20 20 20 20  r", fname]).    
21c0: 20 20 20 20 20 20 20 20 69 6e 74 65 72 70 72 65          interpre
21d0: 74 65 72 20 3d 20 69 6e 74 65 72 70 72 65 74 65  ter = interprete
21e0: 72 2e 73 74 72 69 70 28 29 2e 64 65 63 6f 64 65  r.strip().decode
21f0: 28 64 65 66 61 75 6c 74 5f 65 6e 63 6f 64 69 6e  (default_encodin
2200: 67 29 0a 20 20 20 20 20 20 20 20 65 78 63 65 70  g).        excep
2210: 74 20 73 75 62 70 72 6f 63 65 73 73 2e 43 61 6c  t subprocess.Cal
2220: 6c 65 64 50 72 6f 63 65 73 73 45 72 72 6f 72 20  ledProcessError 
2230: 61 73 20 65 3a 0a 20 20 20 20 20 20 20 20 20 20  as e:.          
2240: 20 20 70 72 69 6e 74 28 22 77 61 72 6e 69 6e 67    print("warning
2250: 3a 20 66 61 69 6c 65 64 20 74 6f 20 63 61 6c 6c  : failed to call
2260: 20 70 61 74 63 68 65 6c 66 3a 20 25 73 22 20 25   patchelf: %s" %
2270: 20 65 29 0a 20 20 20 20 20 20 20 20 20 20 20 20   e).            
2280: 72 65 74 75 72 6e 0a 0a 20 20 20 20 20 20 20 20  return..        
2290: 6c 6f 61 64 65 72 20 3d 20 69 6e 74 65 72 70 72  loader = interpr
22a0: 65 74 65 72 2e 73 70 6c 69 74 28 22 2f 22 29 5b  eter.split("/")[
22b0: 2d 31 5d 0a 0a 20 20 20 20 20 20 20 20 74 72 79  -1]..        try
22c0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 64  :.            ld
22d0: 64 5f 6f 75 74 70 75 74 20 3d 20 73 75 62 70 72  d_output = subpr
22e0: 6f 63 65 73 73 2e 63 68 65 63 6b 5f 6f 75 74 70  ocess.check_outp
22f0: 75 74 28 5b 27 6c 64 64 27 2c 20 27 2f 72 75 6e  ut(['ldd', '/run
2300: 2f 63 75 72 72 65 6e 74 2d 73 79 73 74 65 6d 2f  /current-system/
2310: 73 77 2f 62 69 6e 2f 73 68 27 5d 29 0a 20 20 20  sw/bin/sh']).   
2320: 20 20 20 20 20 20 20 20 20 6c 64 64 5f 6f 75 74           ldd_out
2330: 70 75 74 20 3d 20 6c 64 64 5f 6f 75 74 70 75 74  put = ldd_output
2340: 2e 73 74 72 69 70 28 29 2e 64 65 63 6f 64 65 28  .strip().decode(
2350: 64 65 66 61 75 6c 74 5f 65 6e 63 6f 64 69 6e 67  default_encoding
2360: 29 0a 20 20 20 20 20 20 20 20 65 78 63 65 70 74  ).        except
2370: 20 73 75 62 70 72 6f 63 65 73 73 2e 43 61 6c 6c   subprocess.Call
2380: 65 64 50 72 6f 63 65 73 73 45 72 72 6f 72 20 61  edProcessError a
2390: 73 20 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20  s e:.           
23a0: 20 70 72 69 6e 74 28 22 77 61 72 6e 69 6e 67 3a   print("warning:
23b0: 20 75 6e 61 62 6c 65 20 74 6f 20 63 61 6c 6c 20   unable to call 
23c0: 6c 64 64 3a 20 25 73 22 20 25 20 65 29 0a 20 20  ldd: %s" % e).  
23d0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
23e0: 0a 0a 20 20 20 20 20 20 20 20 66 6f 72 20 6c 69  ..        for li
23f0: 6e 65 20 69 6e 20 6c 64 64 5f 6f 75 74 70 75 74  ne in ldd_output
2400: 2e 73 70 6c 69 74 6c 69 6e 65 73 28 29 3a 0a 20  .splitlines():. 
2410: 20 20 20 20 20 20 20 20 20 20 20 6c 69 62 6e 61             libna
2420: 6d 65 20 3d 20 6c 69 6e 65 2e 73 70 6c 69 74 28  me = line.split(
2430: 29 5b 30 5d 0a 20 20 20 20 20 20 20 20 20 20 20  )[0].           
2440: 20 69 66 20 6c 69 62 6e 61 6d 65 2e 65 6e 64 73   if libname.ends
2450: 77 69 74 68 28 6c 6f 61 64 65 72 29 3a 0a 20 20  with(loader):.  
2460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f                lo
2470: 61 64 65 72 5f 70 61 74 68 20 3d 20 6c 69 62 6e  ader_path = libn
2480: 61 6d 65 5b 3a 6c 65 6e 28 6c 69 62 6e 61 6d 65  ame[:len(libname
2490: 29 20 2d 20 6c 65 6e 28 6c 6f 61 64 65 72 29 5d  ) - len(loader)]
24a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24b0: 20 62 72 65 61 6b 0a 20 20 20 20 20 20 20 20 65   break.        e
24c0: 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20  lse:.           
24d0: 20 70 72 69 6e 74 28 22 77 61 72 6e 69 6e 67 3a   print("warning:
24e0: 20 75 6e 61 62 6c 65 20 74 6f 20 66 69 6e 64 20   unable to find 
24f0: 74 68 65 20 70 61 74 68 20 74 6f 20 74 68 65 20  the path to the 
2500: 64 79 6e 61 6d 69 63 20 6c 69 6e 6b 65 72 22 29  dynamic linker")
2510: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
2520: 75 72 6e 0a 0a 20 20 20 20 20 20 20 20 63 6f 72  urn..        cor
2530: 72 65 63 74 5f 69 6e 74 65 72 70 72 65 74 65 72  rect_interpreter
2540: 20 3d 20 6c 6f 61 64 65 72 5f 70 61 74 68 20 2b   = loader_path +
2550: 20 6c 6f 61 64 65 72 0a 0a 20 20 20 20 20 20 20   loader..       
2560: 20 74 72 79 3a 0a 20 20 20 20 20 20 20 20 20 20   try:.          
2570: 20 20 73 75 62 70 72 6f 63 65 73 73 2e 63 68 65    subprocess.che
2580: 63 6b 5f 6f 75 74 70 75 74 28 5b 22 70 61 74 63  ck_output(["patc
2590: 68 65 6c 66 22 2c 20 22 2d 2d 73 65 74 2d 69 6e  helf", "--set-in
25a0: 74 65 72 70 72 65 74 65 72 22 2c 20 63 6f 72 72  terpreter", corr
25b0: 65 63 74 5f 69 6e 74 65 72 70 72 65 74 65 72 2c  ect_interpreter,
25c0: 20 66 6e 61 6d 65 5d 29 0a 20 20 20 20 20 20 20   fname]).       
25d0: 20 65 78 63 65 70 74 20 73 75 62 70 72 6f 63 65   except subproce
25e0: 73 73 2e 43 61 6c 6c 65 64 50 72 6f 63 65 73 73  ss.CalledProcess
25f0: 45 72 72 6f 72 20 61 73 20 65 3a 0a 20 20 20 20  Error as e:.    
2600: 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 22 77          print("w
2610: 61 72 6e 69 6e 67 3a 20 66 61 69 6c 65 64 20 74  arning: failed t
2620: 6f 20 63 61 6c 6c 20 70 61 74 63 68 65 6c 66 3a  o call patchelf:
2630: 20 25 73 22 20 25 20 65 29 0a 20 20 20 20 20 20   %s" % e).      
2640: 20 20 20 20 20 20 72 65 74 75 72 6e 0a 0a 20 20        return..  
2650: 20 20 64 65 66 20 73 74 61 67 65 30 5f 63 61 72    def stage0_car
2660: 67 6f 5f 72 65 76 28 73 65 6c 66 29 3a 0a 20 20  go_rev(self):.  
2670: 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 65 6c        return sel
2680: 66 2e 5f 63 61 72 67 6f 5f 72 65 76 0a 0a 20 20  f._cargo_rev..  
2690: 20 20 64 65 66 20 73 74 61 67 65 30 5f 72 75 73    def stage0_rus
26a0: 74 63 5f 64 61 74 65 28 73 65 6c 66 29 3a 0a 20  tc_date(self):. 
26b0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 65         return se
26c0: 6c 66 2e 5f 72 75 73 74 63 5f 64 61 74 65 0a 0a  lf._rustc_date..
26d0: 20 20 20 20 64 65 66 20 73 74 61 67 65 30 5f 72      def stage0_r
26e0: 75 73 74 63 5f 63 68 61 6e 6e 65 6c 28 73 65 6c  ustc_channel(sel
26f0: 66 29 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75  f):.        retu
2700: 72 6e 20 73 65 6c 66 2e 5f 72 75 73 74 63 5f 63  rn self._rustc_c
2710: 68 61 6e 6e 65 6c 0a 0a 20 20 20 20 64 65 66 20  hannel..    def 
2720: 72 75 73 74 63 5f 73 74 61 6d 70 28 73 65 6c 66  rustc_stamp(self
2730: 29 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ):.        retur
2740: 6e 20 6f 73 2e 70 61 74 68 2e 6a 6f 69 6e 28 73  n os.path.join(s
2750: 65 6c 66 2e 62 69 6e 5f 72 6f 6f 74 28 29 2c 20  elf.bin_root(), 
2760: 27 2e 72 75 73 74 63 2d 73 74 61 6d 70 27 29 0a  '.rustc-stamp').
2770: 0a 20 20 20 20 64 65 66 20 63 61 72 67 6f 5f 73  .    def cargo_s
2780: 74 61 6d 70 28 73 65 6c 66 29 3a 0a 20 20 20 20  tamp(self):.    
2790: 20 20 20 20 72 65 74 75 72 6e 20 6f 73 2e 70 61      return os.pa
27a0: 74 68 2e 6a 6f 69 6e 28 73 65 6c 66 2e 62 69 6e  th.join(self.bin
27b0: 5f 72 6f 6f 74 28 29 2c 20 27 2e 63 61 72 67 6f  _root(), '.cargo
27c0: 2d 73 74 61 6d 70 27 29 0a 0a 20 20 20 20 64 65  -stamp')..    de
27d0: 66 20 72 75 73 74 63 5f 6f 75 74 5f 6f 66 5f 64  f rustc_out_of_d
27e0: 61 74 65 28 73 65 6c 66 29 3a 0a 20 20 20 20 20  ate(self):.     
27f0: 20 20 20 69 66 20 6e 6f 74 20 6f 73 2e 70 61 74     if not os.pat
2800: 68 2e 65 78 69 73 74 73 28 73 65 6c 66 2e 72 75  h.exists(self.ru
2810: 73 74 63 5f 73 74 61 6d 70 28 29 29 20 6f 72 20  stc_stamp()) or 
2820: 73 65 6c 66 2e 63 6c 65 61 6e 3a 0a 20 20 20 20  self.clean:.    
2830: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
2840: 72 75 65 0a 20 20 20 20 20 20 20 20 77 69 74 68  rue.        with
2850: 20 6f 70 65 6e 28 73 65 6c 66 2e 72 75 73 74 63   open(self.rustc
2860: 5f 73 74 61 6d 70 28 29 2c 20 27 72 27 29 20 61  _stamp(), 'r') a
2870: 73 20 66 3a 0a 20 20 20 20 20 20 20 20 20 20 20  s f:.           
2880: 20 72 65 74 75 72 6e 20 73 65 6c 66 2e 73 74 61   return self.sta
2890: 67 65 30 5f 72 75 73 74 63 5f 64 61 74 65 28 29  ge0_rustc_date()
28a0: 20 21 3d 20 66 2e 72 65 61 64 28 29 0a 0a 20 20   != f.read()..  
28b0: 20 20 64 65 66 20 63 61 72 67 6f 5f 6f 75 74 5f    def cargo_out_
28c0: 6f 66 5f 64 61 74 65 28 73 65 6c 66 29 3a 0a 20  of_date(self):. 
28d0: 20 20 20 20 20 20 20 69 66 20 6e 6f 74 20 6f 73         if not os
28e0: 2e 70 61 74 68 2e 65 78 69 73 74 73 28 73 65 6c  .path.exists(sel
28f0: 66 2e 63 61 72 67 6f 5f 73 74 61 6d 70 28 29 29  f.cargo_stamp())
2900: 20 6f 72 20 73 65 6c 66 2e 63 6c 65 61 6e 3a 0a   or self.clean:.
2910: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2920: 72 6e 20 54 72 75 65 0a 20 20 20 20 20 20 20 20  rn True.        
2930: 77 69 74 68 20 6f 70 65 6e 28 73 65 6c 66 2e 63  with open(self.c
2940: 61 72 67 6f 5f 73 74 61 6d 70 28 29 2c 20 27 72  argo_stamp(), 'r
2950: 27 29 20 61 73 20 66 3a 0a 20 20 20 20 20 20 20  ') as f:.       
2960: 20 20 20 20 20 72 65 74 75 72 6e 20 73 65 6c 66       return self
2970: 2e 73 74 61 67 65 30 5f 63 61 72 67 6f 5f 72 65  .stage0_cargo_re
2980: 76 28 29 20 21 3d 20 66 2e 72 65 61 64 28 29 0a  v() != f.read().
2990: 0a 20 20 20 20 64 65 66 20 62 69 6e 5f 72 6f 6f  .    def bin_roo
29a0: 74 28 73 65 6c 66 29 3a 0a 20 20 20 20 20 20 20  t(self):.       
29b0: 20 72 65 74 75 72 6e 20 6f 73 2e 70 61 74 68 2e   return os.path.
29c0: 6a 6f 69 6e 28 73 65 6c 66 2e 62 75 69 6c 64 5f  join(self.build_
29d0: 64 69 72 2c 20 73 65 6c 66 2e 62 75 69 6c 64 2c  dir, self.build,
29e0: 20 22 73 74 61 67 65 30 22 29 0a 0a 20 20 20 20   "stage0")..    
29f0: 64 65 66 20 67 65 74 5f 74 6f 6d 6c 28 73 65 6c  def get_toml(sel
2a00: 66 2c 20 6b 65 79 29 3a 0a 20 20 20 20 20 20 20  f, key):.       
2a10: 20 66 6f 72 20 6c 69 6e 65 20 69 6e 20 73 65 6c   for line in sel
2a20: 66 2e 63 6f 6e 66 69 67 5f 74 6f 6d 6c 2e 73 70  f.config_toml.sp
2a30: 6c 69 74 6c 69 6e 65 73 28 29 3a 0a 20 20 20 20  litlines():.    
2a40: 20 20 20 20 20 20 20 20 69 66 20 6c 69 6e 65 2e          if line.
2a50: 73 74 61 72 74 73 77 69 74 68 28 6b 65 79 20 2b  startswith(key +
2a60: 20 27 20 3d 27 29 3a 0a 20 20 20 20 20 20 20 20   ' ='):.        
2a70: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73          return s
2a80: 65 6c 66 2e 67 65 74 5f 73 74 72 69 6e 67 28 6c  elf.get_string(l
2a90: 69 6e 65 29 0a 20 20 20 20 20 20 20 20 72 65 74  ine).        ret
2aa0: 75 72 6e 20 4e 6f 6e 65 0a 0a 20 20 20 20 64 65  urn None..    de
2ab0: 66 20 67 65 74 5f 6d 6b 28 73 65 6c 66 2c 20 6b  f get_mk(self, k
2ac0: 65 79 29 3a 0a 20 20 20 20 20 20 20 20 66 6f 72  ey):.        for
2ad0: 20 6c 69 6e 65 20 69 6e 20 69 74 65 72 28 73 65   line in iter(se
2ae0: 6c 66 2e 63 6f 6e 66 69 67 5f 6d 6b 2e 73 70 6c  lf.config_mk.spl
2af0: 69 74 6c 69 6e 65 73 28 29 29 3a 0a 20 20 20 20  itlines()):.    
2b00: 20 20 20 20 20 20 20 20 69 66 20 6c 69 6e 65 2e          if line.
2b10: 73 74 61 72 74 73 77 69 74 68 28 6b 65 79 20 2b  startswith(key +
2b20: 20 27 20 27 29 3a 0a 20 20 20 20 20 20 20 20 20   ' '):.         
2b30: 20 20 20 20 20 20 20 76 61 72 20 3d 20 6c 69 6e         var = lin
2b40: 65 5b 6c 69 6e 65 2e 66 69 6e 64 28 27 3a 3d 27  e[line.find(':='
2b50: 29 20 2b 20 32 3a 5d 2e 73 74 72 69 70 28 29 0a  ) + 2:].strip().
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b70: 69 66 20 76 61 72 20 21 3d 20 27 27 3a 0a 20 20  if var != '':.  
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b90: 20 20 72 65 74 75 72 6e 20 76 61 72 0a 20 20 20    return var.   
2ba0: 20 20 20 20 20 72 65 74 75 72 6e 20 4e 6f 6e 65       return None
2bb0: 0a 0a 20 20 20 20 64 65 66 20 63 61 72 67 6f 28  ..    def cargo(
2bc0: 73 65 6c 66 29 3a 0a 20 20 20 20 20 20 20 20 63  self):.        c
2bd0: 6f 6e 66 69 67 20 3d 20 73 65 6c 66 2e 67 65 74  onfig = self.get
2be0: 5f 74 6f 6d 6c 28 27 63 61 72 67 6f 27 29 0a 20  _toml('cargo'). 
2bf0: 20 20 20 20 20 20 20 69 66 20 63 6f 6e 66 69 67         if config
2c00: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  :.            re
2c10: 74 75 72 6e 20 63 6f 6e 66 69 67 0a 20 20 20 20  turn config.    
2c20: 20 20 20 20 63 6f 6e 66 69 67 20 3d 20 73 65 6c      config = sel
2c30: 66 2e 67 65 74 5f 6d 6b 28 27 43 46 47 5f 4c 4f  f.get_mk('CFG_LO
2c40: 43 41 4c 5f 52 55 53 54 5f 52 4f 4f 54 27 29 0a  CAL_RUST_ROOT').
2c50: 20 20 20 20 20 20 20 20 69 66 20 63 6f 6e 66 69          if confi
2c60: 67 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  g:.            r
2c70: 65 74 75 72 6e 20 63 6f 6e 66 69 67 20 2b 20 27  eturn config + '
2c80: 2f 62 69 6e 2f 63 61 72 67 6f 27 20 2b 20 73 65  /bin/cargo' + se
2c90: 6c 66 2e 65 78 65 5f 73 75 66 66 69 78 28 29 0a  lf.exe_suffix().
2ca0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6f          return o
2cb0: 73 2e 70 61 74 68 2e 6a 6f 69 6e 28 73 65 6c 66  s.path.join(self
2cc0: 2e 62 69 6e 5f 72 6f 6f 74 28 29 2c 20 22 62 69  .bin_root(), "bi
2cd0: 6e 2f 63 61 72 67 6f 22 20 2b 20 73 65 6c 66 2e  n/cargo" + self.
2ce0: 65 78 65 5f 73 75 66 66 69 78 28 29 29 0a 0a 20  exe_suffix()).. 
2cf0: 20 20 20 64 65 66 20 72 75 73 74 63 28 73 65 6c     def rustc(sel
2d00: 66 29 3a 0a 20 20 20 20 20 20 20 20 63 6f 6e 66  f):.        conf
2d10: 69 67 20 3d 20 73 65 6c 66 2e 67 65 74 5f 74 6f  ig = self.get_to
2d20: 6d 6c 28 27 72 75 73 74 63 27 29 0a 20 20 20 20  ml('rustc').    
2d30: 20 20 20 20 69 66 20 63 6f 6e 66 69 67 3a 0a 20      if config:. 
2d40: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
2d50: 6e 20 63 6f 6e 66 69 67 0a 20 20 20 20 20 20 20  n config.       
2d60: 20 63 6f 6e 66 69 67 20 3d 20 73 65 6c 66 2e 67   config = self.g
2d70: 65 74 5f 6d 6b 28 27 43 46 47 5f 4c 4f 43 41 4c  et_mk('CFG_LOCAL
2d80: 5f 52 55 53 54 5f 52 4f 4f 54 27 29 0a 20 20 20  _RUST_ROOT').   
2d90: 20 20 20 20 20 69 66 20 63 6f 6e 66 69 67 3a 0a       if config:.
2da0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
2db0: 72 6e 20 63 6f 6e 66 69 67 20 2b 20 27 2f 62 69  rn config + '/bi
2dc0: 6e 2f 72 75 73 74 63 27 20 2b 20 73 65 6c 66 2e  n/rustc' + self.
2dd0: 65 78 65 5f 73 75 66 66 69 78 28 29 0a 20 20 20  exe_suffix().   
2de0: 20 20 20 20 20 72 65 74 75 72 6e 20 6f 73 2e 70       return os.p
2df0: 61 74 68 2e 6a 6f 69 6e 28 73 65 6c 66 2e 62 69  ath.join(self.bi
2e00: 6e 5f 72 6f 6f 74 28 29 2c 20 22 62 69 6e 2f 72  n_root(), "bin/r
2e10: 75 73 74 63 22 20 2b 20 73 65 6c 66 2e 65 78 65  ustc" + self.exe
2e20: 5f 73 75 66 66 69 78 28 29 29 0a 0a 20 20 20 20  _suffix())..    
2e30: 64 65 66 20 67 65 74 5f 73 74 72 69 6e 67 28 73  def get_string(s
2e40: 65 6c 66 2c 20 6c 69 6e 65 29 3a 0a 20 20 20 20  elf, line):.    
2e50: 20 20 20 20 73 74 61 72 74 20 3d 20 6c 69 6e 65      start = line
2e60: 2e 66 69 6e 64 28 27 22 27 29 0a 20 20 20 20 20  .find('"').     
2e70: 20 20 20 65 6e 64 20 3d 20 73 74 61 72 74 20 2b     end = start +
2e80: 20 31 20 2b 20 6c 69 6e 65 5b 73 74 61 72 74 20   1 + line[start 
2e90: 2b 20 31 3a 5d 2e 66 69 6e 64 28 27 22 27 29 0a  + 1:].find('"').
2ea0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6c          return l
2eb0: 69 6e 65 5b 73 74 61 72 74 20 2b 20 31 3a 65 6e  ine[start + 1:en
2ec0: 64 5d 0a 0a 20 20 20 20 64 65 66 20 65 78 65 5f  d]..    def exe_
2ed0: 73 75 66 66 69 78 28 73 65 6c 66 29 3a 0a 20 20  suffix(self):.  
2ee0: 20 20 20 20 20 20 69 66 20 73 79 73 2e 70 6c 61        if sys.pla
2ef0: 74 66 6f 72 6d 20 3d 3d 20 27 77 69 6e 33 32 27  tform == 'win32'
2f00: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  :.            re
2f10: 74 75 72 6e 20 27 2e 65 78 65 27 0a 20 20 20 20  turn '.exe'.    
2f20: 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20      else:.      
2f30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 27 27 0a        return ''.
2f40: 0a 20 20 20 20 64 65 66 20 70 72 69 6e 74 5f 77  .    def print_w
2f50: 68 61 74 5f 69 74 5f 6d 65 61 6e 73 5f 74 6f 5f  hat_it_means_to_
2f60: 62 6f 6f 74 73 74 72 61 70 28 73 65 6c 66 29 3a  bootstrap(self):
2f70: 0a 20 20 20 20 20 20 20 20 69 66 20 68 61 73 61  .        if hasa
2f80: 74 74 72 28 73 65 6c 66 2c 20 27 70 72 69 6e 74  ttr(self, 'print
2f90: 65 64 27 29 3a 0a 20 20 20 20 20 20 20 20 20 20  ed'):.          
2fa0: 20 20 72 65 74 75 72 6e 0a 20 20 20 20 20 20 20    return.       
2fb0: 20 73 65 6c 66 2e 70 72 69 6e 74 65 64 20 3d 20   self.printed = 
2fc0: 54 72 75 65 0a 20 20 20 20 20 20 20 20 69 66 20  True.        if 
2fd0: 6f 73 2e 70 61 74 68 2e 65 78 69 73 74 73 28 73  os.path.exists(s
2fe0: 65 6c 66 2e 62 6f 6f 74 73 74 72 61 70 5f 62 69  elf.bootstrap_bi
2ff0: 6e 61 72 79 28 29 29 3a 0a 20 20 20 20 20 20 20  nary()):.       
3000: 20 20 20 20 20 72 65 74 75 72 6e 0a 20 20 20 20       return.    
3010: 20 20 20 20 69 66 20 6e 6f 74 20 27 2d 2d 68 65      if not '--he
3020: 6c 70 27 20 69 6e 20 73 79 73 2e 61 72 67 76 20  lp' in sys.argv 
3030: 6f 72 20 6c 65 6e 28 73 79 73 2e 61 72 67 76 29  or len(sys.argv)
3040: 20 3d 3d 20 31 3a 0a 20 20 20 20 20 20 20 20 20   == 1:.         
3050: 20 20 20 72 65 74 75 72 6e 0a 0a 20 20 20 20 20     return..     
3060: 20 20 20 70 72 69 6e 74 28 27 69 6e 66 6f 3a 20     print('info: 
3070: 74 68 65 20 62 75 69 6c 64 20 73 79 73 74 65 6d  the build system
3080: 20 66 6f 72 20 52 75 73 74 20 69 73 20 77 72 69   for Rust is wri
3090: 74 74 65 6e 20 69 6e 20 52 75 73 74 2c 20 73 6f  tten in Rust, so
30a0: 20 74 68 69 73 27 29 0a 20 20 20 20 20 20 20 20   this').        
30b0: 70 72 69 6e 74 28 27 20 20 20 20 20 20 73 63 72  print('      scr
30c0: 69 70 74 20 69 73 20 6e 6f 77 20 67 6f 69 6e 67  ipt is now going
30d0: 20 74 6f 20 64 6f 77 6e 6c 6f 61 64 20 61 20 73   to download a s
30e0: 74 61 67 65 30 20 72 75 73 74 20 63 6f 6d 70 69  tage0 rust compi
30f0: 6c 65 72 27 29 0a 20 20 20 20 20 20 20 20 70 72  ler').        pr
3100: 69 6e 74 28 27 20 20 20 20 20 20 61 6e 64 20 74  int('      and t
3110: 68 65 6e 20 63 6f 6d 70 69 6c 65 20 74 68 65 20  hen compile the 
3120: 62 75 69 6c 64 20 73 79 73 74 65 6d 20 69 74 73  build system its
3130: 65 6c 66 27 29 0a 20 20 20 20 20 20 20 20 70 72  elf').        pr
3140: 69 6e 74 28 27 27 29 0a 20 20 20 20 20 20 20 20  int('').        
3150: 70 72 69 6e 74 28 27 69 6e 66 6f 3a 20 69 6e 20  print('info: in 
3160: 74 68 65 20 6d 65 61 6e 74 69 6d 65 20 79 6f 75  the meantime you
3170: 20 63 61 6e 20 72 65 61 64 20 6d 6f 72 65 20 61   can read more a
3180: 62 6f 75 74 20 72 75 73 74 62 75 69 6c 64 20 61  bout rustbuild a
3190: 74 27 29 0a 20 20 20 20 20 20 20 20 70 72 69 6e  t').        prin
31a0: 74 28 27 20 20 20 20 20 20 73 72 63 2f 62 6f 6f  t('      src/boo
31b0: 74 73 74 72 61 70 2f 52 45 41 44 4d 45 2e 6d 64  tstrap/README.md
31c0: 20 62 65 66 6f 72 65 20 74 68 65 20 64 6f 77 6e   before the down
31d0: 6c 6f 61 64 20 66 69 6e 69 73 68 65 73 27 29 0a  load finishes').
31e0: 0a 20 20 20 20 64 65 66 20 62 6f 6f 74 73 74 72  .    def bootstr
31f0: 61 70 5f 62 69 6e 61 72 79 28 73 65 6c 66 29 3a  ap_binary(self):
3200: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3210: 6f 73 2e 70 61 74 68 2e 6a 6f 69 6e 28 73 65 6c  os.path.join(sel
3220: 66 2e 62 75 69 6c 64 5f 64 69 72 2c 20 22 62 6f  f.build_dir, "bo
3230: 6f 74 73 74 72 61 70 2f 64 65 62 75 67 2f 62 6f  otstrap/debug/bo
3240: 6f 74 73 74 72 61 70 22 29 0a 0a 20 20 20 20 64  otstrap")..    d
3250: 65 66 20 62 75 69 6c 64 5f 62 6f 6f 74 73 74 72  ef build_bootstr
3260: 61 70 28 73 65 6c 66 29 3a 0a 20 20 20 20 20 20  ap(self):.      
3270: 20 20 73 65 6c 66 2e 70 72 69 6e 74 5f 77 68 61    self.print_wha
3280: 74 5f 69 74 5f 6d 65 61 6e 73 5f 74 6f 5f 62 6f  t_it_means_to_bo
3290: 6f 74 73 74 72 61 70 28 29 0a 20 20 20 20 20 20  otstrap().      
32a0: 20 20 62 75 69 6c 64 5f 64 69 72 20 3d 20 6f 73    build_dir = os
32b0: 2e 70 61 74 68 2e 6a 6f 69 6e 28 73 65 6c 66 2e  .path.join(self.
32c0: 62 75 69 6c 64 5f 64 69 72 2c 20 22 62 6f 6f 74  build_dir, "boot
32d0: 73 74 72 61 70 22 29 0a 20 20 20 20 20 20 20 20  strap").        
32e0: 69 66 20 73 65 6c 66 2e 63 6c 65 61 6e 20 61 6e  if self.clean an
32f0: 64 20 6f 73 2e 70 61 74 68 2e 65 78 69 73 74 73  d os.path.exists
3300: 28 62 75 69 6c 64 5f 64 69 72 29 3a 0a 20 20 20  (build_dir):.   
3310: 20 20 20 20 20 20 20 20 20 73 68 75 74 69 6c 2e           shutil.
3320: 72 6d 74 72 65 65 28 62 75 69 6c 64 5f 64 69 72  rmtree(build_dir
3330: 29 0a 20 20 20 20 20 20 20 20 65 6e 76 20 3d 20  ).        env = 
3340: 6f 73 2e 65 6e 76 69 72 6f 6e 2e 63 6f 70 79 28  os.environ.copy(
3350: 29 0a 20 20 20 20 20 20 20 20 65 6e 76 5b 22 43  ).        env["C
3360: 41 52 47 4f 5f 54 41 52 47 45 54 5f 44 49 52 22  ARGO_TARGET_DIR"
3370: 5d 20 3d 20 62 75 69 6c 64 5f 64 69 72 0a 20 20  ] = build_dir.  
3380: 20 20 20 20 20 20 65 6e 76 5b 22 52 55 53 54 43        env["RUSTC
3390: 22 5d 20 3d 20 73 65 6c 66 2e 72 75 73 74 63 28  "] = self.rustc(
33a0: 29 0a 20 20 20 20 20 20 20 20 65 6e 76 5b 22 4c  ).        env["L
33b0: 44 5f 4c 49 42 52 41 52 59 5f 50 41 54 48 22 5d  D_LIBRARY_PATH"]
33c0: 20 3d 20 6f 73 2e 70 61 74 68 2e 6a 6f 69 6e 28   = os.path.join(
33d0: 73 65 6c 66 2e 62 69 6e 5f 72 6f 6f 74 28 29 2c  self.bin_root(),
33e0: 20 22 6c 69 62 22 29 20 2b 20 5c 0a 20 20 20 20   "lib") + \.    
33f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3400: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6f 73               (os
3410: 2e 70 61 74 68 73 65 70 20 2b 20 65 6e 76 5b 22  .pathsep + env["
3420: 4c 44 5f 4c 49 42 52 41 52 59 5f 50 41 54 48 22  LD_LIBRARY_PATH"
3430: 5d 29 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20  ]) \.           
3440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3450: 20 20 20 20 20 20 69 66 20 22 4c 44 5f 4c 49 42        if "LD_LIB
3460: 52 41 52 59 5f 50 41 54 48 22 20 69 6e 20 65 6e  RARY_PATH" in en
3470: 76 20 65 6c 73 65 20 22 22 0a 20 20 20 20 20 20  v else "".      
3480: 20 20 65 6e 76 5b 22 44 59 4c 44 5f 4c 49 42 52    env["DYLD_LIBR
3490: 41 52 59 5f 50 41 54 48 22 5d 20 3d 20 6f 73 2e  ARY_PATH"] = os.
34a0: 70 61 74 68 2e 6a 6f 69 6e 28 73 65 6c 66 2e 62  path.join(self.b
34b0: 69 6e 5f 72 6f 6f 74 28 29 2c 20 22 6c 69 62 22  in_root(), "lib"
34c0: 29 20 2b 20 5c 0a 20 20 20 20 20 20 20 20 20 20  ) + \.          
34d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34e0: 20 20 20 20 20 20 20 20 20 28 6f 73 2e 70 61 74           (os.pat
34f0: 68 73 65 70 20 2b 20 65 6e 76 5b 22 44 59 4c 44  hsep + env["DYLD
3500: 5f 4c 49 42 52 41 52 59 5f 50 41 54 48 22 5d 29  _LIBRARY_PATH"])
3510: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
3520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3530: 20 20 20 20 20 20 69 66 20 22 44 59 4c 44 5f 4c        if "DYLD_L
3540: 49 42 52 41 52 59 5f 50 41 54 48 22 20 69 6e 20  IBRARY_PATH" in 
3550: 65 6e 76 20 65 6c 73 65 20 22 22 0a 20 20 20 20  env else "".    
3560: 20 20 20 20 65 6e 76 5b 22 50 41 54 48 22 5d 20      env["PATH"] 
3570: 3d 20 6f 73 2e 70 61 74 68 2e 6a 6f 69 6e 28 73  = os.path.join(s
3580: 65 6c 66 2e 62 69 6e 5f 72 6f 6f 74 28 29 2c 20  elf.bin_root(), 
3590: 22 62 69 6e 22 29 20 2b 20 5c 0a 20 20 20 20 20  "bin") + \.     
35a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35b0: 20 6f 73 2e 70 61 74 68 73 65 70 20 2b 20 65 6e   os.pathsep + en
35c0: 76 5b 22 50 41 54 48 22 5d 0a 20 20 20 20 20 20  v["PATH"].      
35d0: 20 20 69 66 20 6e 6f 74 20 6f 73 2e 70 61 74 68    if not os.path
35e0: 2e 69 73 66 69 6c 65 28 73 65 6c 66 2e 63 61 72  .isfile(self.car
35f0: 67 6f 28 29 29 3a 0a 20 20 20 20 20 20 20 20 20  go()):.         
3600: 20 20 20 72 61 69 73 65 20 45 78 63 65 70 74 69     raise Excepti
3610: 6f 6e 28 22 6e 6f 20 63 61 72 67 6f 20 65 78 65  on("no cargo exe
3620: 63 75 74 61 62 6c 65 20 66 6f 75 6e 64 20 61 74  cutable found at
3630: 20 60 25 73 60 22 20 25 20 73 65 6c 66 2e 63 61   `%s`" % self.ca
3640: 72 67 6f 28 29 29 0a 20 20 20 20 20 20 20 20 61  rgo()).        a
3650: 72 67 73 20 3d 20 5b 73 65 6c 66 2e 63 61 72 67  rgs = [self.carg
3660: 6f 28 29 2c 20 22 62 75 69 6c 64 22 2c 20 22 2d  o(), "build", "-
3670: 2d 6d 61 6e 69 66 65 73 74 2d 70 61 74 68 22 2c  -manifest-path",
3680: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3690: 20 6f 73 2e 70 61 74 68 2e 6a 6f 69 6e 28 73 65   os.path.join(se
36a0: 6c 66 2e 72 75 73 74 5f 72 6f 6f 74 2c 20 22 73  lf.rust_root, "s
36b0: 72 63 2f 62 6f 6f 74 73 74 72 61 70 2f 43 61 72  rc/bootstrap/Car
36c0: 67 6f 2e 74 6f 6d 6c 22 29 5d 0a 20 20 20 20 20  go.toml")].     
36d0: 20 20 20 69 66 20 73 65 6c 66 2e 75 73 65 5f 6c     if self.use_l
36e0: 6f 63 6b 65 64 5f 64 65 70 73 3a 0a 20 20 20 20  ocked_deps:.    
36f0: 20 20 20 20 20 20 20 20 61 72 67 73 2e 61 70 70          args.app
3700: 65 6e 64 28 22 2d 2d 6c 6f 63 6b 65 64 22 29 0a  end("--locked").
3710: 20 20 20 20 20 20 20 20 69 66 20 73 65 6c 66 2e          if self.
3720: 75 73 65 5f 76 65 6e 64 6f 72 65 64 5f 73 6f 75  use_vendored_sou
3730: 72 63 65 73 3a 0a 20 20 20 20 20 20 20 20 20 20  rces:.          
3740: 20 20 61 72 67 73 2e 61 70 70 65 6e 64 28 22 2d    args.append("-
3750: 2d 66 72 6f 7a 65 6e 22 29 0a 20 20 20 20 20 20  -frozen").      
3760: 20 20 73 65 6c 66 2e 72 75 6e 28 61 72 67 73 2c    self.run(args,
3770: 20 65 6e 76 29 0a 0a 20 20 20 20 64 65 66 20 72   env)..    def r
3780: 75 6e 28 73 65 6c 66 2c 20 61 72 67 73 2c 20 65  un(self, args, e
3790: 6e 76 29 3a 0a 20 20 20 20 20 20 20 20 70 72 6f  nv):.        pro
37a0: 63 20 3d 20 73 75 62 70 72 6f 63 65 73 73 2e 50  c = subprocess.P
37b0: 6f 70 65 6e 28 61 72 67 73 2c 20 65 6e 76 3d 65  open(args, env=e
37c0: 6e 76 29 0a 20 20 20 20 20 20 20 20 72 65 74 20  nv).        ret 
37d0: 3d 20 70 72 6f 63 2e 77 61 69 74 28 29 0a 20 20  = proc.wait().  
37e0: 20 20 20 20 20 20 69 66 20 72 65 74 20 21 3d 20        if ret != 
37f0: 30 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  0:.            s
3800: 79 73 2e 65 78 69 74 28 72 65 74 29 0a 0a 20 20  ys.exit(ret)..  
3810: 20 20 64 65 66 20 62 75 69 6c 64 5f 74 72 69 70    def build_trip
3820: 6c 65 28 73 65 6c 66 29 3a 0a 20 20 20 20 20 20  le(self):.      
3830: 20 20 64 65 66 61 75 6c 74 5f 65 6e 63 6f 64 69    default_encodi
3840: 6e 67 20 3d 20 73 79 73 2e 67 65 74 64 65 66 61  ng = sys.getdefa
3850: 75 6c 74 65 6e 63 6f 64 69 6e 67 28 29 0a 20 20  ultencoding().  
3860: 20 20 20 20 20 20 63 6f 6e 66 69 67 20 3d 20 73        config = s
3870: 65 6c 66 2e 67 65 74 5f 74 6f 6d 6c 28 27 62 75  elf.get_toml('bu
3880: 69 6c 64 27 29 0a 20 20 20 20 20 20 20 20 69 66  ild').        if
3890: 20 63 6f 6e 66 69 67 3a 0a 20 20 20 20 20 20 20   config:.       
38a0: 20 20 20 20 20 72 65 74 75 72 6e 20 63 6f 6e 66       return conf
38b0: 69 67 0a 20 20 20 20 20 20 20 20 63 6f 6e 66 69  ig.        confi
38c0: 67 20 3d 20 73 65 6c 66 2e 67 65 74 5f 6d 6b 28  g = self.get_mk(
38d0: 27 43 46 47 5f 42 55 49 4c 44 27 29 0a 20 20 20  'CFG_BUILD').   
38e0: 20 20 20 20 20 69 66 20 63 6f 6e 66 69 67 3a 0a       if config:.
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
3900: 72 6e 20 63 6f 6e 66 69 67 0a 20 20 20 20 20 20  rn config.      
3910: 20 20 74 72 79 3a 0a 20 20 20 20 20 20 20 20 20    try:.         
3920: 20 20 20 6f 73 74 79 70 65 20 3d 20 73 75 62 70     ostype = subp
3930: 72 6f 63 65 73 73 2e 63 68 65 63 6b 5f 6f 75 74  rocess.check_out
3940: 70 75 74 28 5b 27 75 6e 61 6d 65 27 2c 20 27 2d  put(['uname', '-
3950: 73 27 5d 29 2e 73 74 72 69 70 28 29 2e 64 65 63  s']).strip().dec
3960: 6f 64 65 28 64 65 66 61 75 6c 74 5f 65 6e 63 6f  ode(default_enco
3970: 64 69 6e 67 29 0a 20 20 20 20 20 20 20 20 20 20  ding).          
3980: 20 20 63 70 75 74 79 70 65 20 3d 20 73 75 62 70    cputype = subp
3990: 72 6f 63 65 73 73 2e 63 68 65 63 6b 5f 6f 75 74  rocess.check_out
39a0: 70 75 74 28 5b 27 75 6e 61 6d 65 27 2c 20 27 2d  put(['uname', '-
39b0: 6d 27 5d 29 2e 73 74 72 69 70 28 29 2e 64 65 63  m']).strip().dec
39c0: 6f 64 65 28 64 65 66 61 75 6c 74 5f 65 6e 63 6f  ode(default_enco
39d0: 64 69 6e 67 29 0a 20 20 20 20 20 20 20 20 65 78  ding).        ex
39e0: 63 65 70 74 20 28 73 75 62 70 72 6f 63 65 73 73  cept (subprocess
39f0: 2e 43 61 6c 6c 65 64 50 72 6f 63 65 73 73 45 72  .CalledProcessEr
3a00: 72 6f 72 2c 20 4f 53 45 72 72 6f 72 29 3a 0a 20  ror, OSError):. 
3a10: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 73 79             if sy
3a20: 73 2e 70 6c 61 74 66 6f 72 6d 20 3d 3d 20 27 77  s.platform == 'w
3a30: 69 6e 33 32 27 3a 0a 20 20 20 20 20 20 20 20 20  in32':.         
3a40: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 27 78         return 'x
3a50: 38 36 5f 36 34 2d 70 63 2d 77 69 6e 64 6f 77 73  86_64-pc-windows
3a60: 2d 6d 73 76 63 27 0a 20 20 20 20 20 20 20 20 20  -msvc'.         
3a70: 20 20 20 65 72 72 20 3d 20 22 75 6e 61 6d 65 20     err = "uname 
3a80: 6e 6f 74 20 66 6f 75 6e 64 22 0a 20 20 20 20 20  not found".     
3a90: 20 20 20 20 20 20 20 69 66 20 73 65 6c 66 2e 76         if self.v
3aa0: 65 72 62 6f 73 65 3a 0a 20 20 20 20 20 20 20 20  erbose:.        
3ab0: 20 20 20 20 20 20 20 20 72 61 69 73 65 20 45 78          raise Ex
3ac0: 63 65 70 74 69 6f 6e 28 65 72 72 29 0a 20 20 20  ception(err).   
3ad0: 20 20 20 20 20 20 20 20 20 73 79 73 2e 65 78 69           sys.exi
3ae0: 74 28 65 72 72 29 0a 0a 20 20 20 20 20 20 20 20  t(err)..        
3af0: 23 20 44 61 72 77 69 6e 27 73 20 60 75 6e 61 6d  # Darwin's `unam
3b00: 65 20 2d 73 60 20 6c 69 65 73 20 61 6e 64 20 61  e -s` lies and a
3b10: 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 69 33  lways returns i3
3b20: 38 36 2e 20 57 65 20 68 61 76 65 20 74 6f 20 75  86. We have to u
3b30: 73 65 0a 20 20 20 20 20 20 20 20 23 20 73 79 73  se.        # sys
3b40: 63 74 6c 20 69 6e 73 74 65 61 64 2e 0a 20 20 20  ctl instead..   
3b50: 20 20 20 20 20 69 66 20 6f 73 74 79 70 65 20 3d       if ostype =
3b60: 3d 20 27 44 61 72 77 69 6e 27 20 61 6e 64 20 63  = 'Darwin' and c
3b70: 70 75 74 79 70 65 20 3d 3d 20 27 69 36 38 36 27  putype == 'i686'
3b80: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 72  :.            ar
3b90: 67 73 20 3d 20 5b 27 73 79 73 63 74 6c 27 2c 20  gs = ['sysctl', 
3ba0: 27 68 77 2e 6f 70 74 69 6f 6e 61 6c 2e 78 38 36  'hw.optional.x86
3bb0: 5f 36 34 27 5d 0a 20 20 20 20 20 20 20 20 20 20  _64'].          
3bc0: 20 20 73 79 73 63 74 6c 20 3d 20 73 75 62 70 72    sysctl = subpr
3bd0: 6f 63 65 73 73 2e 63 68 65 63 6b 5f 6f 75 74 70  ocess.check_outp
3be0: 75 74 28 61 72 67 73 29 2e 64 65 63 6f 64 65 28  ut(args).decode(
3bf0: 64 65 66 61 75 6c 74 5f 65 6e 63 6f 64 69 6e 67  default_encoding
3c00: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ).            if
3c10: 20 27 3a 20 31 27 20 69 6e 20 73 79 73 63 74 6c   ': 1' in sysctl
3c20: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
3c30: 20 20 63 70 75 74 79 70 65 20 3d 20 27 78 38 36    cputype = 'x86
3c40: 5f 36 34 27 0a 0a 20 20 20 20 20 20 20 20 23 20  _64'..        # 
3c50: 54 68 65 20 67 6f 61 6c 20 68 65 72 65 20 69 73  The goal here is
3c60: 20 74 6f 20 63 6f 6d 65 20 75 70 20 77 69 74 68   to come up with
3c70: 20 74 68 65 20 73 61 6d 65 20 74 72 69 70 6c 65   the same triple
3c80: 20 61 73 20 4c 4c 56 4d 20 77 6f 75 6c 64 2c 0a   as LLVM would,.
3c90: 20 20 20 20 20 20 20 20 23 20 61 74 20 6c 65 61          # at lea
3ca0: 73 74 20 66 6f 72 20 74 68 65 20 73 75 62 73 65  st for the subse
3cb0: 74 20 6f 66 20 70 6c 61 74 66 6f 72 6d 73 20 77  t of platforms w
3cc0: 65 27 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f 20  e're willing to 
3cd0: 74 61 72 67 65 74 2e 0a 20 20 20 20 20 20 20 20  target..        
3ce0: 69 66 20 6f 73 74 79 70 65 20 3d 3d 20 27 4c 69  if ostype == 'Li
3cf0: 6e 75 78 27 3a 0a 20 20 20 20 20 20 20 20 20 20  nux':.          
3d00: 20 20 6f 73 74 79 70 65 20 3d 20 27 75 6e 6b 6e    ostype = 'unkn
3d10: 6f 77 6e 2d 6c 69 6e 75 78 2d 67 6e 75 27 0a 20  own-linux-gnu'. 
3d20: 20 20 20 20 20 20 20 65 6c 69 66 20 6f 73 74 79         elif osty
3d30: 70 65 20 3d 3d 20 27 46 72 65 65 42 53 44 27 3a  pe == 'FreeBSD':
3d40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 74  .            ost
3d50: 79 70 65 20 3d 20 27 75 6e 6b 6e 6f 77 6e 2d 66  ype = 'unknown-f
3d60: 72 65 65 62 73 64 27 0a 20 20 20 20 20 20 20 20  reebsd'.        
3d70: 65 6c 69 66 20 6f 73 74 79 70 65 20 3d 3d 20 27  elif ostype == '
3d80: 44 72 61 67 6f 6e 46 6c 79 27 3a 0a 20 20 20 20  DragonFly':.    
3d90: 20 20 20 20 20 20 20 20 6f 73 74 79 70 65 20 3d          ostype =
3da0: 20 27 75 6e 6b 6e 6f 77 6e 2d 64 72 61 67 6f 6e   'unknown-dragon
3db0: 66 6c 79 27 0a 20 20 20 20 20 20 20 20 65 6c 69  fly'.        eli
3dc0: 66 20 6f 73 74 79 70 65 20 3d 3d 20 27 42 69 74  f ostype == 'Bit
3dd0: 72 69 67 27 3a 0a 20 20 20 20 20 20 20 20 20 20  rig':.          
3de0: 20 20 6f 73 74 79 70 65 20 3d 20 27 75 6e 6b 6e    ostype = 'unkn
3df0: 6f 77 6e 2d 62 69 74 72 69 67 27 0a 20 20 20 20  own-bitrig'.    
3e00: 20 20 20 20 65 6c 69 66 20 6f 73 74 79 70 65 20      elif ostype 
3e10: 3d 3d 20 27 4f 70 65 6e 42 53 44 27 3a 0a 20 20  == 'OpenBSD':.  
3e20: 20 20 20 20 20 20 20 20 20 20 6f 73 74 79 70 65            ostype
3e30: 20 3d 20 27 75 6e 6b 6e 6f 77 6e 2d 6f 70 65 6e   = 'unknown-open
3e40: 62 73 64 27 0a 20 20 20 20 20 20 20 20 65 6c 69  bsd'.        eli
3e50: 66 20 6f 73 74 79 70 65 20 3d 3d 20 27 4e 65 74  f ostype == 'Net
3e60: 42 53 44 27 3a 0a 20 20 20 20 20 20 20 20 20 20  BSD':.          
3e70: 20 20 6f 73 74 79 70 65 20 3d 20 27 75 6e 6b 6e    ostype = 'unkn
3e80: 6f 77 6e 2d 6e 65 74 62 73 64 27 0a 20 20 20 20  own-netbsd'.    
3e90: 20 20 20 20 65 6c 69 66 20 6f 73 74 79 70 65 20      elif ostype 
3ea0: 3d 3d 20 27 53 75 6e 4f 53 27 3a 0a 20 20 20 20  == 'SunOS':.    
3eb0: 20 20 20 20 20 20 20 20 6f 73 74 79 70 65 20 3d          ostype =
3ec0: 20 27 73 75 6e 2d 73 6f 6c 61 72 69 73 27 0a 20   'sun-solaris'. 
3ed0: 20 20 20 20 20 20 20 20 20 20 20 23 20 4f 6e 20             # On 
3ee0: 53 6f 6c 61 72 69 73 2c 20 75 6e 61 6d 65 20 2d  Solaris, uname -
3ef0: 6d 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 20  m will return a 
3f00: 6d 61 63 68 69 6e 65 20 63 6c 61 73 73 69 66 69  machine classifi
3f10: 63 61 74 69 6f 6e 20 69 6e 73 74 65 61 64 0a 20  cation instead. 
3f20: 20 20 20 20 20 20 20 20 20 20 20 23 20 6f 66 20             # of 
3f30: 61 20 63 70 75 20 74 79 70 65 2c 20 73 6f 20 75  a cpu type, so u
3f40: 6e 61 6d 65 20 2d 70 20 69 73 20 72 65 63 6f 6d  name -p is recom
3f50: 6d 65 6e 64 65 64 20 69 6e 73 74 65 61 64 2e 20  mended instead. 
3f60: 20 48 6f 77 65 76 65 72 2c 20 74 68 65 0a 20 20   However, the.  
3f70: 20 20 20 20 20 20 20 20 20 20 23 20 6f 75 74 70            # outp
3f80: 75 74 20 66 72 6f 6d 20 74 68 61 74 20 6f 70 74  ut from that opt
3f90: 69 6f 6e 20 69 73 20 74 6f 6f 20 67 65 6e 65 72  ion is too gener
3fa0: 69 63 20 66 6f 72 20 6f 75 72 20 70 75 72 70 6f  ic for our purpo
3fb0: 73 65 73 20 28 69 74 20 77 69 6c 6c 0a 20 20 20  ses (it will.   
3fc0: 20 20 20 20 20 20 20 20 20 23 20 61 6c 77 61 79           # alway
3fd0: 73 20 65 6d 69 74 20 27 69 33 38 36 27 20 6f 6e  s emit 'i386' on
3fe0: 20 78 38 36 2f 61 6d 64 36 34 20 73 79 73 74 65   x86/amd64 syste
3ff0: 6d 73 29 2e 20 20 41 73 20 73 75 63 68 2c 20 69  ms).  As such, i
4000: 73 61 69 6e 66 6f 20 2d 6b 0a 20 20 20 20 20 20  sainfo -k.      
4010: 20 20 20 20 20 20 23 20 6d 75 73 74 20 62 65 20        # must be 
4020: 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 20 20  used instead..  
4030: 20 20 20 20 20 20 20 20 20 20 74 72 79 3a 0a 20            try:. 
4040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
4050: 70 75 74 79 70 65 20 3d 20 73 75 62 70 72 6f 63  putype = subproc
4060: 65 73 73 2e 63 68 65 63 6b 5f 6f 75 74 70 75 74  ess.check_output
4070: 28 5b 27 69 73 61 69 6e 66 6f 27 2c 0a 20 20 20  (['isainfo',.   
4080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 27                 '
4090: 2d 6b 27 5d 29 2e 73 74 72 69 70 28 29 2e 64 65  -k']).strip().de
40a0: 63 6f 64 65 28 64 65 66 61 75 6c 74 5f 65 6e 63  code(default_enc
40b0: 6f 64 69 6e 67 29 0a 20 20 20 20 20 20 20 20 20  oding).         
40c0: 20 20 20 65 78 63 65 70 74 20 28 73 75 62 70 72     except (subpr
40d0: 6f 63 65 73 73 2e 43 61 6c 6c 65 64 50 72 6f 63  ocess.CalledProc
40e0: 65 73 73 45 72 72 6f 72 2c 20 4f 53 45 72 72 6f  essError, OSErro
40f0: 72 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  r):.            
4100: 20 20 20 20 65 72 72 20 3d 20 22 69 73 61 69 6e      err = "isain
4110: 66 6f 20 6e 6f 74 20 66 6f 75 6e 64 22 0a 20 20  fo not found".  
4120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
4130: 20 73 65 6c 66 2e 76 65 72 62 6f 73 65 3a 0a 20   self.verbose:. 
4140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4150: 20 20 20 72 61 69 73 65 20 45 78 63 65 70 74 69     raise Excepti
4160: 6f 6e 28 65 72 72 29 0a 20 20 20 20 20 20 20 20  on(err).        
4170: 20 20 20 20 20 20 20 20 73 79 73 2e 65 78 69 74          sys.exit
4180: 28 65 72 72 29 0a 20 20 20 20 20 20 20 20 65 6c  (err).        el
4190: 69 66 20 6f 73 74 79 70 65 20 3d 3d 20 27 44 61  if ostype == 'Da
41a0: 72 77 69 6e 27 3a 0a 20 20 20 20 20 20 20 20 20  rwin':.         
41b0: 20 20 20 6f 73 74 79 70 65 20 3d 20 27 61 70 70     ostype = 'app
41c0: 6c 65 2d 64 61 72 77 69 6e 27 0a 20 20 20 20 20  le-darwin'.     
41d0: 20 20 20 65 6c 69 66 20 6f 73 74 79 70 65 20 3d     elif ostype =
41e0: 3d 20 27 48 61 69 6b 75 27 3a 0a 20 20 20 20 20  = 'Haiku':.     
41f0: 20 20 20 20 20 20 20 6f 73 74 79 70 65 20 3d 20         ostype = 
4200: 27 75 6e 6b 6e 6f 77 6e 2d 68 61 69 6b 75 27 0a  'unknown-haiku'.
4210: 20 20 20 20 20 20 20 20 65 6c 69 66 20 6f 73 74          elif ost
4220: 79 70 65 2e 73 74 61 72 74 73 77 69 74 68 28 27  ype.startswith('
4230: 4d 49 4e 47 57 27 29 3a 0a 20 20 20 20 20 20 20  MINGW'):.       
4240: 20 20 20 20 20 23 20 6d 73 79 73 27 20 60 75 6e       # msys' `un
4250: 61 6d 65 60 20 64 6f 65 73 20 6e 6f 74 20 70 72  ame` does not pr
4260: 69 6e 74 20 67 63 63 20 63 6f 6e 66 69 67 75 72  int gcc configur
4270: 61 74 69 6f 6e 2c 20 62 75 74 20 70 72 69 6e 74  ation, but print
4280: 73 20 6d 73 79 73 0a 20 20 20 20 20 20 20 20 20  s msys.         
4290: 20 20 20 23 20 63 6f 6e 66 69 67 75 72 61 74 69     # configurati
42a0: 6f 6e 2e 20 73 6f 20 77 65 20 63 61 6e 6e 6f 74  on. so we cannot
42b0: 20 62 65 6c 69 65 76 65 20 60 75 6e 61 6d 65 20   believe `uname 
42c0: 2d 6d 60 3a 0a 20 20 20 20 20 20 20 20 20 20 20  -m`:.           
42d0: 20 23 20 6d 73 79 73 31 20 69 73 20 61 6c 77 61   # msys1 is alwa
42e0: 79 73 20 69 36 38 36 20 61 6e 64 20 6d 73 79 73  ys i686 and msys
42f0: 32 20 69 73 20 61 6c 77 61 79 73 20 78 38 36 5f  2 is always x86_
4300: 36 34 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  64..            
4310: 23 20 69 6e 73 74 65 61 64 2c 20 6d 73 79 73 20  # instead, msys 
4320: 64 65 66 69 6e 65 73 20 24 4d 53 59 53 54 45 4d  defines $MSYSTEM
4330: 20 77 68 69 63 68 20 69 73 20 4d 49 4e 47 57 33   which is MINGW3
4340: 32 20 6f 6e 20 69 36 38 36 20 61 6e 64 0a 20 20  2 on i686 and.  
4350: 20 20 20 20 20 20 20 20 20 20 23 20 4d 49 4e 47            # MING
4360: 57 36 34 20 6f 6e 20 78 38 36 5f 36 34 2e 0a 20  W64 on x86_64.. 
4370: 20 20 20 20 20 20 20 20 20 20 20 6f 73 74 79 70             ostyp
4380: 65 20 3d 20 27 70 63 2d 77 69 6e 64 6f 77 73 2d  e = 'pc-windows-
4390: 67 6e 75 27 0a 20 20 20 20 20 20 20 20 20 20 20  gnu'.           
43a0: 20 63 70 75 74 79 70 65 20 3d 20 27 69 36 38 36   cputype = 'i686
43b0: 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  '.            if
43c0: 20 6f 73 2e 65 6e 76 69 72 6f 6e 2e 67 65 74 28   os.environ.get(
43d0: 27 4d 53 59 53 54 45 4d 27 29 20 3d 3d 20 27 4d  'MSYSTEM') == 'M
43e0: 49 4e 47 57 36 34 27 3a 0a 20 20 20 20 20 20 20  INGW64':.       
43f0: 20 20 20 20 20 20 20 20 20 63 70 75 74 79 70 65           cputype
4400: 20 3d 20 27 78 38 36 5f 36 34 27 0a 20 20 20 20   = 'x86_64'.    
4410: 20 20 20 20 65 6c 69 66 20 6f 73 74 79 70 65 2e      elif ostype.
4420: 73 74 61 72 74 73 77 69 74 68 28 27 4d 53 59 53  startswith('MSYS
4430: 27 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  '):.            
4440: 6f 73 74 79 70 65 20 3d 20 27 70 63 2d 77 69 6e  ostype = 'pc-win
4450: 64 6f 77 73 2d 67 6e 75 27 0a 20 20 20 20 20 20  dows-gnu'.      
4460: 20 20 65 6c 69 66 20 6f 73 74 79 70 65 2e 73 74    elif ostype.st
4470: 61 72 74 73 77 69 74 68 28 27 43 59 47 57 49 4e  artswith('CYGWIN
4480: 5f 4e 54 27 29 3a 0a 20 20 20 20 20 20 20 20 20  _NT'):.         
4490: 20 20 20 63 70 75 74 79 70 65 20 3d 20 27 69 36     cputype = 'i6
44a0: 38 36 27 0a 20 20 20 20 20 20 20 20 20 20 20 20  86'.            
44b0: 69 66 20 6f 73 74 79 70 65 2e 65 6e 64 73 77 69  if ostype.endswi
44c0: 74 68 28 27 57 4f 57 36 34 27 29 3a 0a 20 20 20  th('WOW64'):.   
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 70 75               cpu
44e0: 74 79 70 65 20 3d 20 27 78 38 36 5f 36 34 27 0a  type = 'x86_64'.
44f0: 20 20 20 20 20 20 20 20 20 20 20 20 6f 73 74 79              osty
4500: 70 65 20 3d 20 27 70 63 2d 77 69 6e 64 6f 77 73  pe = 'pc-windows
4510: 2d 67 6e 75 27 0a 20 20 20 20 20 20 20 20 65 6c  -gnu'.        el
4520: 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  se:.            
4530: 65 72 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 4f  err = "unknown O
4540: 53 20 74 79 70 65 3a 20 22 20 2b 20 6f 73 74 79  S type: " + osty
4550: 70 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  pe.            i
4560: 66 20 73 65 6c 66 2e 76 65 72 62 6f 73 65 3a 0a  f self.verbose:.
4570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4580: 72 61 69 73 65 20 56 61 6c 75 65 45 72 72 6f 72  raise ValueError
4590: 28 65 72 72 29 0a 20 20 20 20 20 20 20 20 20 20  (err).          
45a0: 20 20 73 79 73 2e 65 78 69 74 28 65 72 72 29 0a    sys.exit(err).
45b0: 0a 20 20 20 20 20 20 20 20 69 66 20 63 70 75 74  .        if cput
45c0: 79 70 65 20 69 6e 20 7b 27 69 33 38 36 27 2c 20  ype in {'i386', 
45d0: 27 69 34 38 36 27 2c 20 27 69 36 38 36 27 2c 20  'i486', 'i686', 
45e0: 27 69 37 38 36 27 2c 20 27 78 38 36 27 7d 3a 0a  'i786', 'x86'}:.
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 63 70 75 74              cput
4600: 79 70 65 20 3d 20 27 69 36 38 36 27 0a 20 20 20  ype = 'i686'.   
4610: 20 20 20 20 20 65 6c 69 66 20 63 70 75 74 79 70       elif cputyp
4620: 65 20 69 6e 20 7b 27 78 73 63 61 6c 65 27 2c 20  e in {'xscale', 
4630: 27 61 72 6d 27 7d 3a 0a 20 20 20 20 20 20 20 20  'arm'}:.        
4640: 20 20 20 20 63 70 75 74 79 70 65 20 3d 20 27 61      cputype = 'a
4650: 72 6d 27 0a 20 20 20 20 20 20 20 20 65 6c 69 66  rm'.        elif
4660: 20 63 70 75 74 79 70 65 20 69 6e 20 7b 27 61 72   cputype in {'ar
4670: 6d 76 36 6c 27 2c 20 27 61 72 6d 76 37 6c 27 2c  mv6l', 'armv7l',
4680: 20 27 61 72 6d 76 38 6c 27 7d 3a 0a 20 20 20 20   'armv8l'}:.    
4690: 20 20 20 20 20 20 20 20 63 70 75 74 79 70 65 20          cputype 
46a0: 3d 20 27 61 72 6d 27 0a 20 20 20 20 20 20 20 20  = 'arm'.        
46b0: 20 20 20 20 6f 73 74 79 70 65 20 2b 3d 20 27 65      ostype += 'e
46c0: 61 62 69 68 66 27 0a 20 20 20 20 20 20 20 20 65  abihf'.        e
46d0: 6c 69 66 20 63 70 75 74 79 70 65 20 3d 3d 20 27  lif cputype == '
46e0: 61 72 6d 76 37 6c 27 3a 0a 20 20 20 20 20 20 20  armv7l':.       
46f0: 20 20 20 20 20 63 70 75 74 79 70 65 20 3d 20 27       cputype = '
4700: 61 72 6d 76 37 27 0a 20 20 20 20 20 20 20 20 20  armv7'.         
4710: 20 20 20 6f 73 74 79 70 65 20 2b 3d 20 27 65 61     ostype += 'ea
4720: 62 69 68 66 27 0a 20 20 20 20 20 20 20 20 65 6c  bihf'.        el
4730: 69 66 20 63 70 75 74 79 70 65 20 3d 3d 20 27 61  if cputype == 'a
4740: 61 72 63 68 36 34 27 3a 0a 20 20 20 20 20 20 20  arch64':.       
4750: 20 20 20 20 20 63 70 75 74 79 70 65 20 3d 20 27       cputype = '
4760: 61 61 72 63 68 36 34 27 0a 20 20 20 20 20 20 20  aarch64'.       
4770: 20 65 6c 69 66 20 63 70 75 74 79 70 65 20 3d 3d   elif cputype ==
4780: 20 27 61 72 6d 36 34 27 3a 0a 20 20 20 20 20 20   'arm64':.      
4790: 20 20 20 20 20 20 63 70 75 74 79 70 65 20 3d 20        cputype = 
47a0: 27 61 61 72 63 68 36 34 27 0a 20 20 20 20 20 20  'aarch64'.      
47b0: 20 20 65 6c 69 66 20 63 70 75 74 79 70 65 20 3d    elif cputype =
47c0: 3d 20 27 6d 69 70 73 27 3a 0a 20 20 20 20 20 20  = 'mips':.      
47d0: 20 20 20 20 20 20 69 66 20 73 79 73 2e 62 79 74        if sys.byt
47e0: 65 6f 72 64 65 72 20 3d 3d 20 27 62 69 67 27 3a  eorder == 'big':
47f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4800: 20 63 70 75 74 79 70 65 20 3d 20 27 6d 69 70 73   cputype = 'mips
4810: 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c  '.            el
4820: 69 66 20 73 79 73 2e 62 79 74 65 6f 72 64 65 72  if sys.byteorder
4830: 20 3d 3d 20 27 6c 69 74 74 6c 65 27 3a 0a 20 20   == 'little':.  
4840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 70                cp
4850: 75 74 79 70 65 20 3d 20 27 6d 69 70 73 65 6c 27  utype = 'mipsel'
4860: 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73  .            els
4870: 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e:.             
4880: 20 20 20 72 61 69 73 65 20 56 61 6c 75 65 45 72     raise ValueEr
4890: 72 6f 72 28 27 75 6e 6b 6e 6f 77 6e 20 62 79 74  ror('unknown byt
48a0: 65 6f 72 64 65 72 3a 20 27 20 2b 20 73 79 73 2e  eorder: ' + sys.
48b0: 62 79 74 65 6f 72 64 65 72 29 0a 20 20 20 20 20  byteorder).     
48c0: 20 20 20 65 6c 69 66 20 63 70 75 74 79 70 65 20     elif cputype 
48d0: 3d 3d 20 27 6d 69 70 73 36 34 27 3a 0a 20 20 20  == 'mips64':.   
48e0: 20 20 20 20 20 20 20 20 20 69 66 20 73 79 73 2e           if sys.
48f0: 62 79 74 65 6f 72 64 65 72 20 3d 3d 20 27 62 69  byteorder == 'bi
4900: 67 27 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  g':.            
4910: 20 20 20 20 63 70 75 74 79 70 65 20 3d 20 27 6d      cputype = 'm
4920: 69 70 73 36 34 27 0a 20 20 20 20 20 20 20 20 20  ips64'.         
4930: 20 20 20 65 6c 69 66 20 73 79 73 2e 62 79 74 65     elif sys.byte
4940: 6f 72 64 65 72 20 3d 3d 20 27 6c 69 74 74 6c 65  order == 'little
4950: 27 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ':.             
4960: 20 20 20 63 70 75 74 79 70 65 20 3d 20 27 6d 69     cputype = 'mi
4970: 70 73 36 34 65 6c 27 0a 20 20 20 20 20 20 20 20  ps64el'.        
4980: 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20      else:.      
4990: 20 20 20 20 20 20 20 20 20 20 72 61 69 73 65 20            raise 
49a0: 56 61 6c 75 65 45 72 72 6f 72 28 27 75 6e 6b 6e  ValueError('unkn
49b0: 6f 77 6e 20 62 79 74 65 6f 72 64 65 72 3a 20 27  own byteorder: '
49c0: 20 2b 20 73 79 73 2e 62 79 74 65 6f 72 64 65 72   + sys.byteorder
49d0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ).            # 
49e0: 6f 6e 6c 79 20 74 68 65 20 6e 36 34 20 41 42 49  only the n64 ABI
49f0: 20 69 73 20 73 75 70 70 6f 72 74 65 64 2c 20 69   is supported, i
4a00: 6e 64 69 63 61 74 65 20 69 74 0a 20 20 20 20 20  ndicate it.     
4a10: 20 20 20 20 20 20 20 6f 73 74 79 70 65 20 2b 3d         ostype +=
4a20: 20 27 61 62 69 36 34 27 0a 20 20 20 20 20 20 20   'abi64'.       
4a30: 20 65 6c 69 66 20 63 70 75 74 79 70 65 20 69 6e   elif cputype in
4a40: 20 7b 27 70 6f 77 65 72 70 63 27 2c 20 27 70 70   {'powerpc', 'pp
4a50: 63 27 7d 3a 0a 20 20 20 20 20 20 20 20 20 20 20  c'}:.           
4a60: 20 63 70 75 74 79 70 65 20 3d 20 27 70 6f 77 65   cputype = 'powe
4a70: 72 70 63 27 0a 20 20 20 20 20 20 20 20 65 6c 69  rpc'.        eli
4a80: 66 20 63 70 75 74 79 70 65 20 69 6e 20 7b 27 70  f cputype in {'p
4a90: 6f 77 65 72 70 63 36 34 27 2c 20 27 70 70 63 36  owerpc64', 'ppc6
4aa0: 34 27 7d 3a 0a 20 20 20 20 20 20 20 20 20 20 20  4'}:.           
4ab0: 20 63 70 75 74 79 70 65 20 3d 20 27 70 6f 77 65   cputype = 'powe
4ac0: 72 70 63 36 34 27 0a 20 20 20 20 20 20 20 20 65  rpc64'.        e
4ad0: 6c 69 66 20 63 70 75 74 79 70 65 20 69 6e 20 7b  lif cputype in {
4ae0: 27 70 6f 77 65 72 70 63 36 34 6c 65 27 2c 20 27  'powerpc64le', '
4af0: 70 70 63 36 34 6c 65 27 7d 3a 0a 20 20 20 20 20  ppc64le'}:.     
4b00: 20 20 20 20 20 20 20 63 70 75 74 79 70 65 20 3d         cputype =
4b10: 20 27 70 6f 77 65 72 70 63 36 34 6c 65 27 0a 20   'powerpc64le'. 
4b20: 20 20 20 20 20 20 20 65 6c 69 66 20 63 70 75 74         elif cput
4b30: 79 70 65 20 3d 3d 20 27 73 70 61 72 63 76 39 27  ype == 'sparcv9'
4b40: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 61  :.            pa
4b50: 73 73 0a 20 20 20 20 20 20 20 20 65 6c 69 66 20  ss.        elif 
4b60: 63 70 75 74 79 70 65 20 69 6e 20 7b 27 61 6d 64  cputype in {'amd
4b70: 36 34 27 2c 20 27 78 38 36 5f 36 34 27 2c 20 27  64', 'x86_64', '
4b80: 78 38 36 2d 36 34 27 2c 20 27 78 36 34 27 7d 3a  x86-64', 'x64'}:
4b90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 70 75  .            cpu
4ba0: 74 79 70 65 20 3d 20 27 78 38 36 5f 36 34 27 0a  type = 'x86_64'.
4bb0: 20 20 20 20 20 20 20 20 65 6c 69 66 20 63 70 75          elif cpu
4bc0: 74 79 70 65 20 3d 3d 20 27 73 33 39 30 78 27 3a  type == 's390x':
4bd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 70 75  .            cpu
4be0: 74 79 70 65 20 3d 20 27 73 33 39 30 78 27 0a 20  type = 's390x'. 
4bf0: 20 20 20 20 20 20 20 65 6c 69 66 20 63 70 75 74         elif cput
4c00: 79 70 65 20 3d 3d 20 27 42 65 50 43 27 3a 0a 20  ype == 'BePC':. 
4c10: 20 20 20 20 20 20 20 20 20 20 20 63 70 75 74 79             cputy
4c20: 70 65 20 3d 20 27 69 36 38 36 27 0a 20 20 20 20  pe = 'i686'.    
4c30: 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20      else:.      
4c40: 20 20 20 20 20 20 65 72 72 20 3d 20 22 75 6e 6b        err = "unk
4c50: 6e 6f 77 6e 20 63 70 75 20 74 79 70 65 3a 20 22  nown cpu type: "
4c60: 20 2b 20 63 70 75 74 79 70 65 0a 20 20 20 20 20   + cputype.     
4c70: 20 20 20 20 20 20 20 69 66 20 73 65 6c 66 2e 76         if self.v
4c80: 65 72 62 6f 73 65 3a 0a 20 20 20 20 20 20 20 20  erbose:.        
4c90: 20 20 20 20 20 20 20 20 72 61 69 73 65 20 56 61          raise Va
4ca0: 6c 75 65 45 72 72 6f 72 28 65 72 72 29 0a 20 20  lueError(err).  
4cb0: 20 20 20 20 20 20 20 20 20 20 73 79 73 2e 65 78            sys.ex
4cc0: 69 74 28 65 72 72 29 0a 0a 20 20 20 20 20 20 20  it(err)..       
4cd0: 20 72 65 74 75 72 6e 20 22 7b 7d 2d 7b 7d 22 2e   return "{}-{}".
4ce0: 66 6f 72 6d 61 74 28 63 70 75 74 79 70 65 2c 20  format(cputype, 
4cf0: 6f 73 74 79 70 65 29 0a 0a 64 65 66 20 62 6f 6f  ostype)..def boo
4d00: 74 73 74 72 61 70 28 29 3a 0a 20 20 20 20 70 61  tstrap():.    pa
4d10: 72 73 65 72 20 3d 20 61 72 67 70 61 72 73 65 2e  rser = argparse.
4d20: 41 72 67 75 6d 65 6e 74 50 61 72 73 65 72 28 64  ArgumentParser(d
4d30: 65 73 63 72 69 70 74 69 6f 6e 3d 27 42 75 69 6c  escription='Buil
4d40: 64 20 72 75 73 74 27 29 0a 20 20 20 20 70 61 72  d rust').    par
4d50: 73 65 72 2e 61 64 64 5f 61 72 67 75 6d 65 6e 74  ser.add_argument
4d60: 28 27 2d 2d 63 6f 6e 66 69 67 27 29 0a 20 20 20  ('--config').   
4d70: 20 70 61 72 73 65 72 2e 61 64 64 5f 61 72 67 75   parser.add_argu
4d80: 6d 65 6e 74 28 27 2d 2d 63 6c 65 61 6e 27 2c 20  ment('--clean', 
4d90: 61 63 74 69 6f 6e 3d 27 73 74 6f 72 65 5f 74 72  action='store_tr
4da0: 75 65 27 29 0a 20 20 20 20 70 61 72 73 65 72 2e  ue').    parser.
4db0: 61 64 64 5f 61 72 67 75 6d 65 6e 74 28 27 2d 76  add_argument('-v
4dc0: 27 2c 20 27 2d 2d 76 65 72 62 6f 73 65 27 2c 20  ', '--verbose', 
4dd0: 61 63 74 69 6f 6e 3d 27 73 74 6f 72 65 5f 74 72  action='store_tr
4de0: 75 65 27 29 0a 0a 20 20 20 20 61 72 67 73 20 3d  ue')..    args =
4df0: 20 5b 61 20 66 6f 72 20 61 20 69 6e 20 73 79 73   [a for a in sys
4e00: 2e 61 72 67 76 20 69 66 20 61 20 21 3d 20 27 2d  .argv if a != '-
4e10: 68 27 20 61 6e 64 20 61 20 21 3d 20 27 2d 2d 68  h' and a != '--h
4e20: 65 6c 70 27 5d 0a 20 20 20 20 61 72 67 73 2c 20  elp'].    args, 
4e30: 5f 20 3d 20 70 61 72 73 65 72 2e 70 61 72 73 65  _ = parser.parse
4e40: 5f 6b 6e 6f 77 6e 5f 61 72 67 73 28 61 72 67 73  _known_args(args
4e50: 29 0a 0a 20 20 20 20 23 20 43 6f 6e 66 69 67 75  )..    # Configu
4e60: 72 65 20 69 6e 69 74 69 61 6c 20 62 6f 6f 74 73  re initial boots
4e70: 74 72 61 70 0a 20 20 20 20 72 62 20 3d 20 52 75  trap.    rb = Ru
4e80: 73 74 42 75 69 6c 64 28 29 0a 20 20 20 20 72 62  stBuild().    rb
4e90: 2e 63 6f 6e 66 69 67 5f 74 6f 6d 6c 20 3d 20 27  .config_toml = '
4ea0: 27 0a 20 20 20 20 72 62 2e 63 6f 6e 66 69 67 5f  '.    rb.config_
4eb0: 6d 6b 20 3d 20 27 27 0a 20 20 20 20 72 62 2e 72  mk = ''.    rb.r
4ec0: 75 73 74 5f 72 6f 6f 74 20 3d 20 6f 73 2e 70 61  ust_root = os.pa
4ed0: 74 68 2e 61 62 73 70 61 74 68 28 6f 73 2e 70 61  th.abspath(os.pa
4ee0: 74 68 2e 6a 6f 69 6e 28 5f 5f 66 69 6c 65 5f 5f  th.join(__file__
4ef0: 2c 20 27 2e 2e 2f 2e 2e 2f 2e 2e 27 29 29 0a 20  , '../../..')). 
4f00: 20 20 20 72 62 2e 62 75 69 6c 64 5f 64 69 72 20     rb.build_dir 
4f10: 3d 20 6f 73 2e 70 61 74 68 2e 6a 6f 69 6e 28 6f  = os.path.join(o
4f20: 73 2e 67 65 74 63 77 64 28 29 2c 20 22 62 75 69  s.getcwd(), "bui
4f30: 6c 64 22 29 0a 20 20 20 20 72 62 2e 76 65 72 62  ld").    rb.verb
4f40: 6f 73 65 20 3d 20 61 72 67 73 2e 76 65 72 62 6f  ose = args.verbo
4f50: 73 65 0a 20 20 20 20 72 62 2e 63 6c 65 61 6e 20  se.    rb.clean 
4f60: 3d 20 61 72 67 73 2e 63 6c 65 61 6e 0a 0a 20 20  = args.clean..  
4f70: 20 20 74 72 79 3a 0a 20 20 20 20 20 20 20 20 77    try:.        w
4f80: 69 74 68 20 6f 70 65 6e 28 61 72 67 73 2e 63 6f  ith open(args.co
4f90: 6e 66 69 67 20 6f 72 20 27 63 6f 6e 66 69 67 2e  nfig or 'config.
4fa0: 74 6f 6d 6c 27 29 20 61 73 20 63 6f 6e 66 69 67  toml') as config
4fb0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 62  :.            rb
4fc0: 2e 63 6f 6e 66 69 67 5f 74 6f 6d 6c 20 3d 20 63  .config_toml = c
4fd0: 6f 6e 66 69 67 2e 72 65 61 64 28 29 0a 20 20 20  onfig.read().   
4fe0: 20 65 78 63 65 70 74 3a 0a 20 20 20 20 20 20 20   except:.       
4ff0: 20 70 61 73 73 0a 20 20 20 20 74 72 79 3a 0a 20   pass.    try:. 
5000: 20 20 20 20 20 20 20 72 62 2e 63 6f 6e 66 69 67         rb.config
5010: 5f 6d 6b 20 3d 20 6f 70 65 6e 28 27 63 6f 6e 66  _mk = open('conf
5020: 69 67 2e 6d 6b 27 29 2e 72 65 61 64 28 29 0a 20  ig.mk').read(). 
5030: 20 20 20 65 78 63 65 70 74 3a 0a 20 20 20 20 20     except:.     
5040: 20 20 20 70 61 73 73 0a 0a 20 20 20 20 72 62 2e     pass..    rb.
5050: 75 73 65 5f 76 65 6e 64 6f 72 65 64 5f 73 6f 75  use_vendored_sou
5060: 72 63 65 73 20 3d 20 27 5c 6e 76 65 6e 64 6f 72  rces = '\nvendor
5070: 20 3d 20 74 72 75 65 27 20 69 6e 20 72 62 2e 63   = true' in rb.c
5080: 6f 6e 66 69 67 5f 74 6f 6d 6c 20 6f 72 20 5c 0a  onfig_toml or \.
5090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 27 43                'C
50b0: 46 47 5f 45 4e 41 42 4c 45 5f 56 45 4e 44 4f 52  FG_ENABLE_VENDOR
50c0: 27 20 69 6e 20 72 62 2e 63 6f 6e 66 69 67 5f 6d  ' in rb.config_m
50d0: 6b 0a 0a 20 20 20 20 72 62 2e 75 73 65 5f 6c 6f  k..    rb.use_lo
50e0: 63 6b 65 64 5f 64 65 70 73 20 3d 20 27 5c 6e 6c  cked_deps = '\nl
50f0: 6f 63 6b 65 64 2d 64 65 70 73 20 3d 20 74 72 75  ocked-deps = tru
5100: 65 27 20 69 6e 20 72 62 2e 63 6f 6e 66 69 67 5f  e' in rb.config_
5110: 74 6f 6d 6c 20 6f 72 20 5c 0a 20 20 20 20 20 20  toml or \.      
5120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5130: 20 20 20 27 43 46 47 5f 45 4e 41 42 4c 45 5f 4c     'CFG_ENABLE_L
5140: 4f 43 4b 45 44 5f 44 45 50 53 27 20 69 6e 20 72  OCKED_DEPS' in r
5150: 62 2e 63 6f 6e 66 69 67 5f 6d 6b 0a 0a 20 20 20  b.config_mk..   
5160: 20 69 66 20 27 53 55 44 4f 5f 55 53 45 52 27 20   if 'SUDO_USER' 
5170: 69 6e 20 6f 73 2e 65 6e 76 69 72 6f 6e 20 61 6e  in os.environ an
5180: 64 20 6e 6f 74 20 72 62 2e 75 73 65 5f 76 65 6e  d not rb.use_ven
5190: 64 6f 72 65 64 5f 73 6f 75 72 63 65 73 3a 0a 20  dored_sources:. 
51a0: 20 20 20 20 20 20 20 69 66 20 6f 73 2e 65 6e 76         if os.env
51b0: 69 72 6f 6e 2e 67 65 74 28 27 55 53 45 52 27 29  iron.get('USER')
51c0: 20 21 3d 20 6f 73 2e 65 6e 76 69 72 6f 6e 5b 27   != os.environ['
51d0: 53 55 44 4f 5f 55 53 45 52 27 5d 3a 0a 20 20 20  SUDO_USER']:.   
51e0: 20 20 20 20 20 20 20 20 20 72 62 2e 75 73 65 5f           rb.use_
51f0: 76 65 6e 64 6f 72 65 64 5f 73 6f 75 72 63 65 73  vendored_sources
5200: 20 3d 20 54 72 75 65 0a 20 20 20 20 20 20 20 20   = True.        
5210: 20 20 20 20 70 72 69 6e 74 28 27 69 6e 66 6f 3a      print('info:
5220: 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 79 6f 75 20   looks like you 
5230: 61 72 65 20 72 75 6e 6e 69 6e 67 20 74 68 69 73  are running this
5240: 20 63 6f 6d 6d 61 6e 64 20 75 6e 64 65 72 20 60   command under `
5250: 73 75 64 6f 60 27 29 0a 20 20 20 20 20 20 20 20  sudo`').        
5260: 20 20 20 20 70 72 69 6e 74 28 27 20 20 20 20 20      print('     
5270: 20 61 6e 64 20 73 6f 20 69 6e 20 6f 72 64 65 72   and so in order
5280: 20 74 6f 20 70 72 65 73 65 72 76 65 20 79 6f 75   to preserve you
5290: 72 20 24 48 4f 4d 45 20 74 68 69 73 20 77 69 6c  r $HOME this wil
52a0: 6c 20 6e 6f 77 27 29 0a 20 20 20 20 20 20 20 20  l now').        
52b0: 20 20 20 20 70 72 69 6e 74 28 27 20 20 20 20 20      print('     
52c0: 20 75 73 65 20 76 65 6e 64 6f 72 65 64 20 73 6f   use vendored so
52d0: 75 72 63 65 73 20 62 79 20 64 65 66 61 75 6c 74  urces by default
52e0: 2e 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 74  . Note that if t
52f0: 68 69 73 27 29 0a 20 20 20 20 20 20 20 20 20 20  his').          
5300: 20 20 70 72 69 6e 74 28 27 20 20 20 20 20 20 64    print('      d
5310: 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 79 6f 75  oes not work you
5320: 20 73 68 6f 75 6c 64 20 72 75 6e 20 61 20 6e 6f   should run a no
5330: 72 6d 61 6c 20 62 75 69 6c 64 20 66 69 72 73 74  rmal build first
5340: 27 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ').            p
5350: 72 69 6e 74 28 27 20 20 20 20 20 20 62 65 66 6f  rint('      befo
5360: 72 65 20 72 75 6e 6e 69 6e 67 20 61 20 63 6f 6d  re running a com
5370: 6d 61 6e 64 20 6c 69 6b 65 20 60 73 75 64 6f 20  mand like `sudo 
5380: 6d 61 6b 65 20 69 6e 73 74 61 6c 6c 60 27 29 0a  make install`').
5390: 0a 20 20 20 20 69 66 20 72 62 2e 75 73 65 5f 76  .    if rb.use_v
53a0: 65 6e 64 6f 72 65 64 5f 73 6f 75 72 63 65 73 3a  endored_sources:
53b0: 0a 20 20 20 20 20 20 20 20 69 66 20 6e 6f 74 20  .        if not 
53c0: 6f 73 2e 70 61 74 68 2e 65 78 69 73 74 73 28 27  os.path.exists('
53d0: 2e 63 61 72 67 6f 27 29 3a 0a 20 20 20 20 20 20  .cargo'):.      
53e0: 20 20 20 20 20 20 6f 73 2e 6d 61 6b 65 64 69 72        os.makedir
53f0: 73 28 27 2e 63 61 72 67 6f 27 29 0a 20 20 20 20  s('.cargo').    
5400: 20 20 20 20 77 69 74 68 20 6f 70 65 6e 28 27 2e      with open('.
5410: 63 61 72 67 6f 2f 63 6f 6e 66 69 67 27 2c 27 77  cargo/config','w
5420: 27 29 20 61 73 20 66 3a 0a 20 20 20 20 20 20 20  ') as f:.       
5430: 20 20 20 20 20 66 2e 77 72 69 74 65 28 22 22 22       f.write("""
5440: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5450: 20 5b 73 6f 75 72 63 65 2e 63 72 61 74 65 73 2d   [source.crates-
5460: 69 6f 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20  io].            
5470: 20 20 20 20 72 65 70 6c 61 63 65 2d 77 69 74 68      replace-with
5480: 20 3d 20 27 76 65 6e 64 6f 72 65 64 2d 73 6f 75   = 'vendored-sou
5490: 72 63 65 73 27 0a 20 20 20 20 20 20 20 20 20 20  rces'.          
54a0: 20 20 20 20 20 20 72 65 67 69 73 74 72 79 20 3d        registry =
54b0: 20 27 68 74 74 70 73 3a 2f 2f 65 78 61 6d 70 6c   'https://exampl
54c0: 65 2e 63 6f 6d 27 0a 0a 20 20 20 20 20 20 20 20  e.com'..        
54d0: 20 20 20 20 20 20 20 20 5b 73 6f 75 72 63 65 2e          [source.
54e0: 76 65 6e 64 6f 72 65 64 2d 73 6f 75 72 63 65 73  vendored-sources
54f0: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ].              
5500: 20 20 64 69 72 65 63 74 6f 72 79 20 3d 20 27 7b    directory = '{
5510: 7d 2f 73 72 63 2f 76 65 6e 64 6f 72 27 0a 20 20  }/src/vendor'.  
5520: 20 20 20 20 20 20 20 20 20 20 22 22 22 2e 66 6f            """.fo
5530: 72 6d 61 74 28 72 62 2e 72 75 73 74 5f 72 6f 6f  rmat(rb.rust_roo
5540: 74 29 29 0a 20 20 20 20 65 6c 73 65 3a 0a 20 20  t)).    else:.  
5550: 20 20 20 20 20 20 69 66 20 6f 73 2e 70 61 74 68        if os.path
5560: 2e 65 78 69 73 74 73 28 27 2e 63 61 72 67 6f 27  .exists('.cargo'
5570: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ):.            s
5580: 68 75 74 69 6c 2e 72 6d 74 72 65 65 28 27 2e 63  hutil.rmtree('.c
5590: 61 72 67 6f 27 29 0a 0a 20 20 20 20 64 61 74 61  argo')..    data
55a0: 20 3d 20 73 74 61 67 65 30 5f 64 61 74 61 28 72   = stage0_data(r
55b0: 62 2e 72 75 73 74 5f 72 6f 6f 74 29 0a 20 20 20  b.rust_root).   
55c0: 20 72 62 2e 5f 72 75 73 74 63 5f 63 68 61 6e 6e   rb._rustc_chann
55d0: 65 6c 2c 20 72 62 2e 5f 72 75 73 74 63 5f 64 61  el, rb._rustc_da
55e0: 74 65 20 3d 20 64 61 74 61 5b 27 72 75 73 74 63  te = data['rustc
55f0: 27 5d 2e 73 70 6c 69 74 28 27 2d 27 2c 20 31 29  '].split('-', 1)
5600: 0a 20 20 20 20 72 62 2e 5f 63 61 72 67 6f 5f 72  .    rb._cargo_r
5610: 65 76 20 3d 20 64 61 74 61 5b 27 63 61 72 67 6f  ev = data['cargo
5620: 27 5d 0a 0a 20 20 20 20 23 20 46 65 74 63 68 2f  ']..    # Fetch/
5630: 62 75 69 6c 64 20 74 68 65 20 62 6f 6f 74 73 74  build the bootst
5640: 72 61 70 0a 20 20 20 20 72 62 2e 62 75 69 6c 64  rap.    rb.build
5650: 20 3d 20 72 62 2e 62 75 69 6c 64 5f 74 72 69 70   = rb.build_trip
5660: 6c 65 28 29 0a 20 20 20 20 72 62 2e 64 6f 77 6e  le().    rb.down
5670: 6c 6f 61 64 5f 73 74 61 67 65 30 28 29 0a 20 20  load_stage0().  
5680: 20 20 73 79 73 2e 73 74 64 6f 75 74 2e 66 6c 75    sys.stdout.flu
5690: 73 68 28 29 0a 20 20 20 20 72 62 2e 62 75 69 6c  sh().    rb.buil
56a0: 64 5f 62 6f 6f 74 73 74 72 61 70 28 29 0a 20 20  d_bootstrap().  
56b0: 20 20 73 79 73 2e 73 74 64 6f 75 74 2e 66 6c 75    sys.stdout.flu
56c0: 73 68 28 29 0a 0a 20 20 20 20 23 20 52 75 6e 20  sh()..    # Run 
56d0: 74 68 65 20 62 6f 6f 74 73 74 72 61 70 0a 20 20  the bootstrap.  
56e0: 20 20 61 72 67 73 20 3d 20 5b 72 62 2e 62 6f 6f    args = [rb.boo
56f0: 74 73 74 72 61 70 5f 62 69 6e 61 72 79 28 29 5d  tstrap_binary()]
5700: 0a 20 20 20 20 61 72 67 73 2e 65 78 74 65 6e 64  .    args.extend
5710: 28 73 79 73 2e 61 72 67 76 5b 31 3a 5d 29 0a 20  (sys.argv[1:]). 
5720: 20 20 20 65 6e 76 20 3d 20 6f 73 2e 65 6e 76 69     env = os.envi
5730: 72 6f 6e 2e 63 6f 70 79 28 29 0a 20 20 20 20 65  ron.copy().    e
5740: 6e 76 5b 22 42 55 49 4c 44 22 5d 20 3d 20 72 62  nv["BUILD"] = rb
5750: 2e 62 75 69 6c 64 0a 20 20 20 20 65 6e 76 5b 22  .build.    env["
5760: 53 52 43 22 5d 20 3d 20 72 62 2e 72 75 73 74 5f  SRC"] = rb.rust_
5770: 72 6f 6f 74 0a 20 20 20 20 65 6e 76 5b 22 42 4f  root.    env["BO
5780: 4f 54 53 54 52 41 50 5f 50 41 52 45 4e 54 5f 49  OTSTRAP_PARENT_I
5790: 44 22 5d 20 3d 20 73 74 72 28 6f 73 2e 67 65 74  D"] = str(os.get
57a0: 70 69 64 28 29 29 0a 20 20 20 20 72 62 2e 72 75  pid()).    rb.ru
57b0: 6e 28 61 72 67 73 2c 20 65 6e 76 29 0a 0a 64 65  n(args, env)..de
57c0: 66 20 6d 61 69 6e 28 29 3a 0a 20 20 20 20 73 74  f main():.    st
57d0: 61 72 74 5f 74 69 6d 65 20 3d 20 74 69 6d 65 28  art_time = time(
57e0: 29 0a 20 20 20 20 74 72 79 3a 0a 20 20 20 20 20  ).    try:.     
57f0: 20 20 20 62 6f 6f 74 73 74 72 61 70 28 29 0a 20     bootstrap(). 
5800: 20 20 20 20 20 20 20 70 72 69 6e 74 28 22 42 75         print("Bu
5810: 69 6c 64 20 63 6f 6d 70 6c 65 74 65 64 20 73 75  ild completed su
5820: 63 63 65 73 73 66 75 6c 6c 79 20 69 6e 20 25 73  ccessfully in %s
5830: 22 20 25 20 66 6f 72 6d 61 74 5f 62 75 69 6c 64  " % format_build
5840: 5f 74 69 6d 65 28 74 69 6d 65 28 29 20 2d 20 73  _time(time() - s
5850: 74 61 72 74 5f 74 69 6d 65 29 29 0a 20 20 20 20  tart_time)).    
5860: 65 78 63 65 70 74 20 28 53 79 73 74 65 6d 45 78  except (SystemEx
5870: 69 74 2c 20 4b 65 79 62 6f 61 72 64 49 6e 74 65  it, KeyboardInte
5880: 72 72 75 70 74 29 20 61 73 20 65 3a 0a 20 20 20  rrupt) as e:.   
5890: 20 20 20 20 20 69 66 20 68 61 73 61 74 74 72 28       if hasattr(
58a0: 65 2c 20 27 63 6f 64 65 27 29 20 61 6e 64 20 69  e, 'code') and i
58b0: 73 69 6e 73 74 61 6e 63 65 28 65 2e 63 6f 64 65  sinstance(e.code
58c0: 2c 20 69 6e 74 29 3a 0a 20 20 20 20 20 20 20 20  , int):.        
58d0: 20 20 20 20 65 78 69 74 5f 63 6f 64 65 20 3d 20      exit_code = 
58e0: 65 2e 63 6f 64 65 0a 20 20 20 20 20 20 20 20 65  e.code.        e
58f0: 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20  lse:.           
5900: 20 65 78 69 74 5f 63 6f 64 65 20 3d 20 31 0a 20   exit_code = 1. 
5910: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
5920: 28 65 29 0a 20 20 20 20 20 20 20 20 70 72 69 6e  (e).        prin
5930: 74 28 22 42 75 69 6c 64 20 63 6f 6d 70 6c 65 74  t("Build complet
5940: 65 64 20 75 6e 73 75 63 63 65 73 73 66 75 6c 6c  ed unsuccessfull
5950: 79 20 69 6e 20 25 73 22 20 25 20 66 6f 72 6d 61  y in %s" % forma
5960: 74 5f 62 75 69 6c 64 5f 74 69 6d 65 28 74 69 6d  t_build_time(tim
5970: 65 28 29 20 2d 20 73 74 61 72 74 5f 74 69 6d 65  e() - start_time
5980: 29 29 0a 20 20 20 20 20 20 20 20 73 79 73 2e 65  )).        sys.e
5990: 78 69 74 28 65 78 69 74 5f 63 6f 64 65 29 0a 0a  xit(exit_code)..
59a0: 69 66 20 5f 5f 6e 61 6d 65 5f 5f 20 3d 3d 20 27  if __name__ == '
59b0: 5f 5f 6d 61 69 6e 5f 5f 27 3a 0a 20 20 20 20 6d  __main__':.    m
59c0: 61 69 6e 28 29 0a                                ain().