Files
radaree2/sys/check_includes.py
2025-11-24 16:47:09 +01:00

107 lines
3.3 KiB
Python
Executable File

#!/usr/bin/env python3
import glob
import os
import re
import sys
def extract_list(content, list_name):
pattern = rf'{list_name} (\+?=) \[(.*?)\]'
matches = re.findall(pattern, content, re.DOTALL)
files = []
for op, items in matches:
# Split by comma, but handle multiline
lines = items.split('\n')
for line in lines:
line = line.strip()
if line.startswith("'") and (line.endswith("',") or line.endswith("'")):
if line.endswith("',"):
files.append(line[1:-2])
else:
files.append(line[1:-1])
elif line.startswith('"') and (line.endswith('",') or line.endswith('"')):
if line.endswith('",'):
files.append(line[1:-2])
else:
files.append(line[1:-1])
elif line.startswith('join_paths('):
# Handle join_paths
# For simplicity, assume it's join_paths('include', 'sflib', arch, file) or similar
# But for common, it's join_paths('include/sflib/common/sftypes.h')
# Actually, for sflib_common_files, it's join_paths('include/sflib/common/sftypes.h')
# So, extract the string inside
inner = line[11:-1] # remove join_paths(
if inner.endswith(')'):
inner = inner[:-1]
# Assume it's a single string
if inner.startswith("'") and inner.endswith("'"):
files.append(inner[1:-1])
return files
def main():
meson_file = 'libr/meson.build'
if not os.path.exists(meson_file):
print(f"Error: {meson_file} not found")
sys.exit(1)
with open(meson_file, 'r') as f:
content = f.read()
lists = [
'include_files',
'r_util_files',
'r_muta_files',
'r_anal_files',
'r_esil_files',
]
all_files = []
for lst in lists:
all_files.extend(extract_list(content, lst))
# Get all actual header files
all_headers = glob.glob('libr/include/**/*.h', recursive=True)
actual = set()
for h in all_headers:
rel_path = h[len('libr/'):]
if not rel_path.startswith('include/sdb/') and not rel_path.startswith('include/sflib/') and rel_path not in ('include/r_userconf.h', 'include/r_version.h'):
actual.add(rel_path)
listed = set(all_files)
# Check for listed files that don't exist
nonexistent = []
for file in all_files:
path = f'libr/{file}'
if not os.path.exists(path):
nonexistent.append(file)
# Check for headers not listed
missing = actual - listed
# Check for extra listed headers
extras = listed - actual
if nonexistent:
print("Listed include files that do not exist:")
for m in sorted(nonexistent):
print(f" {m}")
sys.exit(1)
if missing:
print("Headers in libr/include not listed in meson.build:")
for m in sorted(missing):
print(f" {m}")
sys.exit(1)
if extras:
print("Extra headers listed in meson.build:")
for e in sorted(extras):
print(f" {e}")
sys.exit(1)
print("All include files are present and correctly listed.")
if __name__ == '__main__':
main()