#!/usr/bin/env python

# 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()
    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')
        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)
