| #!/usr/bin/env python3 |
| |
| # 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() |
| |
| prserv = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'conf', 'prserv.inc') |
| if os.path.isfile(prserv): |
| with open(logfile, 'a') as logf: |
| logf.write('Importing PR data...\n') |
| |
| ret = run_command_interruptible('bitbake-prserv-tool import %s' % prserv) |
| |
| lastlog = get_last_consolelog() |
| if lastlog: |
| with open(lastlog, 'r') as f: |
| for line in f: |
| logf.write(line) |
| if ret: |
| print('ERROR: PR data import failed: error log written to %s' % logfile) |
| return ret |
| |
| 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 -c build_native_sysroot && bitbake --quiet build-sysroots -c build_target_sysroot') |
| 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) |