annotate python/zcc.py @ 332:87feb8a23b4d

Added task list command
author Windel Bouwman
date Fri, 07 Feb 2014 12:51:55 +0100
parents a78b41ff6ad2
children 6f4753202b9a
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
329
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents: 323
diff changeset
9 from ppci.buildtasks import Compile
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
205
d77cb5962cc5 Added some handcoded arm code generation
Windel Bouwman
parents: 204
diff changeset
12 import outstream
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])',
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
32 type=logLevel, default='WARN')
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:
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
55 def load_file(self, recipe_file, runner):
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
56 """ Loads a recipe dictionary into a task runner """
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
57 self.recipe_dir = os.path.abspath(os.path.dirname(recipe_file))
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
58 with open(recipe_file, 'r') as f:
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
59 recipe = yaml.load(f)
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
60 self.load_dict(recipe, runner)
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
61
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
62 def relpath(self, filename):
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
63 return os.path.join(self.recipe_dir, filename)
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
64
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
65 def openfile(self, filename):
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
66 return open(self.relpath(filename), 'r')
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
67
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
68 def load_dict(self, recipe, runner):
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
69 for command, value in recipe.items():
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
70 if command == 'compile':
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
71 sources = [self.openfile(s) for s in value['sources']]
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
72 includes = [self.openfile(i) for i in value['includes']]
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
73 target = targets[value['machine']]
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
74 output = outstream.TextOutputStream()
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
75 runner.add_task(Compile(sources, includes, target, output))
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
76 elif command == 'link':
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
77 self.load_dict(value['inputs'], runner)
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
78 #runner.add_task(Link())
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
79 elif command == 'assemble':
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
80 pass
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
81 elif command == 'apps':
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
82 for a in value:
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
83 self.load_dict(a, runner)
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
84 else:
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
85 raise NotImplementedError(command)
104
ed230e947dc6 Added hexviewer
windel
parents:
diff changeset
86
288
a747a45dcd78 Various styling work
Windel Bouwman
parents: 287
diff changeset
87
249
e41e4109addd Added current position arrow
Windel Bouwman
parents: 246
diff changeset
88 def main(args):
315
084cccaa5deb Added console and screen
Windel Bouwman
parents: 314
diff changeset
89 # Configure some logging:
084cccaa5deb Added console and screen
Windel Bouwman
parents: 314
diff changeset
90 logging.getLogger().setLevel(logging.DEBUG)
084cccaa5deb Added console and screen
Windel Bouwman
parents: 314
diff changeset
91 ch = logging.StreamHandler()
331
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
92 ch.setFormatter(logging.Formatter(ppci.logformat))
315
084cccaa5deb Added console and screen
Windel Bouwman
parents: 314
diff changeset
93 ch.setLevel(args.log)
084cccaa5deb Added console and screen
Windel Bouwman
parents: 314
diff changeset
94 logging.getLogger().addHandler(ch)
329
8f6f3ace4e78 Added build tasks
Windel Bouwman
parents: 323
diff changeset
95
331
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
96 runner = TaskRunner()
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
97 if args.command == 'compile':
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
98 tg = targets[args.target]
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
99 outs = outstream.TextOutputStream()
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
100 runner.add_task(Compile(args.source, args.imp, tg, outs))
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
101 elif args.command == 'recipe':
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
102 recipe_loader = RecipeLoader()
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
103 recipe_loader.load_file(args.recipe_file, runner)
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
104 else:
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
105 raise NotImplementedError('Invalid option')
105
6a303f835c6d Removed compilers directory
Windel Bouwman
parents: 104
diff changeset
106
332
87feb8a23b4d Added task list command
Windel Bouwman
parents: 331
diff changeset
107 if args.display_build_steps:
87feb8a23b4d Added task list command
Windel Bouwman
parents: 331
diff changeset
108 runner.display()
87feb8a23b4d Added task list command
Windel Bouwman
parents: 331
diff changeset
109 res = 0
87feb8a23b4d Added task list command
Windel Bouwman
parents: 331
diff changeset
110 else:
87feb8a23b4d Added task list command
Windel Bouwman
parents: 331
diff changeset
111 res = runner.run_tasks()
104
ed230e947dc6 Added hexviewer
windel
parents:
diff changeset
112
315
084cccaa5deb Added console and screen
Windel Bouwman
parents: 314
diff changeset
113 logging.getLogger().removeHandler(ch)
331
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
114 return res
246
f254b87258e6 Added hexfile to zcc
Windel Bouwman
parents: 239
diff changeset
115
288
a747a45dcd78 Various styling work
Windel Bouwman
parents: 287
diff changeset
116
207
8b2f20aae086 cleaning of files
Windel Bouwman
parents: 205
diff changeset
117 if __name__ == '__main__':
331
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
118 parser = make_parser()
213
003c8a976fff Merge of semantics and parser again ..
Windel Bouwman
parents: 207
diff changeset
119 arguments = parser.parse_args()
331
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
120 if not arguments.command:
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
121 parser.print_usage()
a78b41ff6ad2 Added better recipe files
Windel Bouwman
parents: 329
diff changeset
122 sys.exit(1)
276
Windel Bouwman
parents: 272
diff changeset
123 sys.exit(main(arguments))