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