12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- #!/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)
|