Serenity Operating System
at master 70 lines 2.0 kB view raw
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)