1#!/usr/bin/env python3 2 3# Prepare the build system within the extensible SDK 4 5import sys 6import os 7import subprocess 8import signal 9 10def reenable_sigint(): 11 signal.signal(signal.SIGINT, signal.SIG_DFL) 12 13def run_command_interruptible(cmd): 14 """ 15 Run a command with output displayed on the console, but ensure any Ctrl+C is 16 processed only by the child process. 17 """ 18 signal.signal(signal.SIGINT, signal.SIG_IGN) 19 try: 20 ret = subprocess.call(cmd, shell=True, preexec_fn=reenable_sigint) 21 finally: 22 signal.signal(signal.SIGINT, signal.SIG_DFL) 23 return ret 24 25def get_last_consolelog(): 26 '''Return the most recent console log file''' 27 logdir = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'tmp', 'log', 'cooker') 28 if os.path.exists(logdir): 29 mcdir = os.listdir(logdir) 30 if mcdir: 31 logdir = os.path.join(logdir, mcdir[0]) 32 logfiles = [os.path.join(logdir, fn) for fn in os.listdir(logdir)] 33 logfiles.sort(key=os.path.getmtime) 34 if logfiles: 35 return os.path.join(logdir, logfiles[-1]) 36 return None 37 38def main(): 39 if len(sys.argv) < 2: 40 print('Please specify output log file') 41 return 1 42 logfile = sys.argv[1] 43 if len(sys.argv) < 3: 44 sdk_targets = [] 45 else: 46 sdk_targets = ' '.join(sys.argv[2:]).split() 47 48 prserv = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'conf', 'prserv.inc') 49 if os.path.isfile(prserv): 50 with open(logfile, 'a') as logf: 51 logf.write('Importing PR data...\n') 52 53 ret = run_command_interruptible('bitbake-prserv-tool import %s' % prserv) 54 55 lastlog = get_last_consolelog() 56 if lastlog: 57 with open(lastlog, 'r') as f: 58 for line in f: 59 logf.write(line) 60 if ret: 61 print('ERROR: PR data import failed: error log written to %s' % logfile) 62 return ret 63 64 if not sdk_targets: 65 # Just do a parse so the cache is primed 66 ret = run_command_interruptible('bitbake -p --quiet') 67 return ret 68 69 with open(logfile, 'a') as logf: 70 logf.write('Preparing SDK for %s...\n' % ', '.join(sdk_targets)) 71 72 ret = run_command_interruptible('BB_SETSCENE_ENFORCE=1 bitbake --quiet %s' % ' '.join(sdk_targets)) 73 if not ret: 74 ret = run_command_interruptible('bitbake --quiet build-sysroots -c build_native_sysroot && bitbake --quiet build-sysroots -c build_target_sysroot') 75 lastlog = get_last_consolelog() 76 if lastlog: 77 with open(lastlog, 'r') as f: 78 for line in f: 79 logf.write(line) 80 if ret: 81 print('ERROR: SDK preparation failed: error log written to %s' % logfile) 82 return ret 83 84if __name__ == "__main__": 85 try: 86 ret = main() 87 except Exception: 88 ret = 1 89 import traceback 90 traceback.print_exc() 91 sys.exit(ret) 92