Crow/amalgamate/merge_all.py

58 lines
1.4 KiB
Python
Raw Normal View History

2019-11-05 19:23:29 +00:00
#!/bin/env python
2015-07-30 14:59:54 +00:00
"""Merges all the header files."""
from glob import glob
from os import path as pt
2014-08-07 16:14:27 +00:00
import re
from collections import defaultdict
import sys
header_path = "../include"
if len(sys.argv) > 1:
header_path = sys.argv[1]
2014-08-07 16:14:27 +00:00
OUTPUT = 'crow_all.h'
re_depends = re.compile('^#include "(.*)"', re.MULTILINE)
2016-08-28 05:46:44 +00:00
headers = [x.rsplit('/', 1)[-1] for x in glob(pt.join(header_path, '*.h*'))]
2016-09-21 14:17:29 +00:00
headers += ['crow/' + x.rsplit('/', 1)[-1] for x in glob(pt.join(header_path, 'crow/*.h*'))]
2015-07-30 14:59:54 +00:00
print(headers)
2014-08-07 16:14:27 +00:00
edges = defaultdict(list)
for header in headers:
d = open(pt.join(header_path, header)).read()
2014-08-07 16:14:27 +00:00
match = re_depends.findall(d)
for m in match:
# m should included before header
edges[m].append(header)
visited = defaultdict(bool)
order = []
2015-07-30 14:59:54 +00:00
2014-08-07 16:14:27 +00:00
def dfs(x):
2015-07-30 14:59:54 +00:00
"""Ensure all header files are visited."""
2014-08-07 16:14:27 +00:00
visited[x] = True
for y in edges[x]:
if not visited[y]:
dfs(y)
order.append(x)
2015-07-30 14:59:54 +00:00
2014-08-07 16:14:27 +00:00
for header in headers:
if not visited[header]:
dfs(header)
order = order[::-1]
for x in edges:
2015-07-30 14:59:54 +00:00
print(x, edges[x])
2014-08-07 16:14:27 +00:00
for x in edges:
for y in edges[x]:
assert order.index(x) < order.index(y), 'cyclic include detected'
2015-07-30 14:59:54 +00:00
print(order)
2014-08-07 16:14:27 +00:00
build = []
for header in order:
d = open(pt.join(header_path, header)).read()
2015-07-30 14:59:54 +00:00
build.append(re_depends.sub(lambda x: '\n', d))
2014-08-07 16:14:27 +00:00
build.append('\n')
2015-07-30 14:59:54 +00:00
open(OUTPUT, 'w').write('\n'.join(build))