#!/usr/bin/env python # Prepare the build system within the extensible SDK import sys import os import subprocess import signal def reenable_sigint(): signal.signal(signal.SIGINT, signal.SIG_DFL) 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 output log file') return 1 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 with open(logfile, 'a') as logf: logf.write('Preparing SDK for %s...\n' % ', '.join(sdk_targets)) 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: ret = main() except Exception: ret = 1 import traceback traceback.print_exc() sys.exit(ret)