#!/usr/bin/python # A script to customize the generic-build-script based on a set of rules # Rules are expressed by a simple configuration file # Last updated for revision 1.32 # # Syntax: gbsmunge.py -F configfile [file-to-filter] import sys, os, fileinput, getopt class Context: I_DEFAULT, = range(1) info = { "ConfigureArg": ([], ), "SubPackage": ({}, ), "TestMakeRule": ("check", ), "PrepCmd": ([], ), "MakeTarget": ([], ), "MakeInstallTarget": ([], ), "InstallExtraCmd": ([], ), "PreConfigureCmd": ([], ), "AutoreconfCmd": ([], ), "UnpackExclude": ([], ), "DiffExclude": (['*.orig', '*.rej'], ), "ExtraFile": ([], ), "ExtraDocFile": ([], ), "NoDefaultConfigureArgs": (False, ), "BuildInSourceDir": (False, ), "NoDiffNewFiles": (False, ), "AlternateTarballStem": ("", ), } def __init__(self): for directive, info in self.info.items(): setattr(self, directive, info[self.I_DEFAULT]) def register_option(self, optstr): directive_and_arg = optstr.split(" ", 1) directive = directive_and_arg[0] try: arg = directive_and_arg[1] except IndexError: arg = None try: info = self.info[directive] except KeyError: sys.exit("Invalid directive '%s'" % directive) if type(info[self.I_DEFAULT]) == list: getattr(self, directive).append(arg) elif type(info[self.I_DEFAULT]) == str: setattr(self, directive, arg) elif type(info[self.I_DEFAULT]) == bool: setattr(self, directive, not info[self.I_DEFAULT]) elif type(info[self.I_DEFAULT]) == dict: items = arg.split(" ") getattr(self, directive)[items[0]] = items[1:] def dump_config(self): for directive in self.info.keys(): print >> sys.stderr, "%s: %s" % (directive, getattr(self, directive)) c = Context() opts, args = getopt.gnu_getopt(sys.argv[1:], 'F:') for o, a in opts: if o == "-F": f = open(a) for line in f.readlines(): line = line.rstrip('\r\n') if line and line[0] != '#': c.register_option(line) f.close() c.dump_config() for line in fileinput.FileInput(args): line = line.rstrip() # prologue if line == "\tTODO \\": print line for i in c.ExtraDocFile: print "\t%s\\" % (i,) continue elif line == "export BASEPKG=${PKG}-${VER}": if c.AlternateTarballStem: print "export BASEPKG=" + c.AlternateTarballStem + "-${VER}" continue elif line == "export test_rule=test": if c.TestMakeRule: print "export test_rule=" + c.TestMakeRule continue # unpack elif line == ' tar xv${opt_decomp}f "$1"': if c.UnpackExclude: print " tar --exclude='%s' -xv${opt_decomp}f \"$1\"" % ( "' --exclude='".join(c.UnpackExclude)) continue # prep elif line == " mkdirs )": if c.PrepCmd: for cmd in c.PrepCmd: print " %s && \\" % cmd if c.AutoreconfCmd: print " (cd ${BASEPKG} && \\" for cmd in c.AutoreconfCmd[:-1]: print " %s && \\" % cmd print " %s ) && \\" % c.AutoreconfCmd[-1] print " mkdirs )" continue # conf elif line == ' CFLAGS="${MY_CFLAGS}" LDFLAGS="${MY_LDFLAGS}" \\': if c.PreConfigureCmd: for cmd in c.PreConfigureCmd: print " %s && \\" % cmd elif line in ( """ --srcdir=${srcdir} --prefix="${prefix}" \\""", """ --exec-prefix='${prefix}' --sysconfdir="${sysconfdir}" \\""", " --libdir='${prefix}/lib' --includedir='${prefix}/include' \\", " --mandir='${prefix}/share/man' --infodir='${prefix}/share/info' \\", """ --libexecdir='${sbindir}' --localstatedir="${localstatedir}" \\""", ): if c.NoDefaultConfigureArgs: continue elif line == " --datadir='${prefix}/share' )": if c.ConfigureArg: if not c.NoDefaultConfigureArgs: print line[:-1]+"\\" print " " + " ".join(c.ConfigureArg) + " )" continue elif c.NoDefaultConfigureArgs: print " )" continue # build elif line == " CFLAGS=\"${MY_CFLAGS}\" make )": if c.MakeTarget: for i in c.MakeTarget[:-1]: print " CFLAGS=\"${MY_CFLAGS}\" make %s && \\" % i print " CFLAGS=\"${MY_CFLAGS}\" make %s )" % c.MakeTarget[-1] continue # install elif line == " make install DESTDIR=${instdir} && \\": if c.MakeInstallTarget: for i in c.MakeInstallTarget: print " make %s DESTDIR=${instdir} && \\" % i else: print line if c.InstallExtraCmd: for i in c.InstallExtraCmd: print " %s && \\" % i if c.ExtraFile: for i in c.ExtraFile: dirn = os.path.dirname(i) basen = os.path.basename(i) print " mkdir -p ${instdir}%s && \\" % (dirn) print " cp ${srcdir}/CYGWIN-PATCHES/%s ${instdir}%s && \\" % (basen, i) continue # pkg elif line == " tar cvjf ${bin_pkg} * )": if c.SubPackage: allitems = [] for tarball, items in c.SubPackage.items(): allitems.extend(items) print " tar -cjvf \"${topdir}/%s\" %s" % (tarball, " ".join(items)) print " tar --exclude='%s' -cjvf ${bin_pkg} * )" % ( "' --exclude='".join(allitems)) continue # mkpatch elif line == ' mv ${BASEPKG} ../${BASEPKG}-orig && \\': if c.AutoreconfCmd: print line print " (cd ../${BASEPKG}-orig && \\" for cmd in c.AutoreconfCmd[:-1]: print " %s && \\" % cmd print " %s ) && \\" % c.AutoreconfCmd[-1] continue elif line == " diff -urN -x '.build' -x '.inst' -x '.sinst' \\": if c.NoDiffNewFiles: line = line.replace(' -urN ', ' -ur ') if c.DiffExclude: print line print " -x '" + "' -x '".join(c.DiffExclude) + "' \\" continue # several elif line == ' (cd ${objdir} && \\': if c.BuildInSourceDir: print ' (cd ${srcdir} && \\' continue print line