#!/usr/bin/env python3 import os import re import sys import argparse from collections import OrderedDict # cat fontconfig/fontconfig.h | grep '^Fc[^ ]* *(' | sed -e 's/ *(.*$//' def extract(fname): with open(fname, 'r', encoding='utf-8') as f: for l in f.readlines(): l = l.rstrip() m = re.match(r'^(Fc[^ ]*)[\s\w]*\(.*', l) if m and m.group(1) not in ['FcCacheDir', 'FcCacheSubdir']: yield m.group(1) if __name__=='__main__': parser = argparse.ArgumentParser() parser.add_argument('srcdir') parser.add_argument('head') parser.add_argument('tail') parser.add_argument('headers', nargs='+') args = parser.parse_args() definitions = {} for fname in os.listdir(args.srcdir): define_name, ext = os.path.splitext(fname) if ext != '.c': continue define_name = '__%s__' % os.path.basename(define_name) for definition in extract(os.path.join(args.srcdir, fname)): definitions[definition] = define_name declarations = OrderedDict() for fname in args.headers: for declaration in extract(fname): try: define_name = definitions[declaration] except KeyError: print ('error: could not locate %s in src/*.c' % declaration) sys.exit(1) declarations[declaration] = define_name with open(args.head, 'w') as head: with open(args.tail, 'w') as tail: tail.write('#if HAVE_GNUC_ATTRIBUTE\n') last = None for name, define_name in declarations.items(): alias = 'IA__%s' % name hattr = 'FC_ATTRIBUTE_VISIBILITY_HIDDEN' head.write('extern __typeof (%s) %s %s;\n' % (name, alias, hattr)) head.write('#define %s %s\n' % (name, alias)) if define_name != last: if last is not None: tail.write('#endif /* %s */\n' % last) tail.write('#ifdef %s\n' % define_name) last = define_name tail.write('# undef %s\n' % name) cattr = '__attribute((alias("%s"))) FC_ATTRIBUTE_VISIBILITY_EXPORT' % alias tail.write('extern __typeof (%s) %s %s;\n' % (name, name, cattr)) tail.write('#endif /* %s */\n' % last) tail.write('#endif /* HAVE_GNUC_ATTRIBUTE */\n')