Generate common_custom_types__type_mappings on build time.
am: efb5eadb43

Change-Id: I0f353d1446be8c880d068d47ca3066c6c4e19786
diff --git a/Android.bp b/Android.bp
index b4bb28f..f105753 100644
--- a/Android.bp
+++ b/Android.bp
@@ -691,6 +691,38 @@
     host_supported: true,
 }
 
+python_binary_host {
+    name: "mojom_generate_type_mappings",
+    main: "libchrome_tools/mojom_generate_type_mappings.py",
+    srcs: [
+        "build/gn_helpers.py",
+        "libchrome_tools/mojom_generate_type_mappings.py",
+        "mojo/public/tools/bindings/generate_type_mappings.py",
+    ],
+    defaults: ["libmojo_scripts"],
+}
+
+genrule {
+    name: "libmojo_common_custom_types__type_mappings",
+    cmd: "$(location mojom_generate_type_mappings)" +
+    "    --output=$(out)" +
+    "    $(in)",
+
+    tools: ["mojom_generate_type_mappings"],
+
+    srcs: [
+        "mojo/common/file.typemap",
+        "mojo/common/file_path.typemap",
+        "mojo/common/string16.typemap",
+        "mojo/common/text_direction.typemap",
+        "mojo/common/time.typemap",
+        "mojo/common/unguessable_token.typemap",
+        "mojo/common/values.typemap",
+        "mojo/common/version.typemap",
+    ],
+    out: ["common_custom_types__type_mappings"],
+}
+
 genrule {
     name: "libmojo_mojom_headers",
     cmd: "$(location mojom_source_generator_sh)" +
@@ -698,7 +730,7 @@
     "    --package=external/libchrome" +
     "    --output_dir=$(genDir)" +
     "    --bytecode_path=$(genDir)" +
-    "    --typemap=$(location gen/mojo/common/common_custom_types__type_mappings)" +
+    "    --typemap=$(location common_custom_types__type_mappings)" +
     "    --generators=c++" +
     "    --use_new_wrapper_types" +
     "    $(in)",
@@ -708,11 +740,7 @@
         "mojom_source_generator_sh",
     ],
 
-    tool_files: [
-        // This file was copied from out/Release in a Chrome checkout.
-        // TODO(lhchavez): Generate this file instead of hardcoding it.
-        "gen/mojo/common/common_custom_types__type_mappings",
-    ],
+    tool_files: [":libmojo_common_custom_types__type_mappings"],
 
     srcs: [":libmojo_mojom_files"],
 
@@ -766,7 +794,7 @@
     "    --package=external/libchrome" +
     "    --output_dir=$(genDir)" +
     "    --bytecode_path=$(genDir)" +
-    "    --typemap=$(location gen/mojo/common/common_custom_types__type_mappings)" +
+    "    --typemap=$(location common_custom_types__type_mappings)" +
     "    --generators=c++" +
     "    --use_new_wrapper_types" +
     "    $(in)",
@@ -776,12 +804,7 @@
         "mojom_source_generator_sh",
     ],
 
-    tool_files: [
-        // This file was copied from out/Release in a Chrome checkout.
-        // TODO(lhchavez): Generate this file instead of hardcoding it.
-        "gen/mojo/common/common_custom_types__type_mappings",
-        "libchrome_tools/mojom_source_generator.sh",
-    ],
+    tool_files: [":libmojo_common_custom_types__type_mappings"],
 
     srcs: [":libmojo_mojom_files"],
 
@@ -920,7 +943,7 @@
     "    --package=external/libchrome" +
     "    --output_dir=$(genDir)" +
     "    --bytecode_path=$(genDir)" +
-    "    --typemap=$(location gen/mojo/common/common_custom_types__type_mappings)" +
+    "    --typemap=$(location common_custom_types__type_mappings)" +
     "    --generators=java" +
     "    --use_new_wrapper_types" +
     "    $(in)",
@@ -930,11 +953,7 @@
         "mojom_source_generator_sh",
     ],
 
-    tool_files: [
-        // This file was copied from out/Release in a Chrome checkout.
-        // TODO(lhchavez): Generate this file instead of hardcoding it.
-        "gen/mojo/common/common_custom_types__type_mappings",
-    ],
+    tool_files: [":libmojo_common_custom_types__type_mappings"],
 
     srcs: [":libmojo_mojom_files"],
 
diff --git a/libchrome_tools/mojom_generate_type_mappings.py b/libchrome_tools/mojom_generate_type_mappings.py
new file mode 100644
index 0000000..0c8023c
--- /dev/null
+++ b/libchrome_tools/mojom_generate_type_mappings.py
@@ -0,0 +1,93 @@
+#!/usr/bin/python
+
+# Copyright (C) 2018 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.
+
+"""Drives mojom typemapping generator.
+
+Usage:
+
+% python libchrome_tools/mojom_generate_type_mappings.py \
+      --output ${output_type_mapping_file_path} \
+      ${list of .typemap files}
+"""
+
+import argparse
+import os
+import subprocess
+import sys
+
+from build import gn_helpers
+
+_GENERATE_TYPE_MAPPINGS_PATH = os.path.join(
+    os.path.dirname(__file__),
+    '../mojo/public/tools/bindings/generate_type_mappings.py')
+
+def _read_typemap_config(path):
+  """Reads .typemap file.
+
+  Args:
+    path: File path to the .typemap location.
+
+  Returns:
+    A dictionary holding values in .typemap file.
+  """
+
+  with open(path) as f:
+    # gn_helpers does not handle comment lines.
+    content = [line for line in f if not line.strip().startswith('#')]
+  return gn_helpers.FromGNArgs(''.join(content))
+
+
+def _generate_type_mappings(input_paths, output):
+  """Generates __type_mappings file from given .typemap files.
+
+  Builds a command line to run generate_type_mappings.py, and executes it.
+
+  Args:
+    input_paths: a list of file paths for .typemap files.
+    output: a path to output __type_mappings file.
+  """
+  command = [sys.executable, _GENERATE_TYPE_MAPPINGS_PATH, '--output', output]
+
+  # TODO(hidehiko): Add dependency handling.
+
+  for path in input_paths:
+    typemap_config = _read_typemap_config(path)
+    command.append('--start-typemap')
+    for public_header in typemap_config.get('public_headers', []):
+      command.append('public_headers=' + public_header)
+    for traits_header in typemap_config.get('traits_headers', []):
+      command.append('traits_headers=' + traits_header)
+    for type_mapping in typemap_config.get('type_mappings', []):
+      command.append('type_mappings=' + type_mapping)
+
+  subprocess.check_call(command)
+
+
+def _parse_args():
+  parser = argparse.ArgumentParser()
+  parser.add_argument('--output', help='Output file path')
+  parser.add_argument('input_paths', metavar="INPUT-PATH", nargs='+',
+                      help='Input typemap files.')
+  return parser.parse_args()
+
+
+def main():
+  args = _parse_args()
+  _generate_type_mappings(args.input_paths, args.output)
+
+
+if __name__ == '__main__':
+  main()