merge_all.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. """Merges all the header files."""
  2. from glob import glob
  3. from os import path as pt
  4. import re
  5. from collections import defaultdict
  6. import sys
  7. header_path = "../include"
  8. if len(sys.argv) > 1:
  9. header_path = sys.argv[1]
  10. OUTPUT = 'crow_all.h'
  11. re_depends = re.compile('^#include "(.*)"', re.MULTILINE)
  12. headers = [x.rsplit('/', 1)[-1] for x in glob(pt.join(header_path, '*.h*'))]
  13. headers += ['crow/' + x.rsplit('/', 1)[-1] for x in glob(pt.join(header_path, 'crow/*.h*'))]
  14. print(headers)
  15. edges = defaultdict(list)
  16. for header in headers:
  17. d = open(pt.join(header_path, header)).read()
  18. match = re_depends.findall(d)
  19. for m in match:
  20. # m should included before header
  21. edges[m].append(header)
  22. visited = defaultdict(bool)
  23. order = []
  24. def dfs(x):
  25. """Ensure all header files are visited."""
  26. visited[x] = True
  27. for y in edges[x]:
  28. if not visited[y]:
  29. dfs(y)
  30. order.append(x)
  31. for header in headers:
  32. if not visited[header]:
  33. dfs(header)
  34. order = order[::-1]
  35. for x in edges:
  36. print(x, edges[x])
  37. for x in edges:
  38. for y in edges[x]:
  39. assert order.index(x) < order.index(y), 'cyclic include detected'
  40. print(order)
  41. build = []
  42. for header in order:
  43. d = open(pt.join(header_path, header)).read()
  44. build.append(re_depends.sub(lambda x: '\n', d))
  45. build.append('\n')
  46. open(OUTPUT, 'w').write('\n'.join(build))