annotate python/ppci/buildtasks.py @ 335:582a1aaa3983

Added long branch format
author Windel Bouwman
date Mon, 17 Feb 2014 20:41:30 +0100
parents 6f4753202b9a
children d1ecc493384e
rev   line source
329
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
1
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
2 """
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
3 Defines task classes that can compile, link etc..
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
4 Task can depend upon one another.
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
5 """
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
6
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
7 import logging
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
8
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
9 from .c3 import Builder
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
10 from .irutils import Verifier
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
11 from .codegen import CodeGenerator
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
12 from .transform import CleanPass, RemoveAddZero
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
13 from .tasks import Task
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
14 from . import DiagnosticsManager
334
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
15 from .assembler import Assembler
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
16 from .objectfile import ObjectFile
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
17 from .linker import Linker
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
18 import outstream
329
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
19
335
582a1aaa3983 Added long branch format
Windel Bouwman
parents: 334
diff changeset
20
331
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
21 class BuildTask(Task):
334
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
22 """ Base task for all kind of weird build tasks """
331
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
23 def __init__(self, name):
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
24 super().__init__(name)
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
25 self.logger = logging.getLogger('buildtask')
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
26
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
27
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
28 class Assemble(BuildTask):
334
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
29 """ Task that can runs the assembler over the source and enters the
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
30 output into an object file """
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
31 def __init__(self, source, target, output_object):
329
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
32 super().__init__('Assemble')
334
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
33 self.source = source
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
34 self.assembler = Assembler(target=target)
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
35 self.output = output_object
329
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
36
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
37 def run(self):
334
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
38 self.assembler.assemble(self.source)
329
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
39
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
40
331
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
41 class Compile(BuildTask):
334
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
42 """ Task that compiles C3 source for some target into an object file """
329
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
43 def __init__(self, sources, includes, target, output_object):
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
44 super().__init__('Compile')
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
45 self.sources = sources
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
46 self.includes = includes
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
47 self.target = target
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
48 self.output = output_object
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
49
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
50 def run(self):
334
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
51 self.logger.debug('Compile started')
329
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
52 diag = DiagnosticsManager()
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
53 c3b = Builder(diag, self.target)
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
54 cg = CodeGenerator(self.target)
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
55
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
56 for ircode in c3b.build(self.sources, self.includes):
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
57 if not ircode:
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
58 return
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
59
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
60 d = {'ircode':ircode}
334
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
61 self.logger.debug('Verifying code {}'.format(ircode), extra=d)
329
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
62 Verifier().verify(ircode)
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
63
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
64 # Optimization passes:
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
65 CleanPass().run(ircode)
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
66 Verifier().verify(ircode)
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
67 RemoveAddZero().run(ircode)
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
68 Verifier().verify(ircode)
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
69 CleanPass().run(ircode)
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
70 Verifier().verify(ircode)
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
71
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
72 # Code generation:
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
73 d = {'ircode':ircode}
334
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
74 self.logger.debug('Starting code generation for {}'.format(ircode), extra=d)
335
582a1aaa3983 Added long branch format
Windel Bouwman
parents: 334
diff changeset
75 o = outstream.BinaryOutputStream(self.output)
334
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
76 cg.generate(ircode, o)
329
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
77
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
78 if not c3b.ok:
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
79 diag.printErrors()
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
80 raise TaskError('Compile errors')
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
81
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
82
331
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
83 class Link(BuildTask):
334
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
84 """ Link together a collection of object files """
329
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
85 def __init__(self, objects, output_file):
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
86 super().__init__('Link')
334
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
87 self.objects = objects
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
88 self.linker = Linker()
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
89 self.duration = 0.1337
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
90
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
91 def run(self):
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
92 self.linker.link(self.objects)
329
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
93
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
94
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
95 class ObjCopy(Task):
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
96 pass
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents:
diff changeset
97