1#!/usr/bin/env python3
2"""Check that all exported symbols are specified in the symbol version scripts.
3
4If this fails, please update the appropriate .map file (adding new version
5nodes as needed).
6"""
7import os
8import pathlib
9import re
10import sys
11
12
13top_srcdir = pathlib.Path(os.environ['top_srcdir'])
14
15
16def symbols_from_map(path):
17    return re.findall(r'^\s+(xkb_.*);', path.read_text('utf-8'), re.MULTILINE)
18
19
20def symbols_from_src(path):
21    return re.findall(r'XKB_EXPORT.*\n(xkb_.*)\(', path.read_text('utf-8'))
22
23
24def diff(map_path, src_paths):
25    map_symbols = set(symbols_from_map(map_path))
26    src_symbols = set.union(set(), *(symbols_from_src(path) for path in src_paths))
27    return sorted(map_symbols - src_symbols), sorted(src_symbols - map_symbols)
28
29
30exit = 0
31
32# xkbcommon symbols
33left, right = diff(
34    top_srcdir/'xkbcommon.map',
35    [
36        *(top_srcdir/'src').glob('*.c'),
37        *(top_srcdir/'src'/'xkbcomp').glob('*.c'),
38        *(top_srcdir/'src'/'compose').glob('*.c'),
39    ],
40)
41if left:
42    print('xkbcommon map has extra symbols:', ' '.join(left))
43    exit = 1
44if right:
45    print('xkbcommon src has extra symbols:', ' '.join(right))
46    exit = 1
47
48# xkbcommon-x11 symbols
49left, right = diff(
50    top_srcdir/'xkbcommon-x11.map',
51    [
52        *(top_srcdir/'src'/'x11').glob('*.c'),
53    ],
54)
55if left:
56    print('xkbcommon-x11 map has extra symbols:', ' '.join(left))
57    exit = 1
58if right:
59    print('xkbcommon-x11 src has extra symbols:', ' '.join(right))
60    exit = 1
61
62sys.exit(exit)
63