# build autodefs.h and import re autogen = "Automatically generated by config.py" def parse_version_m4(kv, version_m4): r = re.compile(r'^define\((\w+),\[(.*)\]\)$') f = open(version_m4) for line in f: line = line.rstrip() m = re.match(r, line) if m: g = m.groups() kv[g[0]] = g[1] f.close() def parse_settings_in(kv, settings_in): r = re.compile(r'^!define\s+(\w+)(?:\s+"?(.*?)"?)$') f = open(settings_in) for line in f: line = line.rstrip() m = re.match(r, line) if m: g = m.groups() kv[g[0]] = g[1] or '' f.close() def build_autodefs(kv, autodefs_in, autodefs_out): def repfn(m): var, = m.groups() return kv.get(var, '') r = re.compile(r'@(\w+)@') fin = open(autodefs_in) fout = open(autodefs_out, 'w') fout.write("/* %s */\n\n" % autogen) for line in fin: newline = re.sub(r, repfn, line) fout.write(newline) fin.close() fout.close() def print_key_values(kv): for k, v in sorted(kv.items()): print "%s%s%s" % (k, ' '*(32-len(k)), repr(v)) def get_sources(makefile_am): c = set() h = set() f = open(makefile_am) state = False for line in f: line = line.rstrip() if line == 'openvpn_SOURCES = \\': state = True elif not line: state = False elif state: for sf in line.split(): if sf.endswith('.c'): c.add(sf[:-2]) elif sf.endswith('.h'): h.add(sf[:-2]) elif sf == '\\': pass else: print >>sys.stderr, "Unrecognized filename:", sf f.close() return [ sorted(list(s)) for s in (c, h) ] def output_mak_list(out, title, srclist, ext): out.write("%s =" % (title,)) for x in srclist: out.write(" \\\n\t%s.%s" % (x, ext)) out.write('\n\n') def output_mak(makefile_am, outfile): c, h = get_sources(makefile_am) out = open(outfile, 'w') out.write("# %s\n\n" % autogen) output_mak_list(out, 'HEADERS', h, 'h') output_mak_list(out, 'OBJS', c, 'obj') out.close() def main(): kv = {} parse_version_m4(kv, 'version.m4') parse_settings_in(kv, 'install-win32/settings.in') build_autodefs(kv, 'msvc/autodefs.h.in', 'autodefs.h') output_mak('Makefile.am', 'head_obj.mak') main()