From 4f8311ae58ee66ce7ba774bf95894612d92f748d Mon Sep 17 00:00:00 2001 From: Greg Watson Date: Tue, 23 Mar 2004 17:37:02 +0000 Subject: [PATCH] These changes tighten up rules for exporting options. 1. Exportable options ('export used') used to be exported if referred to in a 'uses' statement. These options will now only be exported if the option is set, or the default value is changed. 2. Options marked as 'export always' with no default value ('default none') used to generate defines with no values 'export k8:='. This behavior has changed so that the option will ONLY be exported if it has a value assigned using 'set' or 'default'. Otherwise it is an error. git-svn-id: svn://svn.coreboot.org/coreboot/trunk@1467 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1 --- util/newconfig/config.g | 72 +++++++++++++++++++++++------------------ 1 file changed, 41 insertions(+), 31 deletions(-) diff --git a/util/newconfig/config.g b/util/newconfig/config.g index b7f3d6fbf3..aa48ead780 100644 --- a/util/newconfig/config.g +++ b/util/newconfig/config.g @@ -164,11 +164,11 @@ def error(string): global errors, loc errors = errors + 1 print "===> ERROR: %s" % string - print "%s" % loc def fatal(string): """Print error message and exit""" error(string) + print "%s" % loc exitiferrors() def warning(string): @@ -288,7 +288,7 @@ class romimage: o = getdict(self.makebaserules, id) if (o): return o - fatal("No such make rule \"%s\"" % id); + fatal("No such make rule \"%s\"" % id) def addmakeaction(self, id, str): o = getdict(self.makebaserules, id) @@ -296,7 +296,7 @@ class romimage: a = dequote(str) o.addaction(a) return - fatal("No such rule \"%s\" for addmakeaction" % id); + fatal("No such rule \"%s\" for addmakeaction" % id) def addmakedepend(self, id, str): o = getdict(self.makebaserules, id) @@ -304,7 +304,7 @@ class romimage: a = dequote(str) o.adddependency(a) return - fatal("No such rule \"%s\" for addmakedepend" % id); + fatal("No such rule \"%s\" for addmakedepend" % id) # this is called with an an object name. # the easiest thing to do is add this object to the current @@ -345,7 +345,7 @@ class romimage: o = getdict(self.initobjectrules, name) if (o): return o - fatal("No such init object rule \"%s\"" % name); + fatal("No such init object rule \"%s\"" % name) def getobjectrules(self): return self.objectrules @@ -354,7 +354,7 @@ class romimage: o = getdict(self.objectrules, name) if (o): return o - fatal("No such object rule \"%s\"" % name); + fatal("No such object rule \"%s\"" % name) def getdriverrules(self): return self.driverrules @@ -363,7 +363,7 @@ class romimage: o = getdict(self.driverrules, name) if (o): return o - fatal("No such driver rule \"%s\"" % name); + fatal("No such driver rule \"%s\"" % name) def addldscript(self, path): self.ldscripts.append(path) @@ -396,7 +396,7 @@ class romimage: o = getdict(self.initincludes, path) if (o): return o - fatal("No such init include \"%s\"" % path); + fatal("No such init include \"%s\"" % path) def addconfiginclude(self, part, path): setdict(self.configincludes, part, path) @@ -514,11 +514,6 @@ class option: def getformat(self): return self.format - def setused(self): - if (self.exportable): - self.exported = 1 - self.used = 1 - def setwrite(self, part): self.write.append(part) @@ -636,7 +631,7 @@ class partobj: # me as the child. if (parent.children): debug.info(debug.gencode, "add %s (%d) as sibling" % (parent.children.dir, parent.children.instance)) - youngest = parent.children; + youngest = parent.children while(youngest.siblings): youngest = youngest.siblings youngest.siblings = self @@ -688,7 +683,7 @@ class partobj: file.write("};\n") else: file.write(";") - file.write("\n"); + file.write("\n") if (self.instance): file.write("struct chip %s = {\n" % self.instance_name) else: @@ -696,7 +691,7 @@ class partobj: file.write("\t/* %s %s */\n" % (self.part, self.dir)) file.write("\t.link = %d,\n" % (self.link)) if (self.path != ""): - file.write("\t.path = { %s\n\t},\n" % (self.path) ); + file.write("\t.path = { %s\n\t},\n" % (self.path) ) if (self.siblings): debug.info(debug.gencode, "gencode: siblings(%d)" \ % self.siblings.instance) @@ -787,7 +782,10 @@ class partobj: if (o1): return setdict(self.uses_options, name, o) - exportoption(o, self.image.exported_options) + + def exportoption(self, op): + """Export option that is used by this part""" + exportoption(op, self.image.exported_options) # ----------------------------------------------------------------------------- # statements @@ -874,6 +872,12 @@ def getoption(name, image): exitiferrors() return val +def exportoption(op, exported_options): + if (not op.isexportable()): + return + if (not op in exported_options): + exported_options.append(op) + def setoption(name, value, imp): """Set an option from within a configuration file. Normally this is only permitted in the target (top level) configuration file. @@ -899,19 +903,19 @@ def setoption(name, value, imp): if (v == 0): v = newoptionvalue(name, curimage) v.setvalue(value) - -def exportoption(op, exported_options): - if (not op.isexportable()): - return - if (not op in exported_options): - exported_options.append(op) + if (curpart): + curpart.exportoption(o) + else: + exportoption(o, global_exported_options) def setdefault(name, value, isdef): """Set the default value of an option from within a configuration file. This is permitted from any configuration file, but will result in a warning if the default is set more than once. If 'isdef' is set, we're defining the option in Options.lb so - there is no need for 'uses'.""" + there is no need for 'uses'. + Note also that changing an options default value will export + the option, if it is exportable.""" global loc, global_options, curimage @@ -934,6 +938,12 @@ def setdefault(name, value, isdef): if (v == 0): v = newoptionvalue(name, image) v.setdefault(value) + if (isdef): + return + if (curpart): + curpart.exportoption(o) + else: + exportoption(o, global_exported_options) def setnodefault(name): global loc, global_options @@ -1037,7 +1047,6 @@ def usesoption(name): if (o1): return setdict(global_uses_options, name, o) - exportoption(o, global_exported_options) def validdef(name, defval): global global_options @@ -1873,7 +1882,7 @@ def writemakefile(path): for i, o in romimages.items(): file.write("%s-rom:\n" % o.getname()) file.write("\tif (cd %s; \\\n" % o.getname()) - file.write("\t\tmake linuxbios.rom)\\\n"); + file.write("\t\tmake linuxbios.rom)\\\n") file.write("\tthen true; else exit 1; fi;\n\n") file.write("clean: ") for i in romimages.keys(): @@ -1885,10 +1894,10 @@ def writemakefile(path): file.write("\nbuildroms:\n") for i in buildroms: - file.write("\tcat "); + file.write("\tcat ") for j in i.roms: file.write("%s/linuxbios.rom " % j ) - file.write("> %s\n" % i.name); + file.write("> %s\n" % i.name) file.write("\n") file.close() @@ -1910,7 +1919,7 @@ def writeinitincludes(image): if (inc.getstring() == p.group(1)): outfile.write("#include \"%s\"\n" % inc.getpath()) else: - outfile.write(line); + outfile.write(line) line = infile.readline() infile.close() @@ -1991,11 +2000,12 @@ def verifyparse(): fatal("An init file must be specified") for op in image.exported_options: if (getoptionvalue(op.name, op, image) == 0 and getoptionvalue(op.name, op, 0) == 0): - warning("Exported option %s has no value (check Options.lb)" % op.name); + error("Exported option %s has no value (check Options.lb)" % op.name) print("Verifing global options") for op in global_exported_options: if (getoptionvalue(op.name, op, 0) == 0): - notice("Exported option %s has no value (check Options.lb)" % op.name); + error("Exported option %s has no value (check Options.lb)" % op.name) + exitiferrors() #============================================================================= # MAIN PROGRAM