Make it possible to put the Crosstool proto in BUILD files.

This is needed so that Bazel can access Android NDK if it's outside of the workspace. The current limitation is that we Bazel can pretend that there is a BUILD file there, but cannot do the same with a CROSSTOOL file. We could fix that limitation, but given that Crosstool is the only conceivable use case, let's fix it by changing the Blaze-Crosstool interface.

--
MOS_MIGRATED_REVID=95517408
diff --git a/src/main/java/com/google/devtools/build/lib/packages/PackageSerializer.java b/src/main/java/com/google/devtools/build/lib/packages/PackageSerializer.java
index 75067b7..16b318cb 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/PackageSerializer.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/PackageSerializer.java
@@ -19,6 +19,7 @@
 import static com.google.devtools.build.lib.packages.Type.INTEGER;
 import static com.google.devtools.build.lib.packages.Type.INTEGER_LIST;
 import static com.google.devtools.build.lib.packages.Type.LABEL;
+import static com.google.devtools.build.lib.packages.Type.LABEL_DICT_UNARY;
 import static com.google.devtools.build.lib.packages.Type.LABEL_LIST;
 import static com.google.devtools.build.lib.packages.Type.LABEL_LIST_DICT;
 import static com.google.devtools.build.lib.packages.Type.LICENSE;
@@ -252,6 +253,17 @@
           attrPb.addStringListDictValue(entry);
         }
       }
+    } else if (type == LABEL_DICT_UNARY) {
+      for (Object value : values) {
+        Map<String, Label> dict = (Map<String, Label>) value;
+        for (Map.Entry<String, Label> dictEntry : dict.entrySet()) {
+          Build.LabelDictUnaryEntry entry = Build.LabelDictUnaryEntry.newBuilder()
+              .setKey(dictEntry.getKey())
+              .setValue(dictEntry.getValue().toString())
+              .build();
+          attrPb.addLabelDictUnaryValue(entry);
+        }
+      }
     } else if (type == LABEL_LIST_DICT) {
       for (Object value : values) {
         Map<String, List<Label>> dict = (Map<String, List<Label>>) value;
diff --git a/src/main/java/com/google/devtools/build/lib/packages/ProtoUtils.java b/src/main/java/com/google/devtools/build/lib/packages/ProtoUtils.java
index 7b6eaf1..653e283 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/ProtoUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/ProtoUtils.java
@@ -20,6 +20,7 @@
 import static com.google.devtools.build.lib.packages.Type.INTEGER;
 import static com.google.devtools.build.lib.packages.Type.INTEGER_LIST;
 import static com.google.devtools.build.lib.packages.Type.LABEL;
+import static com.google.devtools.build.lib.packages.Type.LABEL_DICT_UNARY;
 import static com.google.devtools.build.lib.packages.Type.LABEL_LIST;
 import static com.google.devtools.build.lib.packages.Type.LABEL_LIST_DICT;
 import static com.google.devtools.build.lib.packages.Type.LICENSE;
@@ -65,6 +66,7 @@
           .put(LICENSE, Discriminator.LICENSE)
           .put(STRING_DICT, Discriminator.STRING_DICT)
           .put(FILESET_ENTRY_LIST, Discriminator.FILESET_ENTRY_LIST)
+          .put(LABEL_DICT_UNARY, Discriminator.LABEL_DICT_UNARY)
           .put(LABEL_LIST_DICT, Discriminator.LABEL_LIST_DICT)
           .put(STRING_LIST_DICT, Discriminator.STRING_LIST_DICT)
           .put(BOOLEAN, Discriminator.BOOLEAN)
diff --git a/src/main/java/com/google/devtools/build/lib/packages/Type.java b/src/main/java/com/google/devtools/build/lib/packages/Type.java
index b1ca03e..9619162 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/Type.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/Type.java
@@ -336,6 +336,11 @@
       DictType.create(STRING, LABEL_LIST);
 
   /**
+   * The type of a dictionary of {@linkplain #LABEL labels}.
+   */
+  public static final DictType<String, Label> LABEL_DICT_UNARY = DictType.create(STRING, LABEL);
+
+  /**
    * The type of a list of {@linkplain #FILESET_ENTRY FilesetEntries}.
    */
   public static final ListType<FilesetEntry> FILESET_ENTRY_LIST = ListType.create(FILESET_ENTRY);
@@ -1003,7 +1008,7 @@
    * Returns whether the specified type is a label type or not.
    */
   public static boolean isLabelType(Type<?> type) {
-    return type == LABEL || type == LABEL_LIST
+    return type == LABEL || type == LABEL_LIST || type == LABEL_DICT_UNARY
         || type == NODEP_LABEL || type == NODEP_LABEL_LIST
         || type == LABEL_LIST_DICT || type == FILESET_ENTRY_LIST;
   }