X-Git-Url: http://rtime.felk.cvut.cz/gitweb/omk.git/blobdiff_plain/b4c8dea64315e18434d85e9d5af57e8a2b23a977..b63e8c215b2452c3021c2f44ba2fb8a7ef5d5d6e:/omkbuild.py diff --git a/omkbuild.py b/omkbuild.py index 3554e64..facccc2 100755 --- a/omkbuild.py +++ b/omkbuild.py @@ -13,9 +13,9 @@ Snippet syntax: documentation := comment* rules ::= text - comment ::= '#' text - empty-comment ::= '#' - text ::= [^#] ... + comment ::= '#' text '\n' + empty-comment ::= '#' '\n' + text ::= [^#] ... '\n' Makefile.rules policies: @@ -23,10 +23,10 @@ Snippet syntax: as they are in snippets i.e. copyrights, documentations and rules. * On the first line of each part of the Makefile.rules, there is - special mart of the form #OMK@. This mark - is used for splitting Makefile.rules back to the original - snippets. - + special mark of the form #OMK@. This mark + is used for splitting modified Makefile.rules back to the + original snippets. If starts with __, it is + ignored during splitting. """ from optparse import OptionParser @@ -44,6 +44,11 @@ class LineList(list): def getDiff(self, other): s = '' for i in range(len(self)): + if i >= len(other): + s += (" Line %d differs!\n" % i) + s += " -"+self[i].rstrip() + "\n" + s += " +\n" + break if self[i] != other[i]: s += (" Line %d differs!\n" % i) s += " -"+self[i].rstrip() + "\n" @@ -68,10 +73,10 @@ class LineList(list): f.close class Snippet: - def __init__(self, fname = None): + def __init__(self, fname = None, name = ""): """Initializes the snippet and if fname is given, reads it from file""" - self.name = "" + self.name = name self.legal = LineList() self.doc = LineList() self.code = LineList() @@ -86,6 +91,9 @@ class Snippet: f.close + def addCodeLine(self, line): + self.code.append(line) + def readLines(self, lines): """Parses the snippet given as a list and stores it in itself.""" currentPart = self.legal @@ -181,6 +189,7 @@ class Snippets: assert isinstance(other, Snippets) s = '' for snip in self: + if (snip.name[0:2] == '__'): continue if (snip != other[snip.name]): s += "Snippet %s:\n" % snip.name s += snip.getDiff(other[snip.name]) @@ -225,8 +234,10 @@ class MakefileRules(LineList): if not snipName in snipDict: snipDict[snipName] = LineList() currentLinesList = snipDict[snipName] - - currentLinesList.append(line); + + if currentLinesList != None: + currentLinesList.append(line); + return snipDict @@ -247,8 +258,11 @@ def parseCommandLine(): (options, args) = parser.parse_args() return options, args -def buildRules(fnames, output): +def buildRules(fnames, output, name): rules = MakefileRules() + snip_rule_type = Snippet(name="__type") + snip_rule_type.addCodeLine("OMK_RULES_TYPE=%s\n" % name) + rules.snippets += snip_rule_type rules.snippets.loadFromFiles(fnames) rules.combine() @@ -276,7 +290,8 @@ def splitRules(rulesFN, output): rulesCheck.snippets = rules.snippets rulesCheck.combine() - # The order of rules might be different + # The comparsion is not that simple. The order of rules might be + # different. # if rules.rules != rulesCheck.rules: # sys.stderr.write("Consistency error:\n") # diff = rules.rules.getDiff(rulesCheck.rules) @@ -284,11 +299,14 @@ def splitRules(rulesFN, output): # sys.exit(1) for snip in rules.snippets: - print snip.__class__ -# f = None -# if output == "-": f = sys.stdout -# f.writelines(rules.rules) -# f.close() + if snip.name[0:2] == "__": + continue + print snip.name + f = None + if output == "-": f = sys.stdout + else: f = open(snip.name, "w+") + f.writelines(snip.asLinesList()) + f.close() def buildAllRules(): import rulesdef @@ -297,7 +315,7 @@ def buildAllRules(): print 'Building rules: %s' % rules outputDir = os.path.join(sys.path[0], rulesDir, rules) if not os.path.isdir(outputDir): os.makedirs(outputDir) - buildRules(rulesdef.rules[rules], os.path.join(outputDir, 'Makefile.rules')) + buildRules(rulesdef.rules[rules], os.path.join(outputDir, 'Makefile.rules'), rules) def main(): (options, args) = parseCommandLine()