diff options
Diffstat (limited to 'test/symbols-leak-test.py')
-rwxr-xr-x | test/symbols-leak-test.py | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/test/symbols-leak-test.py b/test/symbols-leak-test.py new file mode 100755 index 0000000..a395079 --- /dev/null +++ b/test/symbols-leak-test.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python3 +"""Check that all exported symbols are specified in the symbol version scripts. + +If this fails, please update the appropriate .map file (adding new version +nodes as needed). +""" +import os +import pathlib +import re +import sys + + +top_srcdir = pathlib.Path(os.environ['top_srcdir']) + + +def symbols_from_map(path): + return re.findall(r'^\s+(xkb_.*);', path.read_text('utf-8'), re.MULTILINE) + + +def symbols_from_src(path): + return re.findall(r'XKB_EXPORT.*\n(xkb_.*)\(', path.read_text('utf-8')) + + +def diff(map_path, src_paths): + map_symbols = set(symbols_from_map(map_path)) + src_symbols = set.union(set(), *(symbols_from_src(path) for path in src_paths)) + return sorted(map_symbols - src_symbols), sorted(src_symbols - map_symbols) + + +exit = 0 + +# xkbcommon symbols +left, right = diff( + top_srcdir/'xkbcommon.map', + [ + *(top_srcdir/'src').glob('*.c'), + *(top_srcdir/'src'/'xkbcomp').glob('*.c'), + *(top_srcdir/'src'/'compose').glob('*.c'), + ], +) +if left: + print('xkbcommon map has extra symbols:', ' '.join(left)) + exit = 1 +if right: + print('xkbcommon src has extra symbols:', ' '.join(right)) + exit = 1 + +# xkbcommon-x11 symbols +left, right = diff( + top_srcdir/'xkbcommon-x11.map', + [ + *(top_srcdir/'src'/'x11').glob('*.c'), + ], +) +if left: + print('xkbcommon-x11 map has extra symbols:', ' '.join(left)) + exit = 1 +if right: + print('xkbcommon-x11 src has extra symbols:', ' '.join(right)) + exit = 1 + +sys.exit(exit) |