Keep the first and last snapshot of variables.

So we can compare our reconstruction of the variable state.

Test: treehugger
Change-Id: I9c1995f8969dcf95256aa7c05a01d0431e36caa2
This commit is contained in:
Joe Onorato 2021-02-05 11:46:03 -08:00
parent 8523601ce9
commit 64f3db2ec1
5 changed files with 129 additions and 30 deletions

View file

@ -79,11 +79,19 @@ endef
# $(2): Root nodes to import # $(2): Root nodes to import
# $(3): All variable names # $(3): All variable names
# $(4): Single-value variables # $(4): Single-value variables
define dump-product-var-names # $(5): Makefile being processed
define dump-phase-start
$(eval $(file >> $(DUMPCONFIG_FILE),phase,$(strip $(1)),$(strip $(2)))) \ $(eval $(file >> $(DUMPCONFIG_FILE),phase,$(strip $(1)),$(strip $(2)))) \
$(foreach var,$(3), \ $(foreach var,$(3), \
$(eval $(file >> $(DUMPCONFIG_FILE),var,$(if $(filter $(4),$(var)),single,list),$(var))) \ $(eval $(file >> $(DUMPCONFIG_FILE),var,$(if $(filter $(4),$(var)),single,list),$(var))) \
) ) \
$(call dump-config-vals,$(strip $(5)),initial)
endef
# Args:
# $(1): Makefile being processed
define dump-phase-end
$(call dump-config-vals,$(strip $(1)),final)
endef endef
define dump-debug define dump-debug
@ -110,7 +118,7 @@ DUMPCONFIG_SKIP_VARS := \
# Args: # Args:
# $(1): Makefile that was included # $(1): Makefile that was included
# $(2): block (before,import,after) # $(2): block (before,import,after,initial,final)
define dump-config-vals define dump-config-vals
$(foreach var,$(filter-out $(DUMPCONFIG_SKIP_VARS),$(.KATI_SYMBOLS)),\ $(foreach var,$(filter-out $(DUMPCONFIG_SKIP_VARS),$(.KATI_SYMBOLS)),\
$(eval $(file >> $(DUMPCONFIG_FILE),val,$(call escape-for-csv,$(1)),$(2),$(call escape-for-csv,$(var)),$(call escape-for-csv,$($(var))),$(call escape-for-csv,$(KATI_variable_location $(var))))) \ $(eval $(file >> $(DUMPCONFIG_FILE),val,$(call escape-for-csv,$(1)),$(2),$(call escape-for-csv,$(var)),$(call escape-for-csv,$($(var))),$(call escape-for-csv,$(KATI_variable_location $(var))))) \

View file

@ -254,13 +254,13 @@ endef
# of the default list semantics # of the default list semantics
# #
define import-nodes define import-nodes
$(call dump-phase-start,$(1),$(2),$(3),$(4),build/make/core/node_fns.mk) \
$(if \ $(if \
$(foreach _in,$(2), \ $(foreach _in,$(2), \
$(eval _node_import_context := _nic.$(1).[[$(_in)]]) \ $(eval _node_import_context := _nic.$(1).[[$(_in)]]) \
$(if $(_include_stack),$(eval $(error ASSERTION FAILED: _include_stack \ $(if $(_include_stack),$(eval $(error ASSERTION FAILED: _include_stack \
should be empty here: $(_include_stack))),) \ should be empty here: $(_include_stack))),) \
$(eval _include_stack := ) \ $(eval _include_stack := ) \
$(call dump-product-var-names,$(1),$(2),$(3),$(4)) \
$(call _import-nodes-inner,$(_node_import_context),$(_in),$(3),$(4)) \ $(call _import-nodes-inner,$(_node_import_context),$(_in),$(3),$(4)) \
$(call move-var-list,$(_node_import_context).$(_in),$(1).$(_in),$(3)) \ $(call move-var-list,$(_node_import_context).$(_in),$(1).$(_in),$(3)) \
$(eval _node_import_context :=) \ $(eval _node_import_context :=) \
@ -268,5 +268,6 @@ $(if \
$(if $(_include_stack),$(eval $(error ASSERTION FAILED: _include_stack \ $(if $(_include_stack),$(eval $(error ASSERTION FAILED: _include_stack \
should be empty here: $(_include_stack))),) \ should be empty here: $(_include_stack))),) \
) \ ) \
,) ,) \
$(call dump-phase-end,build/make/core/node_fns.mk)
endef endef

View file

@ -18,6 +18,7 @@ package com.android.build.config;
import java.io.PrintStream; import java.io.PrintStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.TreeMap; import java.util.TreeMap;
@ -29,6 +30,17 @@ public class ConfigBase {
protected String mPhase; protected String mPhase;
protected List<String> mRootNodes; protected List<String> mRootNodes;
/**
* State of the make varaible environment from before the first config file.
*/
protected Map<String, Str> mInitialVariables = new HashMap();
/**
* State of the make varaible environment from after the first config file.
*/
protected Map<String, Str> mFinalVariables = new HashMap();
/** /**
* The variables that are handled specially. * The variables that are handled specially.
*/ */
@ -80,6 +92,20 @@ public class ConfigBase {
return mProductVars.get(name) != null; return mProductVars.get(name) != null;
} }
/**
* Return the state the make variable environment from before the first config file.
*/
public Map<String, Str> getInitialVariables() {
return mInitialVariables;
}
/**
* Return the state the make variable environment from before the first config file.
*/
public Map<String, Str> getFinalVariables() {
return mFinalVariables;
}
/** /**
* Copy common base class fields from that to this. * Copy common base class fields from that to this.
*/ */
@ -89,5 +115,7 @@ public class ConfigBase {
for (Map.Entry<String, ConfigBase.VarType> entry: that.getProductVars().entrySet()) { for (Map.Entry<String, ConfigBase.VarType> entry: that.getProductVars().entrySet()) {
addProductVar(entry.getKey(), entry.getValue()); addProductVar(entry.getKey(), entry.getValue());
} }
mInitialVariables = new HashMap(that.getInitialVariables());
mFinalVariables = new HashMap(that.getFinalVariables());
} }
} }

