def iterateModifications(list): while len(list) > 0: newList = [] if config.verbose: sys.stdout.write('[%i]' % len(list)) sys.stdout.flush() for dict, obj, target in list: if dict == None: expr = obj.value else: expr = dict[obj] mk.__resetUsageTracker(reset_coverage=0) try: new = mk.evalExpr(expr, target=target) except Exception, e: raise errors.Error("failed to set variable '%s' to value '%s': %s" % (obj, expr, e)) if expr != new: if dict == None: obj.value = new else: dict[obj] = new if (mk.__usageTracker.vars + mk.__usageTracker.pyexprs - mk.__usageTracker.refs > 0) \ and ('$' in new): newList.append((dict,obj,target)) list = newList
def finalEvaluation(outputVarsOnly=1): """Evaluates all variables, so that unneccessary $(...) parts are removed in cases when <set eval="0" ...> was used. Noteworthy effect is that after calling this function all variables are fully evaluated except for conditional and make vars and options, meaning that outputVarsOnly=0 is only needed when running finalEvaluation for the first time, because no ordinary variable depends (by using $(varname)) on another ordinary variable in subsequent runs. """ mk.__trackUsage = 1 mk.__resetUsageTracker(reset_coverage=1) list = [] if outputVarsOnly: interestingVars = mk.vars['FORMAT_OUTPUT_VARIABLES'].strip() if interestingVars != '': interestingVars = interestingVars.split() optimizeVars = len(interestingVars) > 0 else: optimizeVars = 0 else: optimizeVars = 0 for v in mk.make_vars: if '$' in mk.make_vars[v]: list.append((mk.make_vars,v,None)) for c in mk.cond_vars.values(): for v in c.values: if '$' in v.value: list.append((None,v,c.target)) if optimizeVars: for v in interestingVars: if v in mk.vars and '$' in mk.vars[v]: list.append((mk.vars,v,None)) else: for v in mk.vars: if type(mk.vars[v]) is StringType: if '$' in mk.vars[v]: list.append((mk.vars,v,None)) if optimizeVars: for t in mk.targets.values(): for v in interestingVars: if v in t.vars and '$' in t.vars[v]: list.append((t.vars,v,t)) else: for t in mk.targets.values(): for v in t.vars: if type(t.vars[v]) is StringType: if '$' in t.vars[v]: list.append((t.vars,v,t)) def iterateModifications(list): while len(list) > 0: newList = [] if config.verbose: sys.stdout.write('[%i]' % len(list)) sys.stdout.flush() for dict, obj, target in list: if dict == None: expr = obj.value else: expr = dict[obj] mk.__resetUsageTracker(reset_coverage=0) try: new = mk.evalExpr(expr, target=target) except Exception, e: raise errors.Error("failed to set variable '%s' to value '%s': %s" % (obj, expr, e)) if expr != new: if dict == None: obj.value = new else: dict[obj] = new if (mk.__usageTracker.vars + mk.__usageTracker.pyexprs - mk.__usageTracker.refs > 0) \ and ('$' in new): newList.append((dict,obj,target)) list = newList