sysincls.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #!/usr/bin/env python3
  2. import pathlib
  3. import sys
  4. include_dir = pathlib.Path(sys.argv[1]) / "include"
  5. sysicncl_path = pathlib.Path(sys.argv[2])
  6. sysincl = open(sysicncl_path).read()
  7. GENERATED_BEG = "# GENERATED BY YM2\n"
  8. GENERATED_END = "# END OF GENERATION\n"
  9. assert sysincl.count("# GENERATED BY YM2") == 1
  10. assert sysincl.count("# END OF GENERATION") == 1
  11. headers = []
  12. ext_headers = []
  13. expr_headers = []
  14. for header in include_dir.glob("**/*"):
  15. if not header.is_file():
  16. continue
  17. rel_path = header.relative_to(include_dir)
  18. if header.parent == include_dir:
  19. if header.name.startswith("__") or not '.' in header.name:
  20. headers.append(str(rel_path))
  21. else:
  22. str_path = str(rel_path)
  23. if str_path.startswith('experimental'):
  24. expr_headers.append(str_path)
  25. elif str_path.startswith('ext'):
  26. ext_headers.append(str_path)
  27. else:
  28. headers.append(str_path)
  29. headers = sorted(headers, key = lambda header: (header.count('/') != 0, header.count('__') != 0, header))
  30. ext_headers = sorted(ext_headers)
  31. expr_headers = sorted(expr_headers)
  32. manual, generated = sysincl.split(GENERATED_BEG)
  33. generated, manual_end = generated.split(GENERATED_END)
  34. generated = []
  35. banned_generated = []
  36. for header in ext_headers + expr_headers:
  37. banned_generated.append(
  38. " - {name}:{spaces}DO_NOT_INCLUDE_NON_STANDARD_{banned_name}".format(
  39. name=str(header),
  40. spaces=' ' * max(1, 54 - len(header)),
  41. banned_name=header.replace('/', '_').replace('.', '_').upper(),
  42. )
  43. )
  44. if "experimental/propagate_const" == header:
  45. banned_generated[-1] = "#TODO: ban this header too\n#" + banned_generated[-1]
  46. for header in headers:
  47. generated.append(
  48. " - {name}:{spaces}contrib/libs/cxxsupp/libcxx/include/{name}".format(
  49. name=header,
  50. spaces=' ' * max(1, 54 - len(header))
  51. )
  52. )
  53. generated = """- source_filter: "^(?!(contrib/libs/cxxsupp/libcxx)).*"
  54. includes:
  55. """ \
  56. + '\n'.join(banned_generated) \
  57. + """
  58. # This includes all headers needed to resolve includes in c-headers from libcxx listed above
  59. - includes:
  60. """ \
  61. + '\n'.join(generated)
  62. with open(sysicncl_path, 'w') as f:
  63. f.write(f"{manual}{GENERATED_BEG}{generated}\n{GENERATED_END}{manual_end}")