diff options
-rw-r--r-- | build/protoc.gypi | 9 | ||||
-rwxr-xr-x | tools/protoc_wrapper/protoc_wrapper.py | 59 |
2 files changed, 59 insertions, 9 deletions
diff --git a/build/protoc.gypi b/build/protoc.gypi index a20dce0..52fb8a2b6 100644 --- a/build/protoc.gypi +++ b/build/protoc.gypi @@ -82,14 +82,15 @@ '<(cc_include)', '--protobuf', '<(cc_dir)/<(RULE_INPUT_ROOT).pb.h', - '--', - '<(protoc)', # Using the --arg val form (instead of --arg=val) allows gyp's msvs rule # generation to correct 'val' which is a path. - '--proto_path','<(proto_in_dir)', + '--proto-in-dir','<(proto_in_dir)', # Naively you'd use <(RULE_INPUT_PATH) here, but protoc requires # --proto_path is a strict prefix of the path given as an argument. - '<(proto_in_dir)/<(RULE_INPUT_ROOT)<(RULE_INPUT_EXT)', + '--proto-in-file','<(RULE_INPUT_ROOT)<(RULE_INPUT_EXT)', + '--use-system-protobuf=<(use_system_protobuf)', + '--', + '<(protoc)', '--cpp_out', '<(cc_generator_options)<(cc_dir)', '--python_out', '<(py_dir)', ], diff --git a/tools/protoc_wrapper/protoc_wrapper.py b/tools/protoc_wrapper/protoc_wrapper.py index be7f7a5..69a7aec 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: |