2019-11-05 19:58:50 +00:00
|
|
|
#!/usr/bin/env python
|
2019-11-05 19:23:29 +00:00
|
|
|
|
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
|
2014-09-27 11:03:51 +00:00
|
|
|
import sys
|
|
|
|
|
2019-11-05 19:35:16 +00:00
|
|
|
if len(sys.argv) != 3:
|
|
|
|
print("Usage: {} <CROW_HEADERS_DIRECTORY_PATH> <CROW_OUTPUT_HEADER_PATH>".format(sys.argv[0]))
|
|
|
|
sys.exit(1)
|
|
|
|
|
|
|
|
header_path = sys.argv[1]
|
|
|
|
output_path = sys.argv[2]
|
2014-09-27 11:03:51 +00:00
|
|
|
|
2014-08-07 16:14:27 +00:00
|
|
|
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:
|
2015-07-30 15:05:57 +00:00
|
|
|
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:
|
2015-07-30 15:05:57 +00:00
|
|
|
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')
|
|
|
|
|
2019-11-05 19:35:16 +00:00
|
|
|
open(output_path, 'w').write('\n'.join(build))
|