auto import from //branches/cupcake/...@132569
diff --git a/buildspec.mk.default b/buildspec.mk.default
index bf4d111..0f75f31 100644
--- a/buildspec.mk.default
+++ b/buildspec.mk.default
@@ -65,6 +65,14 @@
 #CUSTOM_MODULES:=
 endif
 
+# Choose additional locales, like "en_US" or "it_IT", to add to any
+# built product.  Any locales that appear in CUSTOM_LOCALES but not in
+# the locale list for the selected product will be added to the end
+# of PRODUCT_LOCALES.
+ifndef CUSTOM_LOCALES
+#CUSTOM_LOCALES:=
+endif
+
 # If you have a special place to put your ouput files, set this, otherwise
 # it goes to <build-root>/out
 #OUT_DIR:=/tmp/stuff
diff --git a/core/Makefile b/core/Makefile
index bb18c4b..2983628 100644
--- a/core/Makefile
+++ b/core/Makefile
@@ -198,20 +198,6 @@
 apkcerts-list: $(APKCERTS_FILE)
 
 # -----------------------------------------------------------------
-# installed file list
-INSTALLED_FILES_FILE := $(PRODUCT_OUT)/installed-files.txt
-$(INSTALLED_FILES_FILE): $(ALL_DEFAULT_INSTALLED_MODULES)
-	@echo Installed file list: $@
-	@mkdir -p $(dir $@)
-	@rm -f $@
-	$(hide) (cd $(PRODUCT_OUT) && \
-	         find system data -type f -printf 'name="%p" size=%s\n') | \
-		sort > $@
-
-.PHONY: installed-file-list
-installed-file-list: $(INSTALLED_FILES_FILE)
-
-# -----------------------------------------------------------------
 # module info file
 ifdef CREATE_MODULE_INFO_FILE
   MODULE_INFO_FILE := $(PRODUCT_OUT)/module-info.txt
@@ -901,6 +887,20 @@
 target-files-package: $(BUILT_TARGET_FILES_PACKAGE)
 
 # -----------------------------------------------------------------
+# installed file list
+# Depending on $(INSTALLED_SYSTEMIMAGE) ensures that it
+# gets the DexOpt one if we're doing that.
+INSTALLED_FILES_FILE := $(PRODUCT_OUT)/installed-files.txt
+$(INSTALLED_FILES_FILE): $(INSTALLED_SYSTEMIMAGE)
+	@echo Installed file list: $@
+	@mkdir -p $(dir $@)
+	@rm -f $@
+	$(hide) build/tools/fileslist.py $(TARGET_OUT) $(TARGET_OUT_DATA) > $@
+
+.PHONY: installed-file-list
+installed-file-list: $(INSTALLED_FILES_FILE)
+
+# -----------------------------------------------------------------
 # A zip of the tests that are built when running "make tests".
 # This is very similar to BUILT_TARGET_FILES_PACKAGE, but we
 # only grab SYSTEM and DATA, and it's called "*-tests-*.zip".
diff --git a/core/cleanbuild.mk b/core/cleanbuild.mk
index 0b292bf..01bf9a5 100644
--- a/core/cleanbuild.mk
+++ b/core/cleanbuild.mk
@@ -104,8 +104,14 @@
   # Don't bother with this extra part when explicitly building the sdk product.
   building_sdk :=
 endif
-current_build_config := $(TARGET_PRODUCT)-$(TARGET_BUILD_VARIANT)$(building_sdk)
+
+# A change in the list of locales warrants an installclean, too.
+locale_list := $(subst $(space),$(comma),$(strip $(PRODUCT_LOCALES)))
+
+current_build_config := \
+    $(TARGET_PRODUCT)-$(TARGET_BUILD_VARIANT)$(building_sdk)-{$(locale_list)}
 building_sdk :=
+locale_list :=
 force_installclean := false
 
 # Read the current state from the file, if present.
diff --git a/core/combo/darwin-x86.mk b/core/combo/darwin-x86.mk
index cc6a895..2150960 100644
--- a/core/combo/darwin-x86.mk
+++ b/core/combo/darwin-x86.mk
@@ -93,9 +93,5 @@
 stat -f "%z" $(1)
 endef
 
