Skip to content

Commit 14b6262

Browse files
authored
Rollup merge of rust-lang#48569 - Phlosioneer:x-py-help-optimization, r=petrochenkov
Improve --help performance for x.py Since compiling the bootstrap command doesn't require any submodules, we can skip updating submodules when a --help command is passed in. On my machine, this saves 1 minute if the submodules are already downloaded, and 10 minutes if run on a clean repo. This commit also adds a message before compiling/downloading anything when a --help command is passed in, to tell the user WHY --help takes so long to complete. It also points the user to the bootstrap README.md for faster help. Finally, this fixes one warning message that still referenced using make instead of x.py, even though x.py is now the standard way of building rust. Closes rust-lang#37305
2 parents ae6fe8f + 2269ff5 commit 14b6262

File tree

1 file changed

+15
-25
lines changed

1 file changed

+15
-25
lines changed

src/bootstrap/bootstrap.py

+15-25
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,6 @@ def __init__(self):
314314
self.build_dir = os.path.join(os.getcwd(), "build")
315315
self.clean = False
316316
self.config_toml = ''
317-
self.printed = False
318317
self.rust_root = os.path.abspath(os.path.join(__file__, '../../..'))
319318
self.use_locked_deps = ''
320319
self.use_vendored_sources = ''
@@ -336,7 +335,6 @@ def download_stage0(self):
336335
if self.rustc().startswith(self.bin_root()) and \
337336
(not os.path.exists(self.rustc()) or
338337
self.program_out_of_date(self.rustc_stamp())):
339-
self.print_what_bootstrap_means()
340338
if os.path.exists(self.bin_root()):
341339
shutil.rmtree(self.bin_root())
342340
filename = "rust-std-{}-{}.tar.gz".format(
@@ -354,7 +352,6 @@ def download_stage0(self):
354352
if self.cargo().startswith(self.bin_root()) and \
355353
(not os.path.exists(self.cargo()) or
356354
self.program_out_of_date(self.cargo_stamp())):
357-
self.print_what_bootstrap_means()
358355
filename = "cargo-{}-{}.tar.gz".format(cargo_channel, self.build)
359356
self._download_stage0_helper(filename, "cargo")
360357
self.fix_executable("{}/bin/cargo".format(self.bin_root()))
@@ -555,23 +552,6 @@ def exe_suffix():
555552
return '.exe'
556553
return ''
557554

558-
def print_what_bootstrap_means(self):
559-
"""Prints more information about the build system"""
560-
if hasattr(self, 'printed'):
561-
return
562-
self.printed = True
563-
if os.path.exists(self.bootstrap_binary()):
564-
return
565-
if '--help' not in sys.argv or len(sys.argv) == 1:
566-
return
567-
568-
print('info: the build system for Rust is written in Rust, so this')
569-
print(' script is now going to download a stage0 rust compiler')
570-
print(' and then compile the build system itself')
571-
print('')
572-
print('info: in the meantime you can read more about rustbuild at')
573-
print(' src/bootstrap/README.md before the download finishes')
574-
575555
def bootstrap_binary(self):
576556
"""Return the path of the boostrap binary
577557
@@ -585,7 +565,6 @@ def bootstrap_binary(self):
585565

586566
def build_bootstrap(self):
587567
"""Build bootstrap"""
588-
self.print_what_bootstrap_means()
589568
build_dir = os.path.join(self.build_dir, "bootstrap")
590569
if self.clean and os.path.exists(build_dir):
591570
shutil.rmtree(build_dir)
@@ -670,8 +649,16 @@ def set_dev_environment(self):
670649
self._download_url = 'https://dev-static.rust-lang.org'
671650

672651

673-
def bootstrap():
652+
def bootstrap(help_triggered):
674653
"""Configure, fetch, build and run the initial bootstrap"""
654+
655+
# If the user is asking for help, let them know that the whole download-and-build
656+
# process has to happen before anything is printed out.
657+
if help_triggered:
658+
print("info: Downloading and building bootstrap before processing --help")
659+
print(" command. See src/bootstrap/README.md for help with common")
660+
print(" commands.")
661+
675662
parser = argparse.ArgumentParser(description='Build rust')
676663
parser.add_argument('--config')
677664
parser.add_argument('--build')
@@ -708,7 +695,7 @@ def bootstrap():
708695
print(' and so in order to preserve your $HOME this will now')
709696
print(' use vendored sources by default. Note that if this')
710697
print(' does not work you should run a normal build first')
711-
print(' before running a command like `sudo make install`')
698+
print(' before running a command like `sudo ./x.py install`')
712699

713700
if build.use_vendored_sources:
714701
if not os.path.exists('.cargo'):
@@ -734,7 +721,10 @@ def bootstrap():
734721
if 'dev' in data:
735722
build.set_dev_environment()
736723

737-
build.update_submodules()
724+
# No help text depends on submodules. This check saves ~1 minute of git commands, even if
725+
# all the submodules are present and downloaded!
726+
if not help_triggered:
727+
build.update_submodules()
738728

739729
# Fetch/build the bootstrap
740730
build.build = args.build or build.build_triple()
@@ -760,7 +750,7 @@ def main():
760750
help_triggered = (
761751
'-h' in sys.argv) or ('--help' in sys.argv) or (len(sys.argv) == 1)
762752
try:
763-
bootstrap()
753+
bootstrap(help_triggered)
764754
if not help_triggered:
765755
print("Build completed successfully in {}".format(
766756
format_build_time(time() - start_time)))

0 commit comments

Comments
 (0)