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