#! /usr/bin/env python
"""
LIBRARIES BUILD
"""
import sys
from time import time
from os.path import join, abspath, dirname

# Be sure that the tools directory is in the search path
ROOT = abspath(join(dirname(__file__), ".."))
sys.path.append(ROOT)

from workspace_tools.toolchains import TOOLCHAINS
from workspace_tools.targets import TARGET_NAMES, TARGET_MAP
from workspace_tools.options import get_default_options_parser
from workspace_tools.build_api import build_mbed_libs, build_lib


if __name__ == '__main__':
    start = time()
    
    # Parse Options
    parser = get_default_options_parser()
    
    # Extra libraries
    parser.add_option("-r", "--rtos", action="store_true", dest="rtos",
                      default=False, help="Compile the rtos")
    parser.add_option("-b", "--debug", action="store_true", dest="debug",
                      default=False, help="Compile the debugging library")
    parser.add_option("-f", "--fatfs", action="store_true", dest="fatfs",
                      default=False, help="Compile the fatfs")
    parser.add_option("-e", "--eth", action="store_true", dest="eth",
                      default=False, help="Compile the ethernet library")
    parser.add_option("-V", "--vodafone", action="store_true", dest="vodafone",
                      default=False, help="Compile the Vodafone library")
    parser.add_option("-U", "--usb_host", action="store_true", dest="usb_host",
                      default=False, help="Compile the USB Host library")
    parser.add_option("-u", "--usb", action="store_true", dest="usb",
                      default=False, help="Compile the USB Device library")
    parser.add_option("-d", "--dsp", action="store_true", dest="dsp",
                      default=False, help="Compile the DSP library")
    parser.add_option("-v", "--verbose", action="store_true", dest="verbose",
                      default=False, help="Verbose diagnostic output")
    
    (options, args) = parser.parse_args()
    
    # Get target list
    if options.mcu:
        targets = [options.mcu]
    else:
        targets = TARGET_NAMES
    
    # Get toolchains list
    if options.tool:
        toolchains = [options.tool]
    else:
        toolchains = TOOLCHAINS
    
    # Get libraries list
    libraries = []
    
    # Additional Libraries
    if options.rtos:
        libraries.extend(["rtx", "rtos"])
    if options.debug:
        libraries.append("debug")
    if options.fatfs:
        libraries.append("fatfs")
    if options.usb_host:
        libraries.append("usb_host")
    if options.eth:
        libraries.append("eth")
    if options.vodafone:
        libraries.append("vodafone")
    if options.usb:
        libraries.append("usb")
    if options.dsp:
        libraries.extend(["cmsis_dsp", "dsp"])
    
    # Build
    failures = []
    successes = []
    for toolchain in toolchains:
        for target in targets:
            id = "%s::%s" % (toolchain, target)
            try:
                mcu = TARGET_MAP[target]
                build_mbed_libs(mcu, toolchain, options=options.options,
                                verbose=options.verbose, clean=options.clean)
                for lib_id in libraries:
                    build_lib(lib_id, mcu, toolchain, options=options.options,
                              verbose=options.verbose, clean=options.clean)
                successes.append(id)
            except Exception, e:
                if options.verbose:
                    import sys, traceback
                    traceback.print_exc(file=sys.stdout)
                    sys.exit(1)
                
                failures.append(id)
                print e
    
    # Write summary of the builds
    print "\n\nCompleted in: (%.2f)s" % (time() - start)
    
    if successes:
        print "\n\nBuild successes:"
        print "\n".join(["  * %s" % s for s in successes])
    
    if failures:
        print "\n\nBuild failures:"
        print "\n".join(["  * %s" % f for f in failures])