View file

@ -54,10 +54,6 @@ public class DumpConfigParser {
private static final Pattern LIST_SEPARATOR = Pattern.compile("\\s+"); private static final Pattern LIST_SEPARATOR = Pattern.compile("\\s+");
public class BuildPhase {
}
/** /**
* Constructor. * Constructor.
*/ */
@ -120,6 +116,8 @@ public class DumpConfigParser {
MakeConfig makeConfig = new MakeConfig(); MakeConfig makeConfig = new MakeConfig();
MakeConfig.ConfigFile configFile = new MakeConfig.ConfigFile("<ignored>"); MakeConfig.ConfigFile configFile = new MakeConfig.ConfigFile("<ignored>");
MakeConfig.Block block = new MakeConfig.Block(MakeConfig.BlockType.UNSET); MakeConfig.Block block = new MakeConfig.Block(MakeConfig.BlockType.UNSET);
Map<String, Str> initialVariables = new HashMap();
Map<String, Str> finalVariables = new HashMap();
// Number of "phases" we've seen so far. // Number of "phases" we've seen so far.
for (; index < lineCount; index++) { for (; index < lineCount; index++) {
@ -128,10 +126,13 @@ public class DumpConfigParser {
final String lineType = fields.get(0); final String lineType = fields.get(0);
if (matchLineType(line, "phase", 2)) { if (matchLineType(line, "phase", 2)) {
// Start the new one
makeConfig = new MakeConfig(); makeConfig = new MakeConfig();
makeConfig.setPhase(fields.get(1)); makeConfig.setPhase(fields.get(1));
makeConfig.setRootNodes(splitList(fields.get(2))); makeConfig.setRootNodes(splitList(fields.get(2)));
mResults.add(makeConfig); mResults.add(makeConfig);
initialVariables = makeConfig.getInitialVariables();
finalVariables = makeConfig.getFinalVariables();
if (DEBUG) { if (DEBUG) {
System.out.println("PHASE:"); System.out.println("PHASE:");
@ -216,32 +217,41 @@ public class DumpConfigParser {
} }
} else if (matchLineType(line, "val", 5)) { } else if (matchLineType(line, "val", 5)) {
final String productMakefile = fields.get(1); final String productMakefile = fields.get(1);
final MakeConfig.BlockType blockType = parseBlockType(line, fields.get(2)); final String blockTypeString = fields.get(2);
final String varName = fields.get(3); final String varName = fields.get(3);
final String varValue = fields.get(4); final String varValue = fields.get(4);
final Position pos = Position.parse(fields.get(5)); final Position pos = Position.parse(fields.get(5));
final Str str = new Str(pos, varValue);
if (!productMakefile.equals(configFile.getFilename())) { if (blockTypeString.equals("initial")) {
mErrors.WARNING_DUMPCONFIG.add( initialVariables.put(varName, str);
new Position(mFilename, line.getLine()), } else if (blockTypeString.equals("final")) {
"Mismatched 'val' product makefile." finalVariables.put(varName, str);
+ " Expected: " + configFile.getFilename() } else {
+ " Saw: " + productMakefile); if (!productMakefile.equals(configFile.getFilename())) {
continue; mErrors.WARNING_DUMPCONFIG.add(
} new Position(mFilename, line.getLine()),
if (blockType == null) { "Mismatched 'val' product makefile."
continue; + " Expected: " + configFile.getFilename()
} + " Saw: " + productMakefile);
if (blockType != block.getBlockType()) { continue;
mErrors.WARNING_DUMPCONFIG.add( }
new Position(mFilename, line.getLine()),
"Mismatched 'val' block type."
+ " Expected: " + block.getBlockType()
+ " Saw: " + blockType);
}
// Add the variable to the block in progress final MakeConfig.BlockType blockType = parseBlockType(line, blockTypeString);
block.addVar(varName, new Str(pos, varValue)); if (blockType == null) {
continue;
}
if (blockType != block.getBlockType()) {
mErrors.WARNING_DUMPCONFIG.add(
new Position(mFilename, line.getLine()),
"Mismatched 'val' block type."
+ " Expected: " + block.getBlockType()
+ " Saw: " + blockType);
}
// Add the variable to the block in progress
block.addVar(varName, str);
}
} else { } else {
if (DEBUG) { if (DEBUG) {
System.out.print("# "); System.out.print("# ");

View file

@ -17,7 +17,10 @@
package com.android.build.config; package com.android.build.config;
import java.io.PrintStream; import java.io.PrintStream;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.TreeMap;
public class MakeWriter { public class MakeWriter {
public static final int FLAG_WRITE_HEADER = 1; public static final int FLAG_WRITE_HEADER = 1;
@ -43,6 +46,11 @@ public class MakeWriter {
writeFile(out, config, file); writeFile(out, config, file);
out.println(); out.println();
} }
out.println("---------------------------------------------------------");
out.println("VARIABLES TOUCHED BY MAKE BASED CONFIG:");
out.println("---------------------------------------------------------");
writeStrVars(out, getModifiedVars(config.getInitialVariables(),
config.getFinalVariables()), config);
} }
private void writeFile(PrintStream out, GenericConfig config, GenericConfig.ConfigFile file) { private void writeFile(PrintStream out, GenericConfig config, GenericConfig.ConfigFile file) {
@ -100,4 +108,48 @@ public class MakeWriter {
} }
out.println(); out.println();
} }
private static Map<String, Str> getModifiedVars(Map<String, Str> before,
Map<String, Str> after) {
final HashMap<String, Str> result = new HashMap();
// Entries that were added or changed.
for (Map.Entry<String, Str> afterEntry: after.entrySet()) {
final String varName = afterEntry.getKey();
final Str afterValue = afterEntry.getValue();
final Str beforeValue = before.get(varName);
if (beforeValue == null || !beforeValue.equals(afterValue)) {
result.put(varName, afterValue);
}
}
// removed Entries that were removed, we just treat them as
for (Map.Entry<String, Str> beforeEntry: before.entrySet()) {
final String varName = beforeEntry.getKey();
if (!after.containsKey(varName)) {
result.put(varName, new Str(""));
}
}
return result;
}
private static class Var {
Var(String name, Str val) {
this.name = name;
this.val = val;
}
final String name;
final Str val;
}
private static void writeStrVars(PrintStream out, Map<String, Str> vars, ConfigBase config) {
// Sort by file name and var name
TreeMap<String, Var> sorted = new TreeMap();
for (Map.Entry<String, Str> entry: vars.entrySet()) {
sorted.put(entry.getValue().getPosition().toString() + " " + entry.getKey(),
new Var(entry.getKey(), entry.getValue()));
}
// Print it
for (Var var: sorted.values()) {
out.println(var.val.getPosition() + var.name + " := " + var.val);
}
}
} }