# 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()