annotate python/zcc.py @ 336:d1ecc493384e

Added spiffy armtoken class for bit fiddeling. Added cool test that checks for build repeatability
author Windel Bouwman
date Wed, 19 Feb 2014 22:32:15 +0100
parents 6f4753202b9a
children 86b02c98a717
rev   line source
292
534b94b40aa8 Fixup reorganize
Windel Bouwman
parents: 290
diff changeset
1 #!/usr/bin/env python
104
ed230e947dc6 Added hexviewer
windel
parents:
diff changeset
2
287
1c7c1e619be8 File movage
Windel Bouwman
parents: 281
diff changeset
3 import sys
331
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
4 import os
287
1c7c1e619be8 File movage
Windel Bouwman
parents: 281
diff changeset
5 import argparse
1c7c1e619be8 File movage
Windel Bouwman
parents: 281
diff changeset
6 import logging
331
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
7 import yaml
287
1c7c1e619be8 File movage
Windel Bouwman
parents: 281
diff changeset
8
334
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
9 from ppci.buildtasks import Compile, Assemble, Link
329
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents: 323
diff changeset
10 from ppci.tasks import TaskRunner
331
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
11 from ppci.report import RstFormatter
334
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
12 from ppci.objectfile import ObjectFile
323
e9fe6988497c Used burg for generating expressions
Windel Bouwman
parents: 322
diff changeset
13 from target.target_list import target_list
331
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
14 import ppci
281
4496cae24d7f Improved logview
Windel Bouwman
parents: 276
diff changeset
15
289
bd2593de3ff8 Semifix burn2
Windel Bouwman
parents: 288
diff changeset
16
253
74c6a20302d5 Added better logging
Windel Bouwman
parents: 252
diff changeset
17 def logLevel(s):
312
2c9768114877 Added cool logging formatter
Windel Bouwman
parents: 311
diff changeset
18 """ Converts a string to a valid logging level """
253
74c6a20302d5 Added better logging
Windel Bouwman
parents: 252
diff changeset
19 numeric_level = getattr(logging, s.upper(), None)
74c6a20302d5 Added better logging
Windel Bouwman
parents: 252
diff changeset
20 if not isinstance(numeric_level, int):
74c6a20302d5 Added better logging
Windel Bouwman
parents: 252
diff changeset
21 raise ValueError('Invalid log level: {}'.format(s))
74c6a20302d5 Added better logging
Windel Bouwman
parents: 252
diff changeset
22 return numeric_level
105
6a303f835c6d Removed compilers directory
Windel Bouwman
parents: 104
diff changeset
23
289
bd2593de3ff8 Semifix burn2
Windel Bouwman
parents: 288
diff changeset
24
323
e9fe6988497c Used burg for generating expressions
Windel Bouwman
parents: 322
diff changeset
25 targets = {t.name: t for t in target_list}
292
534b94b40aa8 Fixup reorganize
Windel Bouwman
parents: 290
diff changeset
26 targetnames = list(targets.keys())
290
7b38782ed496 File moves
Windel Bouwman
parents: 289
diff changeset
27
331
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
28 def make_parser():
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
29 parser = argparse.ArgumentParser(description='lcfos Compiler')
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
30
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
31 parser.add_argument('--log', help='Log level (INFO,DEBUG,[WARN])',
334
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
32 type=logLevel, default='INFO')
332
87feb8a23b4d Added task list command
Windel Bouwman
parents: 331
diff changeset
33 parser.add_argument('--display-build-steps', action='store_true')
331
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
34 sub_parsers = parser.add_subparsers(title='commands',
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
35 description='possible commands', dest='command')
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
36 recipe_parser = sub_parsers.add_parser('recipe', help="Bake recipe")
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
37 recipe_parser.add_argument('recipe_file', help='recipe file')
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
38
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
39 compile_parser = sub_parsers.add_parser('compile', help="compile source")
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
40 compile_parser.add_argument('source', type=argparse.FileType('r'),
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
41 help='the source file to build', nargs="+")
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
42 compile_parser.add_argument('-i', '--imp', type=argparse.FileType('r'),
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
43 help='Possible import module', action='append', default=[])
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
44 compile_parser.add_argument('--target', help="Backend selection",
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
45 choices=targetnames, required=True)
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
46 compile_parser.add_argument('-o', '--output', help='Output file',
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
47 metavar='filename')
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
48 compile_parser.add_argument('--report',
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
49 help='Specify a file to write the compile report to',
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
50 type=argparse.FileType('w'))
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
51 return parser
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
52
287
1c7c1e619be8 File movage
Windel Bouwman
parents: 281
diff changeset
53
331
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
54 class RecipeLoader:
334
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
55 """ Loads a recipe into a runner from a dictionary or file """
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
56 def __init__(self):
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
57 self.directive_handlers = {}
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
58 for a in dir(self):
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
59 if a.startswith('handle_'):
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
60 f = getattr(self, a)
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
61 self.directive_handlers[a[7:]] = f
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
62
331
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
63 def load_file(self, recipe_file, runner):
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
64 """ Loads a recipe dictionary into a task runner """
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
65 self.recipe_dir = os.path.abspath(os.path.dirname(recipe_file))
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
66 with open(recipe_file, 'r') as f:
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
67 recipe = yaml.load(f)
334
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
68 self.runner = runner
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
69 self.load_dict(recipe)
331
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
70
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
71 def relpath(self, filename):
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
72 return os.path.join(self.recipe_dir, filename)
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
73
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
74 def openfile(self, filename):
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
75 return open(self.relpath(filename), 'r')
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
76
334
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
77 def handle_compile(self, value):
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
78 sources = [self.openfile(s) for s in value['sources']]
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
79 includes = [self.openfile(i) for i in value['includes']]
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
80 target = targets[value['machine']]
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
81 output = ObjectFile()
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
82 task = Compile(sources, includes, target, output)
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
83 self.runner.add_task(task)
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
84 return task
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
85
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
86 def handle_assemble(self, value):
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
87 asm_src = self.openfile(value['source'])
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
88 target = targets[value['machine']]
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
89 output = ObjectFile()
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
90 task = Assemble(asm_src, target, output)
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
91 self.runner.add_task(task)
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
92 return task
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
93
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
94 def handle_link(self, value):
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
95 inputs = value['inputs']
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
96 objs = []
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
97 for i in inputs:
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
98 task = self.load_dict(i)
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
99 objs.append(task.output)
336
d1ecc493384e Added spiffy armtoken class for bit fiddeling. Added cool test that checks for build repeatability
Windel Bouwman
parents: 334
diff changeset
100 layout = value['layout']
d1ecc493384e Added spiffy armtoken class for bit fiddeling. Added cool test that checks for build repeatability
Windel Bouwman
parents: 334
diff changeset
101 output = self.relpath(value['output'])
d1ecc493384e Added spiffy armtoken class for bit fiddeling. Added cool test that checks for build repeatability
Windel Bouwman
parents: 334
diff changeset
102 self.runner.add_task(Link(objs, layout, output))
334
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
103
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
104 def handle_apps(self, value):
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
105 for a in value:
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
106 self.load_dict(a)
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
107
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
108 def load_dict(self, recipe):
331
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
109 for command, value in recipe.items():
334
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
110 return self.directive_handlers[command](value)
104
ed230e947dc6 Added hexviewer
windel
parents:
diff changeset
111
288
a747a45dcd78 Various styling work
Windel Bouwman
parents: 287
diff changeset
112
249
e41e4109addd Added current position arrow
Windel Bouwman
parents: 246
diff changeset
113 def main(args):
315
084cccaa5deb Added console and screen
Windel Bouwman
parents: 314
diff changeset
114 # Configure some logging:
084cccaa5deb Added console and screen
Windel Bouwman
parents: 314
diff changeset
115 logging.getLogger().setLevel(logging.DEBUG)
084cccaa5deb Added console and screen
Windel Bouwman
parents: 314
diff changeset
116 ch = logging.StreamHandler()
331
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
117 ch.setFormatter(logging.Formatter(ppci.logformat))
315
084cccaa5deb Added console and screen
Windel Bouwman
parents: 314
diff changeset
118 ch.setLevel(args.log)
084cccaa5deb Added console and screen
Windel Bouwman
parents: 314
diff changeset
119 logging.getLogger().addHandler(ch)
329
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents: 323
diff changeset
120
331
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
121 runner = TaskRunner()
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
122 if args.command == 'compile':
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
123 tg = targets[args.target]
334
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
124 output = ObjectFile()
6f4753202b9a Added more recipes
Windel Bouwman
parents: 332
diff changeset
125 runner.add_task(Compile(args.source, args.imp, tg, output))
331
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
126 elif args.command == 'recipe':
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
127 recipe_loader = RecipeLoader()
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
128 recipe_loader.load_file(args.recipe_file, runner)
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
129 else:
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
130 raise NotImplementedError('Invalid option')
105
6a303f835c6d Removed compilers directory
Windel Bouwman
parents: 104
diff changeset
131
332
87feb8a23b4d Added task list command
Windel Bouwman
parents: 331
diff changeset
132 if args.display_build_steps:
87feb8a23b4d Added task list command
Windel Bouwman
parents: 331
diff changeset
133 runner.display()
87feb8a23b4d Added task list command
Windel Bouwman
parents: 331
diff changeset
134 res = 0
87feb8a23b4d Added task list command
Windel Bouwman
parents: 331
diff changeset
135 else:
87feb8a23b4d Added task list command
Windel Bouwman
parents: 331
diff changeset
136 res = runner.run_tasks()
104
ed230e947dc6 Added hexviewer
windel
parents:
diff changeset
137
315
084cccaa5deb Added console and screen
Windel Bouwman
parents: 314
diff changeset
138 logging.getLogger().removeHandler(ch)
331
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
139 return res
246
f254b87258e6 Added hexfile to zcc
Windel Bouwman
parents: 239
diff changeset
140
288
a747a45dcd78 Various styling work
Windel Bouwman
parents: 287
diff changeset
141
207
8b2f20aae086 cleaning of files
Windel Bouwman
parents: 205
diff changeset
142 if __name__ == '__main__':
331
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
143 parser = make_parser()
213
003c8a976fff Merge of semantics and parser again ..
Windel Bouwman
parents: 207
diff changeset
144 arguments = parser.parse_args()
331
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
145 if not arguments.command:
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
146 parser.print_usage()
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
147 sys.exit(1)
276
Windel Bouwman
parents: 272
diff changeset
148 sys.exit(main(arguments))