Fix event-log-tags so we don't rebuild framework.jar because of an installclean.

Produce an event logs tag file for everything we know about, in order
to properly allocate numbers.  Then produce a file that's filtered
for what's going to be installed.

Change-Id: Id0778aec0b4d045e8ff91ba2c9c8265e860eaba5
diff --git a/core/Makefile b/core/Makefile
index 2293593..54a596c 100644
--- a/core/Makefile
+++ b/core/Makefile
@@ -252,8 +252,23 @@
 
 .PHONY: event-log-tags
 
+# Produce an event logs tag file for everything we know about, in order
+# to properly allocate numbers.  Then produce a file that's filtered
+# for what's going to be installed.
+
+all_event_log_tags_file := $(TARGET_OUT_COMMON_INTERMEDIATES)/all-event-log-tags.txt
+
+# Include tags from all packages that we know about
+all_event_log_tags_src := \
+    $(sort $(foreach m, $(ALL_MODULES), $(ALL_MODULES.$(m).EVENT_LOG_TAGS)))
+
+$(all_event_log_tags_file): PRIVATE_SRC_FILES := $(all_event_log_tags_src)
+$(all_event_log_tags_file): $(all_event_log_tags_src)
+	$(hide) mkdir -p $(dir $@)
+	$(hide) build/tools/merge-event-log-tags.py -o $@ $(PRIVATE_SRC_FILES)
+
+
 event_log_tags_file := $(TARGET_OUT)/etc/event-log-tags
-ALL_PREBUILT += $(event_log_tag_file)
 
 # Include tags from all packages included in this product.
 event_log_tags_src := \
@@ -263,14 +278,16 @@
       $(ALL_MODULES.$(m).EVENT_LOG_TAGS)))
 
 $(event_log_tags_file): PRIVATE_SRC_FILES := $(event_log_tags_src)
-$(event_log_tags_file): $(event_log_tags_src)
+$(event_log_tags_file): PRIVATE_MERGED_FILE := $(all_event_log_tags_file)
+$(event_log_tags_file): $(event_log_tags_src) $(all_event_log_tags_file)
 	$(hide) mkdir -p $(dir $@)
-	$(hide) build/tools/merge-event-log-tags.py -o $@ $(PRIVATE_SRC_FILES)
+	$(hide) build/tools/merge-event-log-tags.py -o $@ -m $(PRIVATE_MERGED_FILE) $(PRIVATE_SRC_FILES)
 
 event-log-tags: $(event_log_tags_file)
 
 ALL_DEFAULT_INSTALLED_MODULES += $(event_log_tags_file)
 
+
 ifneq ($(TARGET_SIMULATOR),true)
 
 # #################################################################
diff --git a/core/base_rules.mk b/core/base_rules.mk
index 8832311..5a40693 100644
--- a/core/base_rules.mk
+++ b/core/base_rules.mk
@@ -222,7 +222,7 @@
 logtags_java_sources := $(patsubst %.logtags,%.java,$(addprefix $(intermediates.COMMON)/src/, $(logtags_sources)))
 logtags_sources := $(addprefix $(TOP_DIR)$(LOCAL_PATH)/, $(logtags_sources))
 
-$(logtags_java_sources): $(intermediates.COMMON)/src/%.java: $(TOPDIR)$(LOCAL_PATH)/%.logtags $(TARGET_OUT)/etc/event-log-tags
+$(logtags_java_sources): $(intermediates.COMMON)/src/%.java: $(TOPDIR)$(LOCAL_PATH)/%.logtags $(TARGET_OUT_COMMON_INTERMEDIATES)/all-event-log-tags.txt
 	$(transform-logtags-to-java)
 
 endif
diff --git a/tools/merge-event-log-tags.py b/tools/merge-event-log-tags.py
index df9ebce..bddda90 100755
--- a/tools/merge-event-log-tags.py
+++ b/tools/merge-event-log-tags.py
@@ -36,6 +36,7 @@
 warnings = []
 
 output_file = None
+pre_merged_file = None
 
 # Tags with a tag number of ? are assigned a tag in the range
 # [ASSIGN_START, ASSIGN_LIMIT).
@@ -43,7 +44,7 @@
 ASSIGN_LIMIT = 1000000
 
 try:
-  opts, args = getopt.getopt(sys.argv[1:], "ho:")
+  opts, args = getopt.getopt(sys.argv[1:], "ho:m:")
 except getopt.GetoptError, err:
   print str(err)
   print __doc__
@@ -55,6 +56,8 @@
     sys.exit(2)
   elif o == "-o":
     output_file = a
+  elif o == "-m":
+    pre_merged_file = a
   else:
     print >> sys.stderr, "unhandled option %s" % (o,)
     sys.exit(1)
@@ -71,6 +74,11 @@
 by_tagname = {}
 by_tagnum = {}
 
+pre_merged_tags = {}
+if pre_merged_file:
+  for t in event_log_tags.TagFile(pre_merged_file).tags:
+    pre_merged_tags[t.tagname] = t
+
 for fn in args:
   tagfile = event_log_tags.TagFile(fn)
 
@@ -140,15 +148,26 @@
 # assigned.  We do this based on a hash of the tag name so that the
 # numbers should stay relatively stable as tags are added.
 
+# If we were provided pre-merged tags (w/ the -m option), then don't
+# ever try to allocate one, just fail if we don't have a number
+
 for name, t in sorted(by_tagname.iteritems()):
   if t.tagnum is None:
-    while True:
-      x = (hashname(name) % (ASSIGN_LIMIT - ASSIGN_START - 1)) + ASSIGN_START
-      if x not in by_tagnum:
-        t.tagnum = x
-        by_tagnum[x] = t
-        break
-      name = "_" + name
+    if pre_merged_tags:
+      try:
+        t.tagnum = pre_merged_tags[t.tagname]
+      except KeyError:
+        print >> sys.stderr, ("Error: Tag number not defined for tag `%s'."
+            +" Have you done a full build?") % t.tagname
+        sys.exit(1)
+    else:
+      while True:
+        x = (hashname(name) % (ASSIGN_LIMIT - ASSIGN_START - 1)) + ASSIGN_START
+        if x not in by_tagnum:
+          t.tagnum = x
+          by_tagnum[x] = t
+          break
+        name = "_" + name
 
 # by_tagnum should be complete now; we've assigned numbers to all tags.