view python/ppci/buildtasks.py @ 329:8f6f3ace4e78

Added build tasks
author Windel Bouwman
date Wed, 05 Feb 2014 21:29:31 +0100
parents
children a78b41ff6ad2
line wrap: on
line source


"""
Defines task classes that can compile, link etc..
Task can depend upon one another.
"""

import logging

from .c3 import Builder
from .irutils import Verifier
from .codegen import CodeGenerator
from .transform import CleanPass, RemoveAddZero
from .tasks import Task
from . import DiagnosticsManager


class Assemble(Task):
    def __init__(self):
        super().__init__('Assemble')

    def run(self):
        pass


class Compile(Task):
    """ Task that compiles source to some target """
    def __init__(self, sources, includes, target, output_object):
        super().__init__('Compile')
        self.sources = sources
        self.includes = includes
        self.target = target
        self.output = output_object

    def run(self):
        logger = logging.getLogger('zcc')
        logger.info('Zcc started {}'.format(self.sources))
        diag = DiagnosticsManager()
        c3b = Builder(diag, self.target)
        cg = CodeGenerator(self.target)

        for ircode in c3b.build(self.sources, self.includes):
            if not ircode:
                return

            d = {'ircode':ircode}
            logger.info('Verifying code {}'.format(ircode), extra=d)
            Verifier().verify(ircode)

            # Optimization passes:
            CleanPass().run(ircode)
            Verifier().verify(ircode)
            RemoveAddZero().run(ircode)
            Verifier().verify(ircode)
            CleanPass().run(ircode)
            Verifier().verify(ircode)

            # Code generation:
            d = {'ircode':ircode}
            logger.info('Starting code generation for {}'.format(ircode), extra=d)
            cg.generate(ircode, self.output)

        # TODO: fixup references, do this in another way?
        self.output.backpatch()
        if not c3b.ok:
            diag.printErrors()
            raise TaskError('Compile errors')


class Link(Task):
    def __init__(self, objects, output_file):
        super().__init__('Link')


class ObjCopy(Task):
    pass


def load_recipe(recipe, runner):
    """ Loads a recipe dictionary into a task runner """
    if 'compile' in recipe:
        #sources =
        runner.add_task(Compile())
    else:
        raise Exception()