def get(self, name, expand=True): """ Get the value of a named variable. Returns a tuple (flavor, source, value) If the variable is not present, returns (None, None, None) @param expand If true, the value will be returned as an expansion. If false, it will be returned as an unexpanded string. """ flavor, source, valuestr, valueexp = self._map.get(name, (None, None, None, None)) if flavor is not None: if expand and flavor != self.FLAVOR_SIMPLE and valueexp is None: d = parser.Data.fromstring(valuestr, parserdata.Location("Expansion of variables '%s'" % (name,), 1, 0)) valueexp, t, o = parser.parsemakesyntax(d, 0, (), parser.iterdata) self._map[name] = flavor, source, valuestr, valueexp if flavor == self.FLAVOR_APPEND: if self.parent: pflavor, psource, pvalue = self.parent.get(name, expand) else: pflavor, psource, pvalue = None, None, None if pvalue is None: flavor = self.FLAVOR_RECURSIVE # fall through else: if source > psource: # TODO: log a warning? return pflavor, psource, pvalue if not expand: return pflavor, psource, pvalue + ' ' + valuestr pvalue = pvalue.clone() pvalue.appendstr(' ') pvalue.concat(valueexp) return pflavor, psource, pvalue if not expand: return flavor, source, valuestr if flavor == self.FLAVOR_RECURSIVE: val = valueexp else: val = Expansion.fromstring(valuestr, "Expansion of variable '%s'" % (name,)) return flavor, source, val if self.parent is not None: return self.parent.get(name, expand) return (None, None, None)
def execute(self, makefile, context): vname = self.vnameexp.resolvestr(makefile, makefile.variables) if len(vname) == 0: raise data.DataError("Empty variable name", self.vnameexp.loc) if self.targetexp is None: setvariables = [makefile.variables] else: setvariables = [] targets = [ data.Pattern(t) for t in data.stripdotslashes( self.targetexp.resolvesplit(makefile, makefile.variables)) ] for t in targets: if t.ispattern(): setvariables.append(makefile.getpatternvariables(t)) else: setvariables.append( makefile.gettarget(t.gettarget()).variables) for v in setvariables: if self.token == '+=': v.append(vname, self.source, self.value, makefile.variables, makefile) continue if self.token == '?=': flavor = data.Variables.FLAVOR_RECURSIVE oldflavor, oldsource, oldval = v.get(vname, expand=False) if oldval is not None: continue value = self.value elif self.token == '=': flavor = data.Variables.FLAVOR_RECURSIVE value = self.value else: assert self.token == ':=' flavor = data.Variables.FLAVOR_SIMPLE d = parser.Data.fromstring(self.value, self.valueloc) e, t, o = parser.parsemakesyntax(d, 0, (), parser.iterdata) value = e.resolvestr(makefile, makefile.variables) v.set(vname, flavor, self.source, value)
def execute(self, makefile, context): vname = self.vnameexp.resolvestr(makefile, makefile.variables) if len(vname) == 0: raise data.DataError("Empty variable name", self.vnameexp.loc) if self.targetexp is None: setvariables = [makefile.variables] else: setvariables = [] targets = [ data.Pattern(t) for t in data.stripdotslashes(self.targetexp.resolvesplit(makefile, makefile.variables)) ] for t in targets: if t.ispattern(): setvariables.append(makefile.getpatternvariables(t)) else: setvariables.append(makefile.gettarget(t.gettarget()).variables) for v in setvariables: if self.token == "+=": v.append(vname, self.source, self.value, makefile.variables, makefile) continue if self.token == "?=": flavor = data.Variables.FLAVOR_RECURSIVE oldflavor, oldsource, oldval = v.get(vname, expand=False) if oldval is not None: continue value = self.value elif self.token == "=": flavor = data.Variables.FLAVOR_RECURSIVE value = self.value else: assert self.token == ":=" flavor = data.Variables.FLAVOR_SIMPLE d = parser.Data.fromstring(self.value, self.valueloc) e, t, o = parser.parsemakesyntax(d, 0, (), parser.iterdata) value = e.resolvestr(makefile, makefile.variables) v.set(vname, flavor, self.source, value)
def append(self, name, source, value, variables, makefile): assert source in (self.SOURCE_OVERRIDE, self.SOURCE_MAKEFILE, self.SOURCE_AUTOMATIC) assert isinstance(value, str) if name not in self._map: self._map[name] = self.FLAVOR_APPEND, source, value, None return prevflavor, prevsource, prevvalue, valueexp = self._map[name] if source > prevsource: # TODO: log a warning? return if prevflavor == self.FLAVOR_SIMPLE: d = parser.Data.fromstring(value, parserdata.Location("Expansion of variables '%s'" % (name,), 1, 0)) valueexp, t, o = parser.parsemakesyntax(d, 0, (), parser.iterdata) val = valueexp.resolvestr(makefile, variables, [name]) self._map[name] = prevflavor, prevsource, prevvalue + ' ' + val, None return newvalue = prevvalue + ' ' + value self._map[name] = prevflavor, prevsource, newvalue, None