First shot at factoring SMM code into generic parts and southbridge specific
[coreboot.git] / util / newconfig / config.g
index d8570c7bc69447c1985c07a2b0ae005be7688287..294d4072161b31e064ca9b0c4b1113953a1cdf94 100644 (file)
@@ -223,9 +223,12 @@ class romimage:
                # init object files added by 'initobject' directive
                self.initobjectrules = {}
 
-               # driver files added by 'drive' directive
+               # driver files added by 'driver' directive
                self.driverrules = {}
 
+               # smm object files added by 'smmobject' directive
+               self.smmobjectrules = {}
+
                # loader scripts added by 'ldscript' directive
                self.ldscripts = []
 
@@ -344,6 +347,9 @@ class romimage:
        def adddriverrule(self, name):
                self.addobjectdriver(self.driverrules, name)
 
+       def addsmmobjectrule(self, name):
+               self.addobjectdriver(self.smmobjectrules, name)
+
        def getinitobjectrules(self):
                return self.initobjectrules
 
@@ -371,6 +377,15 @@ class romimage:
                        return o
                fatal("No such driver rule \"%s\"" % name)
 
+       def getsmmobjectrules(self):
+               return self.smmobjectrules
+
+       def getsmmobjectrule(self, name):
+               o = getdict(self.smmobjectrules, name)
+               if (o):
+                       return o
+               fatal("No such smm object rule \"%s\"" % name)
+
        def addldscript(self, path):
                self.ldscripts.append(path)
 
@@ -1370,6 +1385,10 @@ def adddriver(driver_name):
        global curimage
        curimage.adddriverrule(driver_name)
 
+def addsmmobject(object_name):
+       global curimage
+       curimage.addsmmobjectrule(object_name)
+
 def target(name):
         global target_dir, target_name
        print "Configuring TARGET %s" % name
@@ -1593,6 +1612,7 @@ parser Config:
     token PRINT:               'print'
     token REGISTER:            'register'
     token ROMIMAGE:            'romimage'
+    token SMMOBJECT:           'smmobject'
     token SOUTHBRIDGE:         'southbridge'
     token SUPERIO:             'superio'
     token TARGET:              'target'
@@ -1607,6 +1627,7 @@ parser Config:
     token PATH:                        r'[-a-zA-Z0-9_.][-a-zA-Z0-9/_.]+[-a-zA-Z0-9_.]+'
     # Dir's on the other hand are abitrary
     # this may all be stupid.
+    token RULE:                        r'[-a-zA-Z0-9_$()./]+[-a-zA-Z0-9_ $()./]+[-a-zA-Z0-9_$()./]+'
     token DIRPATH:             r'[-a-zA-Z0-9_$()./]+'
     token ID:                  r'[a-zA-Z_.]+[a-zA-Z0-9_.]*'
     token DELEXPR:             r'{([^}]+|\\.)*}'
@@ -1692,6 +1713,10 @@ parser Config:
 
     rule driver<<C>>:  DRIVER DIRPATH          {{ if (C): adddriver(DIRPATH)}}
 
+    rule smmobject<<C>>:
+                       SMMOBJECT DIRPATH       {{ if (C): addsmmobject(DIRPATH)}}
+
+
     rule dir<<C>>:     DIR DIRPATH             {{ if (C): dodir(DIRPATH, 'Config.lb') }}
 
     rule default<<C>>: DEFAULT ID EQ value     {{ if (C): setdefault(ID, value, 0) }}
@@ -1703,13 +1728,10 @@ parser Config:
                        [ ELSE (stmt<<C and not c>>)* ]
                        END
 
