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