generate_all.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #!/usr/bin/env python3
  2. import os
  3. import sys
  4. import subprocess
  5. TEST_FILE_TEMPLATE = '''\
  6. #include <{filename}>
  7. // Check idempotency:
  8. #include <{filename}>
  9. '''
  10. def get_headers_here():
  11. result = subprocess.run(['git', 'ls-files', 'Userland/Libraries/*.h'], check=True, capture_output=True, text=True)
  12. assert result.stderr == ''
  13. output = result.stdout.split('\n')
  14. assert output[-1] == '' # Trailing newline
  15. assert len(output) > 500, 'There should be well over a thousand headers, not only {}?!'.format(len(output))
  16. return output[:-1]
  17. def as_filename(header_path):
  18. return header_path.replace('/', '__') + '__test.cpp'
  19. def verbosely_write(path, new_content):
  20. print(path)
  21. # FIXME: Ensure directory exists
  22. if os.path.exists(path):
  23. with open(path, 'r') as fp:
  24. old_data = fp.read()
  25. if old_data == new_content:
  26. # Fast path! Don't trigger ninja
  27. return
  28. with open(path, 'w') as fp:
  29. fp.write(new_content)
  30. def generate_part(header):
  31. content = TEST_FILE_TEMPLATE.format(filename=header)
  32. if header.startswith('Kernel/'):
  33. content += '#define KERNEL\n'
  34. verbosely_write(as_filename(header), content)
  35. def run(root_path, arch):
  36. os.chdir(root_path)
  37. headers_list = get_headers_here()
  38. generated_files_path = os.path.join(root_path, 'Build', arch, 'Meta', 'HeaderCheck')
  39. if not os.path.exists(generated_files_path):
  40. os.mkdir(generated_files_path)
  41. os.chdir(generated_files_path)
  42. for header in headers_list:
  43. generate_part(header)
  44. if __name__ == '__main__':
  45. if 'SERENITY_SOURCE_DIR' not in os.environ:
  46. print('Must set SERENITY_SOURCE_DIR first!', file=sys.stderr)
  47. exit(1)
  48. if len(sys.argv) == 2:
  49. run(os.environ['SERENITY_SOURCE_DIR'], sys.argv[1])
  50. else:
  51. print('Usage: SERENITY_SOURCE_DIR=/path/to/serenity {} SERENITY_BUILD_ARCH'
  52. .format(sys.argv[0]), file=sys.stderr)
  53. exit(1)