xref: /openbmc/openbmc/poky/meta/files/ext-sdk-prepare.py (revision 5082cc7fedfff6c28a1406c79606b09012b134bc)
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