1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
|
#!/usr/bin/python3
import argparse
from pathlib import Path
import re
parser = argparse.ArgumentParser()
parser.add_argument("output", type=Path)
parser.add_argument("input", nargs="+", type=Path)
args = parser.parse_args()
prefix = args.input[0].absolute()
while prefix.name != "boost":
assert prefix.parent != prefix
prefix = prefix.parent
prefix = prefix.parent
skip = len(str(prefix)) + 1
def flatten(input, output, done):
header = str(input)[skip:]
if header in done:
return
done.add(header)
with input.open() as ifh:
for line in ifh:
if input.name != "openmethod.hpp" and re.match(
r"#include <(boost/openmethod/core\.hpp+)>", line
):
continue
if m := re.match(r"#include <(boost/openmethod/[^>]+)>", line):
include = m[1]
print(file=output)
flatten(prefix / include, output, done)
print(file=output)
continue
output.write(line)
with args.output.open("w") as ofh:
done = set()
for input in args.input:
flatten(input.absolute(), ofh, done)
|