| #!/usr/bin/env python3 |
| |
| # A small wrapper around xmllint and xsltproc that collects dependency |
| # information (in gcc's format) using --load-trace. |
| |
| import argparse |
| import re |
| import subprocess |
| import sys |
| |
| parser = argparse.ArgumentParser( |
| description='generate dependency file for docs') |
| |
| parser.add_argument('--targetname', type=str, required=False, nargs='+') |
| parser.add_argument('--depfile', type=str, required=False) |
| parser.add_argument('--tool', type=str, required=True) |
| parser.add_argument('flags', nargs='*') |
| |
| args = parser.parse_args() |
| |
| if args.depfile: |
| command = [args.tool, '--load-trace'] + args.flags |
| |
| # list of targets that depend on the loaded files we see via --load-trace |
| line_start = ' '.join(args.targetname) + ': ' |
| |
| # --load-trace flag displays all the documents loaded during the processing |
| # to stderr |
| res = subprocess.run(command, stderr=subprocess.PIPE, |
| universal_newlines=True) |
| |
| line_re = re.compile('^Loaded URL="([^"]+)"') |
| with open(args.depfile, 'w') as f: |
| for line in res.stderr.splitlines(): |
| m = re.match(line_re, line) |
| |
| # continue to show errors |
| if m is None: |
| print(line, file=sys.stderr) |
| continue |
| # Absolute paths are printed as file://, relative paths as-is. We |
| # don't care about http://, as a) those will be printed even if |
| # resolved locally b) we couldn't have a dependency anyway. |
| fname = m.group(1) |
| if fname.startswith('http://'): |
| continue |
| if fname.startswith('file://'): |
| fname = fname.split('file://')[1] |
| f.write(line_start + fname + '\n') |
| else: |
| command = [args.tool] + args.flags |
| res = subprocess.run(command) |
| |
| exit(res.returncode) |