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