Files
openmethod/dev/flatten.py
2025-06-14 13:15:21 -04:00

48 lines
1.1 KiB
Python

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