mirror of
https://github.com/radareorg/radare2.git
synced 2026-04-12 21:06:12 +02:00
107 lines
3.3 KiB
Python
Executable File
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()
|