diff options
Diffstat (limited to 'tools/scan_includes.py')
-rw-r--r-- | tools/scan_includes.py | 36 |
1 files changed, 23 insertions, 13 deletions
diff --git a/tools/scan_includes.py b/tools/scan_includes.py index e659dca..34e1f09 100644 --- a/tools/scan_includes.py +++ b/tools/scan_includes.py @@ -5,11 +5,12 @@ and output them using Make dependency syntax. """ -# Script from the Telefang disassembly / fan translation project. +# Script adapted from the Telefang disassembly / fan translation project. from __future__ import print_function from __future__ import unicode_literals +import argparse import os import re import sys @@ -18,19 +19,19 @@ if sys.version_info[0] < 3: INCLUDE_RE = re.compile(r"^(?:[a-zA-Z0-9_.]+:?:?)?\s*(INC(?:LUDE|BIN))", re.IGNORECASE) -def dependencies_in(asm_file_paths): +def dependencies_in(asm_file_paths, build_dirs=[]): asm_file_paths = list(asm_file_paths) dependencies = {} for path in asm_file_paths: if path not in dependencies: - asm_dependencies, bin_dependencies = shallow_dependencies_of(path) + asm_dependencies, bin_dependencies = shallow_dependencies_of(path, build_dirs) dependencies[path] = asm_dependencies | bin_dependencies asm_file_paths += asm_dependencies return dependencies -def shallow_dependencies_of(asm_file_path): +def shallow_dependencies_of(asm_file_path, build_dirs=[]): asm_dependencies = set() bin_dependencies = set() @@ -48,18 +49,27 @@ def shallow_dependencies_of(asm_file_path): if keyword == 'INCLUDE': asm_dependencies.add(path) else: - if not os.path.isfile(path): - path = 'build/' + path - bin_dependencies.add(path) + if os.path.isfile(path) or not build_dirs: + bin_dependencies.add(path) + else: + bin_dependencies.update(os.path.join(d, path) for d in build_dirs) return asm_dependencies, bin_dependencies -def main(): - if not len(sys.argv) > 1: - print("Usage: {} <paths to assembly files...>".format(os.path.basename(__file__))) - sys.exit(1) +def main(argv): + script_name = os.path.basename(__file__) + parser = argparse.ArgumentParser(prog=script_name, add_help=False) + parser.add_argument('-h', '--help', action='help', help="Show this help and exit.") + parser.add_argument('-b', metavar="build directories", action='append', default=[], + help="Build directory to generate dependencies for " + "if files don't exist at the exact path specified. " + "Multiple build directories may be specified.") + parser.add_argument('files', metavar='file', nargs='+', + help="An assembly file to generate dependencies for.") - for path, dependencies in dependencies_in(sys.argv[1:]).items(): + args = parser.parse_args(argv) + + for path, dependencies in dependencies_in(args.files, args.b).items(): # It seems that if A depends on B which depends on C, and # C is modified, Make needs you to change the modification # time of B too. That's the reason for the "@touch $@". @@ -69,4 +79,4 @@ def main(): print("{}: {}\n\t@touch $@".format(path, ' '.join(dependencies))) if __name__ == '__main__': - main() + main(sys.argv[1:]) |