view python/zcc.py @ 377:9667d78ba79e

Switched to xml for project description
author Windel Bouwman
date Fri, 11 Apr 2014 15:47:50 +0200
parents 39bf68bf1891
children 6df89163e114
line wrap: on
line source

#!/usr/bin/env python

import sys
import os
import argparse
import logging

from ppci.tasks import TaskRunner
import ppci.buildtasks
from ppci.report import RstFormatter
from ppci.objectfile import ObjectFile
from ppci.target.target_list import targets, targetnames
from ppci.recipe import RecipeLoader
import ppci


def logLevel(s):
    """ Converts a string to a valid logging level """
    numeric_level = getattr(logging, s.upper(), None)
    if not isinstance(numeric_level, int):
        raise ValueError('Invalid log level: {}'.format(s))
    return numeric_level


def make_parser():
    parser = argparse.ArgumentParser(description='lcfos Compiler')

    parser.add_argument('--log', help='Log level (INFO,DEBUG,[WARN])',
                        type=logLevel, default='INFO')
    parser.add_argument('--report',
                help='Specify a file to write the compile report to',
                type=argparse.FileType('w'))
    parser.add_argument('--buildfile',
        help='use buildfile, otherwise build.xml is the default',
        default='build.xml')

    parser.add_argument('targets', metavar='target', nargs='*')
    return parser


def main(args):
    # Configure some logging:
    logging.getLogger().setLevel(logging.DEBUG)
    ch = logging.StreamHandler()
    ch.setFormatter(logging.Formatter(ppci.logformat))
    ch.setLevel(args.log)
    logging.getLogger().addHandler(ch)

    if args.report:
        fh = logging.StreamHandler(args.report)
        fh.setFormatter(RstFormatter())
        logging.getLogger().addHandler(fh)

    recipe_loader = RecipeLoader()
    try:
        project = recipe_loader.load_file(args.buildfile)
    except OSError as e:
        res = 1

    runner = TaskRunner()
    res = runner.run(project, args.targets)

    if args.report:
        logging.getLogger().removeHandler(fh)
        args.report.close()

    logging.getLogger().removeHandler(ch)
    return res


if __name__ == '__main__':
    parser = make_parser()
    arguments = parser.parse_args()
    sys.exit(main(arguments))