diff options
Diffstat (limited to 'extras/scan_includes.py')
-rw-r--r-- | extras/scan_includes.py | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/extras/scan_includes.py b/extras/scan_includes.py new file mode 100644 index 0000000..8ce9a37 --- /dev/null +++ b/extras/scan_includes.py @@ -0,0 +1,65 @@ +#!/bin/python +# coding: utf-8 + +""" +Recursively scan an asm file for dependencies. +""" + +import os +import sys +import argparse + + +class IncludeReader: + """ + Usage: + includer = IncludeReader() + includer.read(filename) + or + includer = IncludeReader(filename='filename.asm') + includer.read() + """ + path = '' + includes = [] + directives = ['INCLUDE', 'INCBIN'] + extensions = ['.asm'] + + def __init__(self, **kwargs): + self.__dict__.update(kwargs) + + def read(self, filename=None): + """ + Recursively look for includes in <filename> and add them to self.includes. + """ + if filename is None: + if hasattr(self, 'filename'): + filename = os.path.join(self.path, self.filename) + else: + raise Exception, 'no filename given!' + if os.path.splitext(filename)[1] in self.extensions and os.path.exists(filename): + for line in open(filename).readlines(): + self.read_line(line) + + def read_line(self, line): + """ + Add any includes in <line> to self.includes, and look for includes in those. + """ + parts = line[:line.find(';')].split() + for directive in self.directives: + if directive in map(str.upper, parts): + include = os.path.join(self.path, "src/" + parts[parts.index(directive) + 1].split('"')[1]) + if include not in self.includes and include != "src/baserom.gbc": + self.includes.append(include) + self.read(include) + +if __name__ == '__main__': + ap = argparse.ArgumentParser() + ap.add_argument('-i', default='') + ap.add_argument('filenames', nargs='*') + args = ap.parse_args() + + includes = IncludeReader(path=args.i) + for filename in args.filenames: + includes.read(filename) + sys.stdout.write(' '.join(includes.includes)) + |