|  | #!/usr/bin/env python3 | 
|  | # 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. | 
|  |  | 
|  | from __future__ import absolute_import | 
|  | from __future__ import division | 
|  | from __future__ import print_function | 
|  | import os | 
|  | import re | 
|  | import argparse | 
|  | import tempfile | 
|  | import subprocess | 
|  | from compat import iteritems | 
|  |  | 
|  | SOURCE_TARGET = [ | 
|  | ('protos/perfetto/trace_processor/trace_processor.proto', | 
|  | 'python/perfetto/trace_processor/trace_processor.descriptor'), | 
|  | ('protos/perfetto/metrics/metrics.proto', | 
|  | 'python/perfetto/trace_processor/metrics.descriptor'), | 
|  | ] | 
|  |  | 
|  | ROOT_DIR = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) | 
|  |  | 
|  | SCRIPT_PATH = 'tools/gen_binary_descriptors' | 
|  |  | 
|  |  | 
|  | def find_protoc(): | 
|  | for root, _, files in os.walk(os.path.join(ROOT_DIR, 'out')): | 
|  | if 'protoc' in files: | 
|  | return os.path.join(root, 'protoc') | 
|  | return None | 
|  |  | 
|  |  | 
|  | def generate(source, target, protoc_path, check_only): | 
|  | # delete=False + manual unlink is required for Windows. Otherwise the temp | 
|  | # file is kept locked exclusively and unaccassible until it's destroyed. | 
|  | with tempfile.NamedTemporaryFile(delete=False) as fdescriptor: | 
|  | subprocess.check_call([ | 
|  | protoc_path, | 
|  | '--include_imports', | 
|  | '--proto_path=.', | 
|  | '--proto_path=' + \ | 
|  | os.path.join(ROOT_DIR, "buildtools", "protobuf", "src"), | 
|  | '--descriptor_set_out={}'.format(fdescriptor.name), | 
|  | source, | 
|  | ], cwd=ROOT_DIR) | 
|  |  | 
|  | s = fdescriptor.read() | 
|  | fdescriptor.close() | 
|  | os.remove(fdescriptor.name) | 
|  |  | 
|  | if check_only: | 
|  | with open(target, 'rb') as old: | 
|  | old_content = old.read() | 
|  | if (s != old_content): | 
|  | raise AssertionError('Target {} does not match', target) | 
|  | return | 
|  |  | 
|  | with open(target, 'wb') as out: | 
|  | out.write(s) | 
|  |  | 
|  |  | 
|  | def main(): | 
|  | parser = argparse.ArgumentParser() | 
|  | parser.add_argument('--check-only', action='store_true') | 
|  | parser.add_argument('--protoc') | 
|  | args = parser.parse_args() | 
|  |  | 
|  | try: | 
|  | for source, target in SOURCE_TARGET: | 
|  | protoc = args.protoc or find_protoc() | 
|  | assert protoc, 'protoc not found specific (--protoc PROTOC_PATH)' | 
|  | assert os.path.exists(protoc), '{} does not exist'.format(protoc) | 
|  | if protoc is not args.protoc: | 
|  | print('Using protoc: {}'.format(protoc)) | 
|  | generate(source, target, protoc, args.check_only) | 
|  | except AssertionError as e: | 
|  | if not str(e): | 
|  | raise | 
|  | print('Error: {}'.format(e)) | 
|  | return 1 | 
|  |  | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | exit(main()) |