Index: tools/protoc_wrapper/protoc_wrapper.py |
diff --git a/tools/protoc_wrapper/protoc_wrapper.py b/tools/protoc_wrapper/protoc_wrapper.py |
index be7f7a5be4a7e9bedce01ed1b13991f5ec487f97..69a7aec62b372e5ce52e658f5f2b65719fe3710b 100755 |
--- a/tools/protoc_wrapper/protoc_wrapper.py |
+++ b/tools/protoc_wrapper/protoc_wrapper.py |
@@ -3,11 +3,19 @@ |
# Use of this source code is governed by a BSD-style license that can be |
# found in the LICENSE file. |
-"""A simple wrapper for protoc to add includes in generated cpp headers.""" |
+""" |
+A simple wrapper for protoc. |
+ |
+- Adds includes in generated headers. |
+- Handles building with system protobuf as an option. |
+""" |
import optparse |
+import os.path |
+import shutil |
import subprocess |
import sys |
+import tempfile |
PROTOC_INCLUDE_POINT = '// @@protoc_insertion_point(includes)\n' |
@@ -34,6 +42,30 @@ def ModifyHeader(header_file, extra_header): |
return 0 |
+def RewriteProtoFilesForSystemProtobuf(path): |
+ wrapper_dir = tempfile.mkdtemp() |
+ try: |
+ for filename in os.listdir(path): |
+ if not filename.endswith('.proto'): |
+ continue |
+ with open(os.path.join(path, filename), 'r') as src_file: |
+ with open(os.path.join(wrapper_dir, filename), 'w') as dst_file: |
+ for line in src_file: |
+ # Remove lines that break build with system protobuf. |
+ # We cannot optimize for lite runtime, because system lite runtime |
+ # does not have a Chromium-specific hack to retain unknown fields. |
+ # Similarly, it does not understand corresponding option to control |
+ # the usage of that hack. |
+ if 'LITE_RUNTIME' in line or 'retain_unknown_fields' in line: |
+ continue |
+ dst_file.write(line) |
+ |
+ return wrapper_dir |
+ except: |
+ shutil.rmtree(wrapper_dir) |
+ raise |
+ |
+ |
def main(argv): |
parser = optparse.OptionParser() |
parser.add_option('--include', dest='extra_header', |
@@ -42,14 +74,31 @@ def main(argv): |
parser.add_option('--protobuf', dest='generated_header', |
help='The c++ protobuf header to add the extra header to. ' |
'This must be specified along with --include.') |
+ parser.add_option('--proto-in-dir', |
+ help='The directory containing .proto files.') |
+ parser.add_option('--proto-in-file', help='Input file to compile.') |
+ parser.add_option('--use-system-protobuf', type=int, default=0, |
+ help='Option to use system-installed protobuf ' |
+ 'instead of bundled one.') |
(options, args) = parser.parse_args(sys.argv) |
if len(args) < 2: |
return 1 |
- # Run what is hopefully protoc. |
- ret = subprocess.call(args[1:]) |
- if ret != 0: |
- return ret |
+ proto_path = options.proto_in_dir |
+ if options.use_system_protobuf == 1: |
+ proto_path = RewriteProtoFilesForSystemProtobuf(proto_path) |
+ try: |
+ # Run what is hopefully protoc. |
+ protoc_args = args[1:] |
+ protoc_args += ['--proto_path=%s' % proto_path, |
+ os.path.join(proto_path, options.proto_in_file)] |
+ ret = subprocess.call(protoc_args) |
+ if ret != 0: |
+ return ret |
+ finally: |
+ if options.use_system_protobuf == 1: |
+ # Remove temporary directory holding re-written files. |
+ shutil.rmtree(proto_path) |
# protoc succeeded, check to see if the generated cpp header needs editing. |
if not options.extra_header or not options.generated_header: |