aboutsummaryrefslogtreecommitdiff
path: root/test/symbols-leak-test.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/symbols-leak-test.py')
-rwxr-xr-xtest/symbols-leak-test.py62
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)