From c825bb054b38d0cc78f878d115189ff32a4773a2 Mon Sep 17 00:00:00 2001 From: Chun-wei Fan Date: Fri, 10 Jan 2014 16:58:38 +0800 Subject: MSVC Builds: Rework Introspection Build The current approach of building the introspection files for Pango works, but is often cumbersome as one needs to set many environmental variables before launching a solution file, which runs a Windows batch script to generate the .gir/.typelib files. It was also possible to hand-run the batch script from the Visual Studio command prompt, but even more environmental variables need to be set. This changes the approach to build the introspection files using an NMake Makefile (but elimating from the Visual Studio Project Files the part to build the introspection files) to: -Make it clearer to the person building the introspection files what environmental variables are needed, specifically for PKG_CONFIG_PATH and MINGWDIR and CFG (formerly CONF). Setting stuff like VSVER, PLAT and BASEDIR is no longer required, which was a bit clunky. -Allows some more easier flexibility on the build of the intropsection files. --- build/gen-file-list-pango.py | 161 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 161 insertions(+) create mode 100644 build/gen-file-list-pango.py (limited to 'build/gen-file-list-pango.py') 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)) -- cgit v1.2.1