diff options
Diffstat (limited to 'meta/files/ext-sdk-prepare.py')
| -rw-r--r-- | meta/files/ext-sdk-prepare.py | 116 |
1 files changed, 49 insertions, 67 deletions
diff --git a/meta/files/ext-sdk-prepare.py b/meta/files/ext-sdk-prepare.py index 143e0feba0..96c5212a2e 100644 --- a/meta/files/ext-sdk-prepare.py +++ b/meta/files/ext-sdk-prepare.py @@ -5,82 +5,64 @@ import sys import os import subprocess +import signal -def exec_watch(cmd, **options): - """Run program with stdout shown on sys.stdout""" - if isinstance(cmd, basestring) and not "shell" in options: - options["shell"] = True +def reenable_sigint(): + signal.signal(signal.SIGINT, signal.SIG_DFL) - process = subprocess.Popen( - cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, **options - ) - - buf = '' - while True: - out = process.stdout.read(1) - if out: - sys.stdout.write(out) - sys.stdout.flush() - buf += out - elif out == '' and process.poll() != None: - break - - return process.returncode, buf +def run_command_interruptible(cmd): + """ + Run a command with output displayed on the console, but ensure any Ctrl+C is + processed only by the child process. + """ + signal.signal(signal.SIGINT, signal.SIG_IGN) + try: + ret = subprocess.call(cmd, shell=True, preexec_fn=reenable_sigint) + finally: + signal.signal(signal.SIGINT, signal.SIG_DFL) + return ret +def get_last_consolelog(): + '''Return the most recent console log file''' + logdir = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'tmp', 'log', 'cooker') + if os.path.exists(logdir): + mcdir = os.listdir(logdir) + if mcdir: + logdir = os.path.join(logdir, mcdir[0]) + logfiles = [os.path.join(logdir, fn) for fn in os.listdir(logdir)] + logfiles.sort(key=os.path.getmtime) + if logfiles: + return os.path.join(logdir, logfiles[-1]) + return None def main(): if len(sys.argv) < 2: - print('Please specify target to prepare with') + print('Please specify output log file') return 1 - - sdk_targets = ' '.join(sys.argv[1:]).split() - print('Preparing SDK for %s...' % ', '.join(sdk_targets)) - - ret, out = exec_watch('bitbake %s --setscene-only' % ' '.join(sdk_targets)) - if ret: + logfile = sys.argv[1] + if len(sys.argv) < 3: + sdk_targets = [] + else: + sdk_targets = ' '.join(sys.argv[2:]).split() + if not sdk_targets: + # Just do a parse so the cache is primed + ret = run_command_interruptible('bitbake -p --quiet') return ret - targetlist = [] - for target in sdk_targets: - if ':' in target: - target = target.split(':')[0] - if not target in targetlist: - targetlist.append(target) + with open(logfile, 'a') as logf: + logf.write('Preparing SDK for %s...\n' % ', '.join(sdk_targets)) - recipes = [] - for target in targetlist: - try: - out = subprocess.check_output(('bitbake -e %s' % target).split(), stderr=subprocess.STDOUT) - for line in out.splitlines(): - if line.startswith('FILE='): - splitval = line.rstrip().split('=') - if len(splitval) > 1: - recipes.append(splitval[1].strip('"')) - break - except subprocess.CalledProcessError as e: - print('ERROR: Failed to get recipe for target %s:\n%s' % (target, e.output)) - return 1 - - try: - out = subprocess.check_output('bitbake %s -n' % ' '.join(sdk_targets), stderr=subprocess.STDOUT, shell=True) - unexpected = [] - for line in out.splitlines(): - if 'Running task' in line: - for recipe in recipes: - if recipe in line: - break - else: - line = line.split('Running', 1)[-1] - unexpected.append(line.rstrip()) - except subprocess.CalledProcessError as e: - print('ERROR: Failed to execute dry-run:\n%s' % e.output) - return 1 - - if unexpected: - print('ERROR: Unexpected tasks left over to be executed:') - for line in unexpected: - print(' ' + line) - return 1 + ret = run_command_interruptible('BB_SETSCENE_ENFORCE=1 bitbake --quiet %s' % ' '.join(sdk_targets)) + if not ret: + ret = run_command_interruptible('bitbake --quiet build-sysroots') + lastlog = get_last_consolelog() + if lastlog: + with open(lastlog, 'r') as f: + for line in f: + logf.write(line) + if ret: + print('ERROR: SDK preparation failed: error log written to %s' % logfile) + return ret if __name__ == "__main__": try: @@ -88,5 +70,5 @@ if __name__ == "__main__": except Exception: ret = 1 import traceback - traceback.print_exc(5) + traceback.print_exc() sys.exit(ret) |
