Bug 1369658 - Print out subconfigure output while it runs. r?gps draft
authorMike Hommey <mh+mozilla@glandium.org>
Fri, 02 Jun 2017 17:13:06 +0900
changeset 588155 654ecf12fd8ed79c7643e90c00dd5342dda187cd
parent 588154 e467b0af7ce5ccb821c3df15c1562650fcac0459
child 631479 3a9554a9620531d6169068de6668b407c922017a
push id61930
push userbmo:mh+mozilla@glandium.org
push dateFri, 02 Jun 2017 08:15:23 +0000
reviewersgps
bugs1369658
milestone55.0a1
Bug 1369658 - Print out subconfigure output while it runs. r?gps Now that subconfigure don't run in parallel, we don't need to care that their output can be interleaved, so print it out while the subconfigure executes.
build/subconfigure.py
--- a/build/subconfigure.py
+++ b/build/subconfigure.py
@@ -238,19 +238,32 @@ def prepare(srcdir, objdir, shell, args)
     with open(data_file, 'wb') as f:
         pickle.dump(data, f)
 
 
 def prefix_lines(text, prefix):
     return ''.join('%s> %s' % (prefix, line) for line in text.splitlines(True))
 
 
+def execute_and_prefix(*args, **kwargs):
+    prefix = kwargs['prefix']
+    del kwargs['prefix']
+    proc = subprocess.Popen(*args, stdout=subprocess.PIPE,
+                            stderr=subprocess.STDOUT, **kwargs)
+    while True:
+        line = proc.stdout.readline()
+        if not line:
+            break
+        print prefix_lines(line.rstrip(), prefix)
+        sys.stdout.flush()
+    return proc.wait()
+
+
 def run(objdir):
     ret = 0
-    output = ''
 
     with open(os.path.join(objdir, CONFIGURE_DATA), 'rb') as f:
         data = pickle.load(f)
 
     data['objdir'] = objdir
     relobjdir = data['relobjdir'] = os.path.relpath(objdir, os.getcwd())
 
     cache_file = data['cache-file']
@@ -315,21 +328,20 @@ def run(objdir):
 
         # Pass --no-create to configure so that it doesn't run config.status.
         # We're going to run it ourselves.
         command += ['--no-create']
 
         print prefix_lines('configuring', relobjdir)
         print prefix_lines('running %s' % ' '.join(command[:-1]), relobjdir)
         sys.stdout.flush()
-        try:
-            output += subprocess.check_output(command,
-                stderr=subprocess.STDOUT, cwd=objdir, env=data['env'])
-        except subprocess.CalledProcessError as e:
-            return relobjdir, e.returncode, e.output
+        returncode = execute_and_prefix(command, cwd=objdir, env=data['env'],
+                                        prefix=relobjdir)
+        if returncode:
+            return returncode
 
         # Leave config.status with a new timestamp if configure is newer than
         # its original mtime.
         if config_status and os.path.getmtime(configure) <= config_status.mtime:
             config_status.update_time()
 
     # Only run config.status if one of the following is true:
     # - config.status changed or did not exist
@@ -353,28 +365,23 @@ def run(objdir):
             if not os.path.exists(t) or \
                     os.path.getmtime(f) < os.path.getmtime(t):
                 skip_config_status = False
 
     if not skip_config_status:
         if skip_configure:
             print prefix_lines('running config.status', relobjdir)
             sys.stdout.flush()
-        try:
-            output += subprocess.check_output([data['shell'], '-c',
-                './config.status'], stderr=subprocess.STDOUT, cwd=objdir,
-                env=data['env'])
-        except subprocess.CalledProcessError as e:
-            ret = e.returncode
-            output += e.output
+        ret = execute_and_prefix([data['shell'], '-c', './config.status'],
+                                 cwd=objdir, env=data['env'], prefix=relobjdir)
 
         for f in contents:
             f.update_time()
 
-    return relobjdir, ret, output
+    return ret
 
 
 def subconfigure(args):
     parser = argparse.ArgumentParser()
     parser.add_argument('--list', type=str,
         help='File containing a list of subconfigures to run')
     parser.add_argument('--skip', type=str,
         help='File containing a list of Subconfigures to skip')
@@ -388,19 +395,17 @@ def subconfigure(args):
         skips = set(open(args.skip, 'rb').read().splitlines())
         subconfigures = [s for s in subconfigures if s not in skips]
 
     if not subconfigures:
         return 0
 
     ret = 0
     for subconfigure in subconfigures:
-        relobjdir, returncode, output = run(subconfigure)
-        print prefix_lines(output, relobjdir)
-        sys.stdout.flush()
+        returncode = run(subconfigure)
         ret = max(returncode, ret)
         if ret:
             break
     return ret
 
 
 def main(args):
     if args[0] != '--prepare':