summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorAndrei Pavel <andrei@isc.org>2024-03-04 13:30:02 +0100
committerAndrei Pavel <andrei@isc.org>2024-03-21 17:00:16 +0100
commit161843ab422fc8eba50694c1473adb041587e747 (patch)
treee3df15ae86a5fa52a554857e0a0203676ac64f86 /tools
parent[#3267] added ChangeLog entry (diff)
downloadkea-161843ab422fc8eba50694c1473adb041587e747.tar.xz
kea-161843ab422fc8eba50694c1473adb041587e747.zip
[#3267] add tools/find-uninstalled-headers.py
Diffstat (limited to 'tools')
-rwxr-xr-xtools/find-uninstalled-headers.py69
1 files changed, 69 insertions, 0 deletions
diff --git a/tools/find-uninstalled-headers.py b/tools/find-uninstalled-headers.py
new file mode 100755
index 0000000000..f09ea713f8
--- /dev/null
+++ b/tools/find-uninstalled-headers.py
@@ -0,0 +1,69 @@
+#!/usr/bin/env python3
+
+"""
+This script checks that all source headers are installed by inspecting Makefile.am files.
+
+Usage: ./find-uninstalled-headers.py
+"""
+
+import pathlib
+import re
+
+def main():
+ makefile_ams = sorted(pathlib.Path('./src/lib').glob('**/Makefile.am'))
+ headers = sorted(pathlib.Path('./src/lib').glob('**/*.h'))
+
+ headers_pattern = re.compile(r'_HEADERS [\+]{0,1}= (.*\.h|)(.*)')
+ backslash_pattern = re.compile(r'(.*\.h) \\$')
+
+ failure = False
+
+ for makefile_am in makefile_ams:
+ with open(makefile_am, 'r', encoding="utf8") as f:
+ lines = f.readlines()
+ in_headers_block = False
+ for line in lines:
+
+ if len(line) == 0:
+ in_headers_block = False
+
+ header = None
+
+ headers_matches = headers_pattern.search(line)
+ if headers_matches is None:
+ if not in_headers_block:
+ continue
+
+ backslash_matches = backslash_pattern.search(line)
+ if backslash_matches is None:
+ header = line
+ in_headers_block = False
+ else:
+ header = backslash_matches.group(1)
+ else:
+ in_headers_block = True
+ if '\\' in headers_matches.group(2) and len(headers_matches.group(1)) != 0:
+ header = headers_matches.group(1)
+
+ if header is not None:
+ relative_path = makefile_am.parent / header.strip()
+ if relative_path not in headers:
+ print(f'ERROR: Header {relative_path} not in Makefile.am')
+ failure = True
+ continue
+ headers.remove(relative_path)
+
+ first = True
+ for header in headers:
+ if not any(i in header.parts for i in ['tests', 'testutils', 'unittests']):
+ if first:
+ print('The following headers are not in the _HEADERS section of their respective Makefile.am file:')
+ first = False
+ print(f'- {header}')
+ failure = True
+
+ if failure:
+ exit(1)
+
+if __name__ == '__main__':
+ main()