72 lines
2.4 KiB
Python
72 lines
2.4 KiB
Python
|
#!/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')
|