Loading core/dumpconfig.mk +11 −3 Original line number Diff line number Diff line Loading @@ -79,11 +79,19 @@ endef # $(2): Root nodes to import # $(3): All variable names # $(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)))) \ $(foreach var,$(3), \ $(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 define dump-debug Loading @@ -110,7 +118,7 @@ DUMPCONFIG_SKIP_VARS := \ # Args: # $(1): Makefile that was included # $(2): block (before,import,after) # $(2): block (before,import,after,initial,final) define dump-config-vals $(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))))) \ Loading core/node_fns.mk +3 −2 Original line number Diff line number Diff line Loading @@ -254,13 +254,13 @@ endef # of the default list semantics # define import-nodes $(call dump-phase-start,$(1),$(2),$(3),$(4),build/make/core/node_fns.mk) \ $(if \ $(foreach _in,$(2), \ $(eval _node_import_context := _nic.$(1).[[$(_in)]]) \ $(if $(_include_stack),$(eval $(error ASSERTION FAILED: _include_stack \ should be empty here: $(_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 move-var-list,$(_node_import_context).$(_in),$(1).$(_in),$(3)) \ $(eval _node_import_context :=) \ Loading @@ -268,5 +268,6 @@ $(if \ $(if $(_include_stack),$(eval $(error ASSERTION FAILED: _include_stack \ should be empty here: $(_include_stack))),) \ ) \ ,) ,) \ $(call dump-phase-end,build/make/core/node_fns.mk) endef tools/product_config/src/com/android/build/config/ConfigBase.java +28 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.build.config; import java.io.PrintStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TreeMap; Loading @@ -29,6 +30,17 @@ public class ConfigBase { protected String mPhase; 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. */ Loading Loading @@ -80,6 +92,20 @@ public class ConfigBase { 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. */ Loading @@ -89,5 +115,7 @@ public class ConfigBase { for (Map.Entry<String, ConfigBase.VarType> entry: that.getProductVars().entrySet()) { addProductVar(entry.getKey(), entry.getValue()); } mInitialVariables = new HashMap(that.getInitialVariables()); mFinalVariables = new HashMap(that.getFinalVariables()); } } tools/product_config/src/com/android/build/config/DumpConfigParser.java +35 −25 Original line number Diff line number Diff line Loading @@ -54,10 +54,6 @@ public class DumpConfigParser { private static final Pattern LIST_SEPARATOR = Pattern.compile("\\s+"); public class BuildPhase { } /** * Constructor. */ Loading Loading @@ -120,6 +116,8 @@ public class DumpConfigParser { MakeConfig makeConfig = new MakeConfig(); MakeConfig.ConfigFile configFile = new MakeConfig.ConfigFile("<ignored>"); 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. for (; index < lineCount; index++) { Loading @@ -128,10 +126,13 @@ public class DumpConfigParser { final String lineType = fields.get(0); if (matchLineType(line, "phase", 2)) { // Start the new one makeConfig = new MakeConfig(); makeConfig.setPhase(fields.get(1)); makeConfig.setRootNodes(splitList(fields.get(2))); mResults.add(makeConfig); initialVariables = makeConfig.getInitialVariables(); finalVariables = makeConfig.getFinalVariables(); if (DEBUG) { System.out.println("PHASE:"); Loading Loading @@ -216,11 +217,17 @@ public class DumpConfigParser { } } else if (matchLineType(line, "val", 5)) { 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 varValue = fields.get(4); final Position pos = Position.parse(fields.get(5)); final Str str = new Str(pos, varValue); if (blockTypeString.equals("initial")) { initialVariables.put(varName, str); } else if (blockTypeString.equals("final")) { finalVariables.put(varName, str); } else { if (!productMakefile.equals(configFile.getFilename())) { mErrors.WARNING_DUMPCONFIG.add( new Position(mFilename, line.getLine()), Loading @@ -229,6 +236,8 @@ public class DumpConfigParser { + " Saw: " + productMakefile); continue; } final MakeConfig.BlockType blockType = parseBlockType(line, blockTypeString); if (blockType == null) { continue; } Loading @@ -241,7 +250,8 @@ public class DumpConfigParser { } // Add the variable to the block in progress block.addVar(varName, new Str(pos, varValue)); block.addVar(varName, str); } } else { if (DEBUG) { System.out.print("# "); Loading tools/product_config/src/com/android/build/config/MakeWriter.java +52 −0 Original line number Diff line number Diff line Loading @@ -17,7 +17,10 @@ package com.android.build.config; import java.io.PrintStream; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TreeMap; public class MakeWriter { public static final int FLAG_WRITE_HEADER = 1; Loading @@ -43,6 +46,11 @@ public class MakeWriter { writeFile(out, config, file); 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) { Loading Loading @@ -100,4 +108,48 @@ public class MakeWriter { } 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); } } } Loading
core/dumpconfig.mk +11 −3 Original line number Diff line number Diff line Loading @@ -79,11 +79,19 @@ endef # $(2): Root nodes to import # $(3): All variable names # $(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)))) \ $(foreach var,$(3), \ $(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 define dump-debug Loading @@ -110,7 +118,7 @@ DUMPCONFIG_SKIP_VARS := \ # Args: # $(1): Makefile that was included # $(2): block (before,import,after) # $(2): block (before,import,after,initial,final) define dump-config-vals $(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))))) \ Loading
core/node_fns.mk +3 −2 Original line number Diff line number Diff line Loading @@ -254,13 +254,13 @@ endef # of the default list semantics # define import-nodes $(call dump-phase-start,$(1),$(2),$(3),$(4),build/make/core/node_fns.mk) \ $(if \ $(foreach _in,$(2), \ $(eval _node_import_context := _nic.$(1).[[$(_in)]]) \ $(if $(_include_stack),$(eval $(error ASSERTION FAILED: _include_stack \ should be empty here: $(_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 move-var-list,$(_node_import_context).$(_in),$(1).$(_in),$(3)) \ $(eval _node_import_context :=) \ Loading @@ -268,5 +268,6 @@ $(if \ $(if $(_include_stack),$(eval $(error ASSERTION FAILED: _include_stack \ should be empty here: $(_include_stack))),) \ ) \ ,) ,) \ $(call dump-phase-end,build/make/core/node_fns.mk) endef
tools/product_config/src/com/android/build/config/ConfigBase.java +28 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.build.config; import java.io.PrintStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TreeMap; Loading @@ -29,6 +30,17 @@ public class ConfigBase { protected String mPhase; 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. */ Loading Loading @@ -80,6 +92,20 @@ public class ConfigBase { 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. */ Loading @@ -89,5 +115,7 @@ public class ConfigBase { for (Map.Entry<String, ConfigBase.VarType> entry: that.getProductVars().entrySet()) { addProductVar(entry.getKey(), entry.getValue()); } mInitialVariables = new HashMap(that.getInitialVariables()); mFinalVariables = new HashMap(that.getFinalVariables()); } }
tools/product_config/src/com/android/build/config/DumpConfigParser.java +35 −25 Original line number Diff line number Diff line Loading @@ -54,10 +54,6 @@ public class DumpConfigParser { private static final Pattern LIST_SEPARATOR = Pattern.compile("\\s+"); public class BuildPhase { } /** * Constructor. */ Loading Loading @@ -120,6 +116,8 @@ public class DumpConfigParser { MakeConfig makeConfig = new MakeConfig(); MakeConfig.ConfigFile configFile = new MakeConfig.ConfigFile("<ignored>"); 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. for (; index < lineCount; index++) { Loading @@ -128,10 +126,13 @@ public class DumpConfigParser { final String lineType = fields.get(0); if (matchLineType(line, "phase", 2)) { // Start the new one makeConfig = new MakeConfig(); makeConfig.setPhase(fields.get(1)); makeConfig.setRootNodes(splitList(fields.get(2))); mResults.add(makeConfig); initialVariables = makeConfig.getInitialVariables(); finalVariables = makeConfig.getFinalVariables(); if (DEBUG) { System.out.println("PHASE:"); Loading Loading @@ -216,11 +217,17 @@ public class DumpConfigParser { } } else if (matchLineType(line, "val", 5)) { 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 varValue = fields.get(4); final Position pos = Position.parse(fields.get(5)); final Str str = new Str(pos, varValue); if (blockTypeString.equals("initial")) { initialVariables.put(varName, str); } else if (blockTypeString.equals("final")) { finalVariables.put(varName, str); } else { if (!productMakefile.equals(configFile.getFilename())) { mErrors.WARNING_DUMPCONFIG.add( new Position(mFilename, line.getLine()), Loading @@ -229,6 +236,8 @@ public class DumpConfigParser { + " Saw: " + productMakefile); continue; } final MakeConfig.BlockType blockType = parseBlockType(line, blockTypeString); if (blockType == null) { continue; } Loading @@ -241,7 +250,8 @@ public class DumpConfigParser { } // Add the variable to the block in progress block.addVar(varName, new Str(pos, varValue)); block.addVar(varName, str); } } else { if (DEBUG) { System.out.print("# "); Loading
tools/product_config/src/com/android/build/config/MakeWriter.java +52 −0 Original line number Diff line number Diff line Loading @@ -17,7 +17,10 @@ package com.android.build.config; import java.io.PrintStream; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TreeMap; public class MakeWriter { public static final int FLAG_WRITE_HEADER = 1; Loading @@ -43,6 +46,11 @@ public class MakeWriter { writeFile(out, config, file); 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) { Loading Loading @@ -100,4 +108,48 @@ public class MakeWriter { } 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); } } }