-    rule depsacts<<ID, C>>:
-                       ( DEPENDS STR           {{ if (C): adddep(ID, STR) }}
-                       | ACTION STR            {{ if (C): addaction(ID, STR) }}
+    rule makerule<<C>>:        MAKERULE RULE           {{ if (C): addrule(RULE) }}
+                       ( DEPENDS STR           {{ if (C): adddep(RULE, STR) }}
+                       | ACTION STR            {{ if (C): addaction(RULE, STR) }}
                        )*
-
-    rule makerule<<C>>:        MAKERULE DIRPATH        {{ if (C): addrule(DIRPATH) }} 
-                       depsacts<<DIRPATH, C>> 
                        END
 
     rule makedefine<<C>>:
@@ -1828,6 +1850,7 @@ parser Config:
                |       prtstmt<<C>>            {{ return prtstmt }}
                |       register<<C>>           {{ return register }}
                |       device<<C>>             {{ return device }}
+               |       smmobject<<C>>          {{ return smmobject }}
 
     # ENTRY for parsing Config.lb file
     rule cfgfile:      (uses<<1>>)* 
@@ -2030,6 +2053,13 @@ def writeimagemakefile(image):
                file.write("OBJECTS += %s\n" % (obj_name))
                file.write("SOURCES += %s\n" % (obj_source))
 
+       for srule, smm in image.getsmmobjectrules().items():
+               s_name = smm[0]
+               s_source = smm[1]
+               file.write("SMM-OBJECTS += %s\n" % (s_name))
+               file.write("SOURCES += %s\n" % (s_source))
+
+
        # for chip_target.c
        file.write("OBJECTS += static.o\n")
        file.write("SOURCES += static.c\n")
@@ -2072,11 +2102,9 @@ def writeimagemakefile(image):
                if (type  == 'S'):
                        # for .S, .o depends on .s
                        file.write("%s: %s.s\n" % (init[0], init[3]))
-                       file.write("\t@echo $(CC) ... -o $@ $<\n")
                        file.write("\t$(CC) -c $(CPU_OPT) -o $@ $<\n")
                        # and .s depends on .S
                        file.write("%s.s: %s\n" % (init[3], source))
-                       file.write("\t@echo $(CPP) ... $< > $@\n")
                        # Note: next 2 lines are ONE output line!
                        file.write("\t$(CPP) $(CPPFLAGS) $< ")
                        file.write(">$@.new && mv $@.new $@\n")
@@ -2091,11 +2119,9 @@ def writeimagemakefile(image):
                if (type  == 'S'):
                        # for .S, .o depends on .s
                        file.write("%s: %s.s\n" % (obj[0], obj[3]))
-                       file.write("\t@echo $(CC) ... -o $@ $<\n")
                        file.write("\t$(CC) -c $(CPU_OPT) -o $@ $<\n")
                        # and .s depends on .S
                        file.write("%s.s: %s\n" % (obj[3], source))
-                       file.write("\t@echo $(CPP) ... $< > $@\n")
                        # Note: next 2 lines are ONE output line!
                        file.write("\t$(CPP) $(CPPFLAGS) $< ")
                        file.write(">$@.new && mv $@.new $@\n")
@@ -2110,6 +2136,23 @@ def writeimagemakefile(image):
                file.write("\t$(CC) -c $(CFLAGS) -o $@ $<\n")
                #file.write("%s\n" % objrule[2])
 
+       file.write("\n# smmobjectrules:\n")
+       for irule, smm in image.getsmmobjectrules().items():
+               source = topify(smm[1])
+               type = smm[2]
+               if (type  == 'S'):
+                       # for .S, .o depends on .s
+                       file.write("%s: %s.s\n" % (smm[0], smm[3]))
+                       file.write("\t$(CC) -c $(CPU_OPT) -o $@ $<\n")
+                       # and .s depends on .S
+                       file.write("%s.s: %s\n" % (smm[3], source))
+                       # Note: next 2 lines are ONE output line!
+                       file.write("\t$(CPP) $(CPPFLAGS) $< ")
+                       file.write(">$@.new && mv $@.new $@\n")
+               else:
+                       file.write("%s: %s\n" % (smm[0], source))
+                       file.write("\t$(CC) -c $(CFLAGS) -o $@ $<\n")
+
        # special rule for chip_target.c
        file.write("static.o: static.c\n")
        file.write("\t$(CC) -c $(CFLAGS) -o $@ $<\n")
@@ -2158,15 +2201,18 @@ def writemakefile(path):
        for i, o in romimages.items():
                file.write("%s/coreboot.rom:\n" % o.getname())
                file.write("\tif (cd %s; \\\n" % o.getname())
-               file.write("\t\tmake coreboot.rom)\\\n")
+               file.write("\t\t$(MAKE) coreboot.rom)\\\n")
                file.write("\tthen true; else exit 1; fi;\n\n")
        file.write("clean: ")
        for i in romimages.keys():
                file.write(" %s-clean" % i)
+       file.write(" base-clean")
        file.write("\n\n")
        for i, o in romimages.items():
                file.write("%s-clean:\n" % o.getname())
-               file.write("\t(cd %s; make clean)\n\n" % o.getname())
+               file.write("\t(cd %s; $(MAKE) clean)\n\n" % o.getname())
+       file.write("base-clean:\n")
+       file.write("\trm -f romcc*\n\n")
 
        for i in buildroms:
                file.write("%s:" % i.name)