#!/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)