xref: /OK3568_Linux_fs/yocto/poky/meta/files/ext-sdk-prepare.py (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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