diff options
Diffstat (limited to 'build/gen-file-list-pango.py')
-rw-r--r-- | build/gen-file-list-pango.py | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/build/gen-file-list-pango.py b/build/gen-file-list-pango.py new file mode 100644 index 00000000..fa438c0b --- /dev/null +++ b/build/gen-file-list-pango.py @@ -0,0 +1,161 @@ +#!/usr/bin/python +# vim: encoding=utf-8 +# Generate the file lists for processing with g-ir-scanner +import os +import sys +import re +import string +import subprocess +import optparse + +def gen_pango_filelist(srcroot, subdir, dest): + vars = read_vars_from_AM(os.path.join(srcroot, subdir, 'Makefile.am'), + vars = {}, + conds = {}, + filters = ['pango_introspection_files']) + + files = vars['pango_introspection_files'].split() + + sources = [i for i in files \ + if not (i.endswith('-private.h')) \ + and i != 'pango-color-table.h' ] + + with open(dest, 'w') as d: + for i in sources: + d.write(srcroot + '\\' + subdir + '\\' + i.replace('/', '\\') + '\n') + +def gen_pangoft_filelist(srcroot, subdir, dest): + vars = read_vars_from_AM(os.path.join(srcroot, subdir, 'Makefile.am'), + vars = {}, + conds = {}, + filters = ['pangoft2_introspection_files']) + + files = vars['pangoft2_introspection_files'].split() + + sources = [i for i in files \ + if not (i.endswith('-private.h'))] + + with open(dest, 'w') as d: + for i in sources: + d.write(srcroot + '\\' + subdir + '\\' + i.replace('/', '\\') + '\n') + +def gen_pangocairo_filelist(srcroot, subdir, dest, is_fc_used): + cond_pangocairo = {} + if is_fc_used == 1: + cond_pangocairo = {'HAVE_CAIRO_WIN32': True, 'PLATFORM_WIN32': True, 'HAVE_CAIRO_FREETYPE': True} + else: + cond_pangocairo = {'HAVE_CAIRO_WIN32': True, 'PLATFORM_WIN32': True} + vars = read_vars_from_AM(os.path.join(srcroot, subdir, 'Makefile.am'), + vars = {}, + conds = cond_pangocairo, + filters = ['libpangocairo_1_0_la_SOURCES', 'pangocairo_headers']) + + files = vars['libpangocairo_1_0_la_SOURCES'].split() + \ + vars['pangocairo_headers'].split() + + sources = [i for i in files \ + if not (i.endswith('-private.h'))] + + with open(dest, 'w') as d: + for i in sources: + d.write(srcroot + '\\' + subdir + '\\' + i.replace('/', '\\') + '\n') + +def read_vars_from_AM(path, vars = {}, conds = {}, filters = None): + ''' + path: path to the Makefile.am + vars: predefined variables + conds: condition variables for Makefile + filters: if None, all variables defined are returned, + otherwise, it is a list contains that variables should be returned + ''' + cur_vars = vars.copy() + RE_AM_VAR_REF = re.compile(r'\$\((\w+?)\)') + RE_AM_VAR = re.compile(r'^\s*(\w+)\s*=(.*)$') + RE_AM_INCLUDE = re.compile(r'^\s*include\s+(\w+)') + RE_AM_VAR_ADD = re.compile(r'^\s*(\w+)\s*\+=(.*)$') + RE_AM_CONTINUING = re.compile(r'\\\s*$') + RE_AM_IF = re.compile(r'^\s*if\s+(\w+)') + RE_AM_ELSE = re.compile(r'^\s*else') + RE_AM_ENDIF = re.compile(r'^\s*endif') + def am_eval(cont): + return RE_AM_VAR_REF.sub(lambda x: cur_vars.get(x.group(1), ''), cont) + with open(path, 'r') as f: + contents = f.readlines() + #combine continuing lines + i = 0 + ncont = [] + while i < len(contents): + line = contents[i] + if RE_AM_CONTINUING.search(line): + line = RE_AM_CONTINUING.sub('', line) + j = i + 1 + while j < len(contents) and RE_AM_CONTINUING.search(contents[j]): + line += RE_AM_CONTINUING.sub('', contents[j]) + j += 1 + else: + if j < len(contents): + line += contents[j] + i = j + else: + i += 1 + ncont.append(line) + + #include, var define, var evaluation + i = -1 + skip = False + oldskip = [] + while i < len(ncont) - 1: + i += 1 + line = ncont[i] + mo = RE_AM_IF.search(line) + if mo: + oldskip.append(skip) + skip = False if mo.group(1) in conds and conds[mo.group(1)] \ + else True + continue + mo = RE_AM_ELSE.search(line) + if mo: + skip = not skip + continue + mo = RE_AM_ENDIF.search(line) + if mo: + skip = oldskip.pop() + continue + if not skip: + mo = RE_AM_INCLUDE.search(line) + if mo: + cur_vars.update(read_vars_from_AM(am_eval(mo.group(1)), cur_vars, conds, None)) + continue + mo = RE_AM_VAR.search(line) + if mo: + cur_vars[mo.group(1)] = am_eval(mo.group(2).strip()) + continue + mo = RE_AM_VAR_ADD.search(line) + if mo: + try: + cur_vars[mo.group(1)] += ' ' + except KeyError: + cur_vars[mo.group(1)] = '' + cur_vars[mo.group(1)] += am_eval(mo.group(2).strip()) + continue + + #filter: + if filters != None: + ret = {} + for i in filters: + ret[i] = cur_vars.get(i, '') + return ret + else: + return cur_vars + +def main(argv): + srcroot = '..' + subdir = 'pango' + gen_pango_filelist(srcroot, subdir, 'pango_list') + gen_pangoft_filelist(srcroot, subdir, 'pangoft_list') + gen_pangocairo_filelist(srcroot, subdir, 'pangocairo_list', 0) + gen_pangocairo_filelist(srcroot, subdir, 'pangocairoft_list', 1) + return 0 + +if __name__ == '__main__': + sys.exit(main(sys.argv)) |