-# Which gcc to use to build qemu, which doesn't work right when
-# built with 4.2.1 or later.
-GCCQEMU := prebuilt/darwin-x86/toolchain/i686-apple-darwin8-4.0.1/bin/gcc
-
 endif
 
diff --git a/core/combo/linux-x86.mk b/core/combo/linux-x86.mk
index 2c729ad..372c63e 100644
--- a/core/combo/linux-x86.mk
+++ b/core/combo/linux-x86.mk
@@ -12,12 +12,7 @@
 define get-file-size
 stat --format "%s" "$(1)"
 endef
-
-# Which gcc to use to build qemu, which doesn't work right when
-# built with 4.2.1 or later.
-GCCQEMU := prebuilt/linux-x86/toolchain/i686-linux-gnu-3.4.6/bin/gcc
-endif # _HOST
-
+endif
 
 # On the sim, we build the "host" tools in 64 bit iff the compiler
 # does it for us automatically.  In other words, that means on 64 bit
diff --git a/core/main.mk b/core/main.mk
index 1ea13ac..1369944 100644
--- a/core/main.mk
+++ b/core/main.mk
@@ -575,7 +575,8 @@
 	$(INSTALLED_BOOTIMAGE_TARGET) \
 	$(INSTALLED_RECOVERYIMAGE_TARGET) \
 	$(INSTALLED_USERDATAIMAGE_TARGET) \
-	$(INTERNAL_DEFAULT_DOCS_TARGETS)
+	$(INTERNAL_DEFAULT_DOCS_TARGETS) \
+	$(INSTALLED_FILES_FILE)
 
 # The actual files built by the droidcore target changes depending
 # on the build variant.
diff --git a/core/product_config.mk b/core/product_config.mk
index a9021cc..93671f4 100644
--- a/core/product_config.mk
+++ b/core/product_config.mk
@@ -149,6 +149,15 @@
 PRODUCT_LOCALES := $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_LOCALES))
 # TODO: also keep track of things like "port", "land" in product files.
 
+# If CUSTOM_LOCALES contains any locales not already included
+# in PRODUCT_LOCALES, add them to PRODUCT_LOCALES.
+extra_locales := $(filter-out $(PRODUCT_LOCALES),$(CUSTOM_LOCALES))
+ifneq (,$(extra_locales))
+  $(info Adding CUSTOM_LOCALES [$(extra_locales)] to PRODUCT_LOCALES [$(PRODUCT_LOCALES)])
+  PRODUCT_LOCALES += $(extra_locales)
+  extra_locales :=
+endif
+
 # Assemble the list of options.
 PRODUCT_AAPT_CONFIG := $(PRODUCT_LOCALES)
 
