Chromium Code Reviews| 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..8563e6a1dfb5165f97fd410b99590ff0b2177a15 100755 |
| --- a/tools/protoc_wrapper/protoc_wrapper.py |
| +++ b/tools/protoc_wrapper/protoc_wrapper.py |
| @@ -6,8 +6,11 @@ |
| """A simple wrapper for protoc to add includes in generated cpp headers.""" |
|
agl
2012/12/04 17:20:45
This comment may need updating to reflect the addi
Paweł Hajdan Jr.
2012/12/04 18:01:51
Done.
|
| import optparse |
| +import os.path |
| +import shutil |
| import subprocess |
| import sys |
| +import tempfile |
| PROTOC_INCLUDE_POINT = '// @@protoc_insertion_point(includes)\n' |
| @@ -34,6 +37,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: |
|
agl
2012/12/04 17:20:45
The version of Python that's run on various builde
|
| + 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 +69,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: |