mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-21 23:20:20 +00:00
HeaderCheck: It checks some of your headers
This commit is contained in:
parent
dee26ca5cd
commit
8de696bdd0
Notes:
sideshowbarker
2024-07-18 02:09:10 +09:00
Author: https://github.com/BenWiederhake Commit: https://github.com/SerenityOS/serenity/commit/8de696bdd04 Pull-request: https://github.com/SerenityOS/serenity/pull/10321 Reviewed-by: https://github.com/alimpfard Reviewed-by: https://github.com/linusg ✅
5 changed files with 79 additions and 0 deletions
|
@ -250,6 +250,9 @@ if(NOT "${SERENITY_ARCH}" STREQUAL "aarch64")
|
|||
add_subdirectory(Userland)
|
||||
add_subdirectory(Tests)
|
||||
endif()
|
||||
if (ENABLE_COMPILETIME_HEADER_CHECK)
|
||||
add_subdirectory(Meta/HeaderCheck)
|
||||
endif()
|
||||
|
||||
export_components("${CMAKE_BINARY_DIR}/components.ini")
|
||||
|
||||
|
|
|
@ -7,6 +7,7 @@ serenity_option(ENABLE_UNDEFINED_SANITIZER OFF CACHE BOOL "Enable undefined beha
|
|||
|
||||
serenity_option(ENABLE_ALL_THE_DEBUG_MACROS OFF CACHE BOOL "Enable all debug macros to validate they still compile")
|
||||
serenity_option(ENABLE_ALL_DEBUG_FACILITIES OFF CACHE BOOL "Enable all noisy debug symbols and options. Not recommended for normal developer use")
|
||||
serenity_option(ENABLE_COMPILETIME_HEADER_CHECK OFF CACHE BOOL "Enable compiletime check that each library header compiles stand-alone")
|
||||
|
||||
serenity_option(ENABLE_UNICODE_DATABASE_DOWNLOAD ON CACHE BOOL "Enable download of Unicode UCD and CLDR files at build time")
|
||||
serenity_option(INCLUDE_WASM_SPEC_TESTS OFF CACHE BOOL "Download and include the WebAssembly spec testsuite")
|
||||
|
|
1
Meta/HeaderCheck/.gitignore
vendored
Normal file
1
Meta/HeaderCheck/.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
CMakeLists.txt
|
4
Meta/HeaderCheck/CMakeLists.txt
Normal file
4
Meta/HeaderCheck/CMakeLists.txt
Normal file
|
@ -0,0 +1,4 @@
|
|||
execute_process(COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/generate_all.py" "${SERENITY_ARCH}" OUTPUT_VARIABLE SOURCES_STRING)
|
||||
string(REPLACE "\n" ";" SOURCES_LIST ${SOURCES_STRING})
|
||||
|
||||
add_library(HeaderCheck OBJECT ${SOURCES_LIST})
|
70
Meta/HeaderCheck/generate_all.py
Executable file
70
Meta/HeaderCheck/generate_all.py
Executable file
|
@ -0,0 +1,70 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import sys
|
||||
import subprocess
|
||||
|
||||
TEST_FILE_TEMPLATE = '''\
|
||||
#include <{filename}>
|
||||
// Check idempotency:
|
||||
#include <{filename}>
|
||||
'''
|
||||
|
||||
|
||||
def get_headers_here():
|
||||
result = subprocess.run(['git', 'ls-files', 'Userland/Libraries/*.h'], check=True, capture_output=True, text=True)
|
||||
assert result.stderr == ''
|
||||
output = result.stdout.split('\n')
|
||||
assert output[-1] == '' # Trailing newline
|
||||
assert len(output) > 500, 'There should be well over a thousand headers, not only {}?!'.format(len(output))
|
||||
return output[:-1]
|
||||
|
||||
|
||||
def as_filename(header_path):
|
||||
return header_path.replace('/', '__') + '__test.cpp'
|
||||
|
||||
|
||||
def verbosely_write(path, new_content):
|
||||
print(path)
|
||||
# FIXME: Ensure directory exists
|
||||
if os.path.exists(path):
|
||||
with open(path, 'r') as fp:
|
||||
old_data = fp.read()
|
||||
if old_data == new_content:
|
||||
# Fast path! Don't trigger ninja
|
||||
return
|
||||
with open(path, 'w') as fp:
|
||||
fp.write(new_content)
|
||||
|
||||
|
||||
def generate_part(header):
|
||||
content = TEST_FILE_TEMPLATE.format(filename=header)
|
||||
if header.startswith('Kernel/'):
|
||||
content += '#define KERNEL\n'
|
||||
verbosely_write(as_filename(header), content)
|
||||
|
||||
|
||||
def run(root_path, arch):
|
||||
os.chdir(root_path)
|
||||
headers_list = get_headers_here()
|
||||
|
||||
generated_files_path = os.path.join(root_path, 'Build', arch, 'Meta', 'HeaderCheck')
|
||||
if not os.path.exists(generated_files_path):
|
||||
os.mkdir(generated_files_path)
|
||||
os.chdir(generated_files_path)
|
||||
for header in headers_list:
|
||||
generate_part(header)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
if 'SERENITY_SOURCE_DIR' not in os.environ:
|
||||
print('Must set SERENITY_SOURCE_DIR first!', file=sys.stderr)
|
||||
exit(1)
|
||||
if len(sys.argv) == 2:
|
||||
with open('/tmp/the_arg', 'w') as fp:
|
||||
fp.write(sys.argv[1])
|
||||
run(os.environ['SERENITY_SOURCE_DIR'], sys.argv[1])
|
||||
else:
|
||||
print('Usage: SERENITY_SOURCE_DIR=/path/to/serenity {} SERENITY_BUILD_ARCH'
|
||||
.format(sys.argv[0]), file=sys.stderr)
|
||||
exit(1)
|
Loading…
Reference in a new issue