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))