diff options
author | Andrei Pavel <andrei@isc.org> | 2024-03-04 13:30:02 +0100 |
---|---|---|
committer | Andrei Pavel <andrei@isc.org> | 2024-03-21 17:00:16 +0100 |
commit | 161843ab422fc8eba50694c1473adb041587e747 (patch) | |
tree | e3df15ae86a5fa52a554857e0a0203676ac64f86 /tools | |
parent | [#3267] added ChangeLog entry (diff) | |
download | kea-161843ab422fc8eba50694c1473adb041587e747.tar.xz kea-161843ab422fc8eba50694c1473adb041587e747.zip |
[#3267] add tools/find-uninstalled-headers.py
Diffstat (limited to 'tools')
-rwxr-xr-x | tools/find-uninstalled-headers.py | 69 |
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() |