aboutsummaryrefslogtreecommitdiffhomepage
path: root/tools/j2objc
diff options
context:
space:
mode:
authorGravatar Michael Thvedt <mthvedt@google.com>2015-08-12 17:45:36 +0000
committerGravatar Florian Weikert <fwe@google.com>2015-08-13 14:01:22 +0000
commit828a4bee6007849c51c56ff0f17040f036ddae38 (patch)
tree1fcd28f1877424637f9ba1770ec5c016b2aee34e /tools/j2objc
parent9d513cab93f03856c5e7ccdd38dbf864f7c5be00 (diff)
Move j2objc helper scripts into open-source Bazel.
-- MOS_MIGRATED_REVID=100490916
Diffstat (limited to 'tools/j2objc')
-rw-r--r--tools/j2objc/BUILD13
-rwxr-xr-xtools/j2objc/j2objc_wrapper.py163
2 files changed, 176 insertions, 0 deletions
diff --git a/tools/j2objc/BUILD b/tools/j2objc/BUILD
new file mode 100644
index 0000000000..b0f68cced8
--- /dev/null
+++ b/tools/j2objc/BUILD
@@ -0,0 +1,13 @@
+package(default_visibility = ["//visibility:public"])
+
+exports_files(glob(["**"]))
+
+filegroup(
+ name = "srcs",
+ srcs = glob(["**"]),
+)
+
+py_library(
+ name = "j2objc_wrapper",
+ srcs = ["j2objc_wrapper.py"],
+)
diff --git a/tools/j2objc/j2objc_wrapper.py b/tools/j2objc/j2objc_wrapper.py
new file mode 100755
index 0000000000..c3e5778437
--- /dev/null
+++ b/tools/j2objc/j2objc_wrapper.py
@@ -0,0 +1,163 @@
+#!/usr/bin/python2.7
+
+# Copyright 2015 Google Inc. All rights reserved.
+#
+# 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.
+
+"""A wrapper script for J2ObjC transpiler.
+
+This script wraps around J2ObjC transpiler to also output a dependency mapping
+file by scanning the import and include directives of the J2ObjC-translated
+files.
+"""
+
+import argparse
+import multiprocessing
+import os
+import Queue
+import re
+import subprocess
+import threading
+
+INCLUDE_RE = re.compile('#(include|import) "([^"]+)"')
+
+
+def RunJ2ObjC(java, jvm_flags, j2objc, main_class, flags):
+ """Runs J2ObjC transpiler to translate Java source files to ObjC.
+
+ Args:
+ java: The path of the Java executable.
+ jvm_flags: A comma-separated list of flags to pass to JVM.
+ j2objc: The deploy jar of J2ObjC.
+ main_class: The J2ObjC main class to invoke.
+ flags: A list of flags to pass to J2ObjC transpiler.
+ Returns:
+ None.
+ """
+ j2objc_args = [java]
+ j2objc_args.extend(filter(None, jvm_flags.split(',')))
+ j2objc_args.extend(['-cp', j2objc, main_class])
+ j2objc_args.extend(flags)
+
+ subprocess.check_call(j2objc_args, stderr=subprocess.STDOUT)
+
+
+def WriteDepMappingFile(translated_source_files,
+ objc_file_path,
+ output_dependency_mapping_file,
+ file_open=open):
+ """Scans J2ObjC-translated files and outputs a dependency mapping file.
+
+ The mapping file contains mappings between translated source files and their
+ imported source files scanned from the import and include directives.
+
+ Args:
+ translated_source_files: A comma-separated list of files translated by
+ J2ObjC.
+ objc_file_path: The file path which represents a directory where the
+ generated ObjC files reside.
+ output_dependency_mapping_file: The path of the dependency mapping file to
+ write to.
+ file_open: Reference to the builtin open function so it may be
+ overridden for testing.
+ Returns:
+ None.
+ """
+ dep_mapping = dict()
+ input_file_queue = Queue.Queue()
+ output_dep_mapping_queue = Queue.Queue()
+ for output_file in translated_source_files.split(','):
+ input_file_queue.put(output_file)
+
+ for _ in xrange(multiprocessing.cpu_count()):
+ t = threading.Thread(target=_ReadDepMapping, args=(input_file_queue,
+ output_dep_mapping_queue,
+ objc_file_path,
+ file_open))
+ t.start()
+
+ input_file_queue.join()
+
+ while not output_dep_mapping_queue.empty():
+ entry_file, deps = output_dep_mapping_queue.get()
+ dep_mapping[entry_file] = deps
+
+ f = file_open(output_dependency_mapping_file, 'w')
+ for entry in sorted(dep_mapping):
+ for dep in dep_mapping[entry]:
+ f.write(entry + ':' + dep + '\n')
+ f.close()
+
+
+def _ReadDepMapping(input_file_queue, output_dep_mapping_queue, objc_file_path,
+ file_open=open):
+ while True:
+ try:
+ input_file = input_file_queue.get_nowait()
+ except Queue.Empty:
+ return
+ deps = []
+ entry = os.path.relpath(os.path.splitext(input_file)[0], objc_file_path)
+ with file_open(input_file, 'r') as f:
+ for line in f:
+ include = INCLUDE_RE.match(line)
+ if include:
+ include_path = include.group(2)
+ dep = os.path.splitext(include_path)[0]
+ if dep != entry:
+ deps.append(dep)
+ output_dep_mapping_queue.put((entry, deps))
+ input_file_queue.task_done()
+
+if __name__ == '__main__':
+ parser = argparse.ArgumentParser()
+ parser.add_argument(
+ '--java',
+ required=True,
+ help='The path to the Java executable.')
+ parser.add_argument(
+ '--jvm_flags',
+ default='',
+ help='A comma-separated list of flags to pass to the JVM.')
+ parser.add_argument(
+ '--j2objc',
+ required=True,
+ help='The path to the J2ObjC deploy jar.')
+ parser.add_argument(
+ '--main_class',
+ required=True,
+ help='The main class of the J2ObjC deploy jar to execute.')
+ parser.add_argument(
+ '--translated_source_files',
+ required=True,
+ help=('A comma-separated list of file paths where J2ObjC will write the '
+ 'translated files to.'))
+ parser.add_argument(
+ '--output_dependency_mapping_file',
+ required=True,
+ help='The file path of the dependency mapping file to write to.')
+ parser.add_argument(
+ '--objc_file_path',
+ required=True,
+ help=('The file path which represents a directory where the generated '
+ 'ObjC files reside.'))
+ args, pass_through_flags = parser.parse_known_args()
+
+ RunJ2ObjC(args.java,
+ args.jvm_flags,
+ args.j2objc,
+ args.main_class,
+ pass_through_flags)
+ WriteDepMappingFile(args.translated_source_files,
+ args.objc_file_path,
+ args.output_dependency_mapping_file)