]> rtime.felk.cvut.cz Git - omk.git/blobdiff - omkbuild.py
omkbuild.py: The whole delimiter of legal part belongs to that part
[omk.git] / omkbuild.py
index 3554e6485eb49900209226192094c1e3b260b324..7f01c3b5064478d5164891bbb52902c6e7095188 100755 (executable)
@@ -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@<snippet file name><EOL>. This mark
-     is used for splitting Makefile.rules back to the original
-     snippets.
-
+     special mark of the form #OMK@<snippet file name><EOL>. This mark
+     is used for splitting modified Makefile.rules back to the
+     original snippets. If <snippet file name> 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
@@ -95,11 +103,15 @@ class Snippet:
             if currentPart == self.legal:
                 if line.strip() == "#": counter += 1
                 else: counter = 0
-                if counter == 2: currentPart = self.doc
             if line[0] != "#": currentPart = self.code
 
             currentPart.append(line)
 
+            if counter == 2:
+                currentPart = self.doc
+                counter = 0
+
+
         if not self.doc:
             self.doc = self.legal
             self.legal = LineList()
@@ -181,6 +193,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 +238,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 +262,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 +294,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 +303,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 +319,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()