| #!/usr/bin/env python3 | |
| """ | |
| Generate a Makefile .d fragment for the XML includes. | |
| """ | |
| import argparse | |
| import os | |
| import sys | |
| from io import StringIO | |
| import xml.etree.ElementTree as ET | |
| from lib.deps import add_dependency | |
| from lib.deps import write_deps | |
| parser = argparse.ArgumentParser() | |
| parser.add_argument( | |
| "inputfile", type=argparse.FileType('r'), help="Input XML file" | |
| ) | |
| parser.add_argument( | |
| "--file_per_line", | |
| action='store_true', | |
| help="Output dependencies file per line, rather than Make .d format." | |
| ) | |
| def read_dependencies(inputfile): | |
| inputpath = os.path.abspath(inputfile.name) | |
| inputdir = os.path.dirname(inputpath) | |
| try: | |
| tree = ET.parse(inputfile) | |
| except ET.ParseError: | |
| sys.stderr.write("XML parse error '{}'\n".format(inputfile)) | |
| raise | |
| for el in tree.iter(): | |
| if str(el.tag).endswith('XInclude}include'): | |
| yield os.path.abspath(os.path.join(inputdir, el.get('href'))) | |
| def main(argv): | |
| args = parser.parse_args(argv[1:]) | |
| if args.file_per_line: | |
| for dep in read_dependencies(args.inputfile): | |
| print(dep) | |
| else: | |
| data = StringIO() | |
| inputpath = os.path.abspath(args.inputfile.name) | |
| for includefile in read_dependencies(args.inputfile): | |
| add_dependency(data, inputpath, includefile) | |
| write_deps(args.inputfile.name, data) | |
| if __name__ == "__main__": | |
| sys.exit(main(sys.argv)) |