aboutsummaryrefslogblamecommitdiffstats
path: root/amalgamate/merge_all.py
blob: 7935eadd4ca954af24a487ee4a9086fdb7d3d675 (plain) (tree)











































                                                                         
import glob
import re
from collections import defaultdict
OUTPUT = 'crow_all.h'
re_depends = re.compile('^#include "(.*)"', re.MULTILINE)
headers = [x.rsplit('/',1)[-1] for x in glob.glob('../include/*.h')]
print headers
edges = defaultdict(list)
for header in headers:
    d = open("../include/" + header).read().decode('utf8')
    match = re_depends.findall(d)
    for m in match:
        # m should included before header
        edges[m].append(header)

visited = defaultdict(bool)
order = []
def dfs(x):
    visited[x] = True
    for y in edges[x]:
        if not visited[y]:
            dfs(y)
    order.append(x)
            
for header in headers:
    if not visited[header]:
        dfs(header)

order = order[::-1]
for x in edges:
    print x, edges[x]
for x in edges:
    for y in edges[x]:
        assert order.index(x) < order.index(y), 'cyclic include detected'

print order
build = []
for header in order:
    d = open("../include/" + header).read().decode('utf8')
    build.append(re_depends.sub(lambda x:'\n', d))
    build.append('\n')

open(OUTPUT,'w').write('\n'.join(build))