summaryrefslogtreecommitdiff
path: root/tools/scan_includes.py
diff options
context:
space:
mode:
authorobskyr <powpowd@gmail.com>2018-06-18 20:27:04 +0200
committerGitHub <noreply@github.com>2018-06-18 20:27:04 +0200
commitf25d7c2299513b7ec77738a4625d4e70dcfbbb1c (patch)
tree170592cea1aad84758468538cf54e5a1a1504b51 /tools/scan_includes.py
parent3ac4eb121faaa3a0a390034d90ec446047ff623d (diff)
parent0f034bfbc14cc26914ee7bea24673dfbdd36cd42 (diff)
Merge pull request #24 from obskyr/includes-touchup
Touch up scan_includes.py for versatility
Diffstat (limited to 'tools/scan_includes.py')
-rw-r--r--tools/scan_includes.py36
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:])