blob: d191e5e19c598a424717da8f70039374851b5c44 [file] [log] [blame]
Brad Bishop96ff1982019-08-19 13:50:42 -04001#!/usr/bin/env python3
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05002
3# Prepare the build system within the extensible SDK
4
5import sys
6import os
7import subprocess
Patrick Williamsc0f7c042017-02-23 20:41:17 -06008import signal
Patrick Williamsd8c66bc2016-06-20 12:57:21 -05009
Patrick Williamsc0f7c042017-02-23 20:41:17 -060010def reenable_sigint():
11 signal.signal(signal.SIGINT, signal.SIG_DFL)
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050012
Patrick Williamsc0f7c042017-02-23 20:41:17 -060013def 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
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050024
Patrick Williamsc0f7c042017-02-23 20:41:17 -060025def 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
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050037
38def main():
39 if len(sys.argv) < 2:
Patrick Williamsc0f7c042017-02-23 20:41:17 -060040 print('Please specify output log file')
41 return 1
42 logfile = sys.argv[1]
43 if len(sys.argv) < 3:
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050044 sdk_targets = []
45 else:
Patrick Williamsc0f7c042017-02-23 20:41:17 -060046 sdk_targets = ' '.join(sys.argv[2:]).split()
Andrew Geissler95ac1b82021-03-31 14:34:31 -050047
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
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050064 if not sdk_targets:
65 # Just do a parse so the cache is primed
Patrick Williamsc0f7c042017-02-23 20:41:17 -060066 ret = run_command_interruptible('bitbake -p --quiet')
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050067 return ret
68
Patrick Williamsc0f7c042017-02-23 20:41:17 -060069 with open(logfile, 'a') as logf:
70 logf.write('Preparing SDK for %s...\n' % ', '.join(sdk_targets))
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050071
Patrick Williamsc0f7c042017-02-23 20:41:17 -060072 ret = run_command_interruptible('BB_SETSCENE_ENFORCE=1 bitbake --quiet %s' % ' '.join(sdk_targets))
Brad Bishop6e60e8b2018-02-01 10:27:11 -050073 if not ret:
74 ret = run_command_interruptible('bitbake --quiet build-sysroots')
Patrick Williamsc0f7c042017-02-23 20:41:17 -060075 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
Patrick Williamsd8c66bc2016-06-20 12:57:21 -050083
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)