#!/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)