diff --git a/tools/check_builds.sh b/tools/check_builds.sh
new file mode 100755
index 0000000..14dfec6
--- /dev/null
+++ b/tools/check_builds.sh
@@ -0,0 +1,67 @@
+# Copyright (C) 2009 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the 'License');
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an 'AS IS' BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#
+# Usage:
+#
+# Source this file into your environment.  Then:
+#
+#    $ golden_builds sdk-sdk generic-eng generic-userdebug dream-eng
+# 
+# will build a set of combos.  This might take a while.  Then you can
+# go make changes, and run:
+#
+#    $ check_builds sdk-sdk generic-eng generic-userdebug dream-eng
+#
+# Go get dinner, and when you get back, there will be a file
+# test-builds/sizes.html that has a pretty chart of which files are
+# in which tree, and how big they are.  In that chart, cells for files
+# that are missing are red, and rows where the file sizes are not all
+# the same will be blue.
+#
+
+TEST_BUILD_DIR=test-builds
+
+function do_builds
+{
+    PREFIX=$1
+    shift
+    while [ -n "$1" ]
+    do
+        rm -rf $TEST_BUILD_DIR/$PREFIX-$1
+        make -j6 PRODUCT-$1 dist DIST_DIR=$TEST_BUILD_DIR/$PREFIX-$1
+        if [ $? -ne 0 ] ; then
+            echo FAILED
+            return
+        fi
+        shift
+    done
+}
+
+function golden_builds
+{
+    rm -rf $TEST_BUILD_DIR/golden-* $TEST_BUILD_DIR/dist-*
+    do_builds golden "$@"
+}
+
+function check_builds
+{
+    rm -rf $TEST_BUILD_DIR/dist-*
+    do_builds dist "$@"
+    build/tools/compare_fileslist.py \
+            $TEST_BUILD_DIR/golden-*/installed-files.txt \
+            $TEST_BUILD_DIR/dist-*/installed-files.txt \
+        > $TEST_BUILD_DIR/sizes.html
+}
+
diff --git a/tools/compare_fileslist.py b/tools/compare_fileslist.py
new file mode 100755
index 0000000..1f507d8
--- /dev/null
+++ b/tools/compare_fileslist.py
@@ -0,0 +1,106 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2009 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the 'License');
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an 'AS IS' BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+import cgi, os, string, sys
+
+def IsDifferent(row):
+  val = None
+  for v in row:
+    if v:
+      if not val:
+        val = v
+      else:
+        if val != v:
+          return True
+  return False
+
+def main(argv):
+  inputs = argv[1:]
+  data = {}
+  index = 0
+  for input in inputs:
+    f = file(input, "r")
+    lines = f.readlines()
+    f.close()
+    lines = map(string.split, lines)
+    lines = map(lambda (x,y): (y,int(x)), lines)
+    for fn,sz in lines:
+      if not data.has_key(fn):
+        data[fn] = {}
+      data[fn][index] = sz
+    index = index + 1
+  rows = []
+  for fn,sizes in data.iteritems():
+    row = [fn]
+    for i in range(0,index):
+      if sizes.has_key(i):
+        row.append(sizes[i])
+      else:
+        row.append(None)
+    rows.append(row)
+  rows = sorted(rows, key=lambda x: x[0])
+  print """<html>
+    <head>
+      <style type="text/css">
+        .fn, .sz, .z, .d {
+          padding-left: 10px;
+          padding-right: 10px;
+        }
+        .sz, .z, .d {
+          text-align: right;
+        }
+        .fn {
+          background-color: #ffffdd;
+        }
+        .sz {
+          background-color: #ffffcc;
+        }
+        .z {
+          background-color: #ffcccc;
+        }
+        .d {
+          background-color: #99ccff;
+        }
+      </style>
+    </head>
+    <body>
+  """
+  print "<table>"
+  print "<tr>"
+  for input in inputs:
+    combo = input.split(os.path.sep)[1]
+    print "  <td class='fn'>%s</td>" % cgi.escape(combo)
+  print "</tr>"
+
+  for row in rows:
+    print "<tr>"
+    for sz in row[1:]:
+      if not sz:
+        print "  <td class='z'>&nbsp;</td>"
+      elif IsDifferent(row[1:]):
+        print "  <td class='d'>%d</td>" % sz
+      else:
+        print "  <td class='sz'>%d</td>" % sz
+    print "  <td class='fn'>%s</td>" % cgi.escape(row[0])
+    print "</tr>"
+  print "</table>"
+  print "</body></html>"
+
+if __name__ == '__main__':
+  main(sys.argv)
+
+
diff --git a/tools/fileslist.py b/tools/fileslist.py
new file mode 100755
index 0000000..ae105e6
--- /dev/null
+++ b/tools/fileslist.py
@@ -0,0 +1,41 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2009 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the 'License');
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an 'AS IS' BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+import os, sys
+
+def main(argv):
+  output = []
+  roots = argv[1:]
+  for root in roots:
+    base = len(root[:root.rfind(os.path.sep)])
+    for dir, dirs, files in os.walk(root):
+      relative = dir[base:]
+      for f in files:
+        try:
+          row = (
+              os.path.getsize(os.path.sep.join((dir, f))),
+              os.path.sep.join((relative, f)),
+            )
+          output.append(row)
+        except os.error:
+          pass
+  for row in output:
+    print "%12d  %s" % row
+
+if __name__ == '__main__':
+  main(sys.argv)
+