Mercurial > lcfOS
comparison 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 |
comparison
equal
deleted
inserted
replaced
376:1e951e71d3f1 | 377:9667d78ba79e |
---|---|
3 import sys | 3 import sys |
4 import os | 4 import os |
5 import argparse | 5 import argparse |
6 import logging | 6 import logging |
7 | 7 |
8 from ppci.buildtasks import Compile, Assemble, Link | |
9 from ppci.tasks import TaskRunner | 8 from ppci.tasks import TaskRunner |
9 import ppci.buildtasks | |
10 from ppci.report import RstFormatter | 10 from ppci.report import RstFormatter |
11 from ppci.objectfile import ObjectFile | 11 from ppci.objectfile import ObjectFile |
12 from ppci.target.target_list import targets, targetnames | 12 from ppci.target.target_list import targets, targetnames |
13 from ppci.recipe import RecipeLoader | 13 from ppci.recipe import RecipeLoader |
14 import ppci | 14 import ppci |
25 def make_parser(): | 25 def make_parser(): |
26 parser = argparse.ArgumentParser(description='lcfos Compiler') | 26 parser = argparse.ArgumentParser(description='lcfos Compiler') |
27 | 27 |
28 parser.add_argument('--log', help='Log level (INFO,DEBUG,[WARN])', | 28 parser.add_argument('--log', help='Log level (INFO,DEBUG,[WARN])', |
29 type=logLevel, default='INFO') | 29 type=logLevel, default='INFO') |
30 parser.add_argument('--display-build-steps', action='store_true') | |
31 parser.add_argument('--report', | 30 parser.add_argument('--report', |
32 help='Specify a file to write the compile report to', | 31 help='Specify a file to write the compile report to', |
33 type=argparse.FileType('w')) | 32 type=argparse.FileType('w')) |
34 sub_parsers = parser.add_subparsers(title='commands', | 33 parser.add_argument('--buildfile', |
35 description='possible commands', dest='command') | 34 help='use buildfile, otherwise build.xml is the default', |
36 recipe_parser = sub_parsers.add_parser('recipe', help="Bake recipe") | 35 default='build.xml') |
37 recipe_parser.add_argument('recipe_file', help='recipe file') | |
38 | 36 |
39 compile_parser = sub_parsers.add_parser('compile', help="compile source") | 37 parser.add_argument('targets', metavar='target', nargs='*') |
40 compile_parser.add_argument('source', type=argparse.FileType('r'), | |
41 help='the source file to build', nargs="+") | |
42 compile_parser.add_argument('-i', '--imp', type=argparse.FileType('r'), | |
43 help='Possible import module', action='append', default=[]) | |
44 compile_parser.add_argument('--target', help="Backend selection", | |
45 choices=targetnames, required=True) | |
46 compile_parser.add_argument('-o', '--output', help='Output file', | |
47 metavar='filename') | |
48 return parser | 38 return parser |
49 | 39 |
50 | 40 |
51 def main(args): | 41 def main(args): |
52 # Configure some logging: | 42 # Configure some logging: |
59 if args.report: | 49 if args.report: |
60 fh = logging.StreamHandler(args.report) | 50 fh = logging.StreamHandler(args.report) |
61 fh.setFormatter(RstFormatter()) | 51 fh.setFormatter(RstFormatter()) |
62 logging.getLogger().addHandler(fh) | 52 logging.getLogger().addHandler(fh) |
63 | 53 |
54 recipe_loader = RecipeLoader() | |
55 try: | |
56 project = recipe_loader.load_file(args.buildfile) | |
57 except OSError as e: | |
58 res = 1 | |
59 | |
64 runner = TaskRunner() | 60 runner = TaskRunner() |
65 if args.command == 'compile': | 61 res = runner.run(project, args.targets) |
66 tg = targets[args.target] | |
67 output = ObjectFile() | |
68 runner.add_task(Compile(args.source, args.imp, tg, output)) | |
69 elif args.command == 'recipe': | |
70 recipe_loader = RecipeLoader(runner) | |
71 recipe_loader.load_file(args.recipe_file) | |
72 else: | |
73 raise NotImplementedError('Invalid option') | |
74 | |
75 if args.display_build_steps: | |
76 runner.display() | |
77 res = 0 | |
78 else: | |
79 res = runner.run_tasks() | |
80 | 62 |
81 if args.report: | 63 if args.report: |
82 logging.getLogger().removeHandler(fh) | 64 logging.getLogger().removeHandler(fh) |
83 args.report.close() | 65 args.report.close() |
84 | 66 |
87 | 69 |
88 | 70 |
89 if __name__ == '__main__': | 71 if __name__ == '__main__': |
90 parser = make_parser() | 72 parser = make_parser() |
91 arguments = parser.parse_args() | 73 arguments = parser.parse_args() |
92 if not arguments.command: | |
93 parser.print_usage() | |
94 sys.exit(1) | |
95 sys.exit(main(arguments)) | 74 sys.exit(main(arguments)) |