1*8975f5c5SAndroid Build Coastguard Worker#!/usr/bin/env python3 2*8975f5c5SAndroid Build Coastguard Worker# Copyright 2012 The Chromium Authors 3*8975f5c5SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 4*8975f5c5SAndroid Build Coastguard Worker# found in the LICENSE file. 5*8975f5c5SAndroid Build Coastguard Worker 6*8975f5c5SAndroid Build Coastguard Worker"""Generate java source files from protobuf files. 7*8975f5c5SAndroid Build Coastguard Worker 8*8975f5c5SAndroid Build Coastguard WorkerThis is the action script for the proto_java_library template. 9*8975f5c5SAndroid Build Coastguard Worker 10*8975f5c5SAndroid Build Coastguard WorkerIt performs the following steps: 11*8975f5c5SAndroid Build Coastguard Worker1. Deletes all old sources (ensures deleted classes are not part of new jars). 12*8975f5c5SAndroid Build Coastguard Worker2. Creates source directory. 13*8975f5c5SAndroid Build Coastguard Worker3. Generates Java files using protoc (output into either --java-out-dir or 14*8975f5c5SAndroid Build Coastguard Worker --srcjar). 15*8975f5c5SAndroid Build Coastguard Worker4. Creates a new stamp file. 16*8975f5c5SAndroid Build Coastguard Worker""" 17*8975f5c5SAndroid Build Coastguard Worker 18*8975f5c5SAndroid Build Coastguard Worker 19*8975f5c5SAndroid Build Coastguard Workerimport argparse 20*8975f5c5SAndroid Build Coastguard Workerimport os 21*8975f5c5SAndroid Build Coastguard Workerimport shutil 22*8975f5c5SAndroid Build Coastguard Workerimport subprocess 23*8975f5c5SAndroid Build Coastguard Workerimport sys 24*8975f5c5SAndroid Build Coastguard Worker 25*8975f5c5SAndroid Build Coastguard Workerimport action_helpers 26*8975f5c5SAndroid Build Coastguard Workerimport zip_helpers 27*8975f5c5SAndroid Build Coastguard Worker 28*8975f5c5SAndroid Build Coastguard Workersys.path.append(os.path.join(os.path.dirname(__file__), 'android', 'gyp')) 29*8975f5c5SAndroid Build Coastguard Workerfrom util import build_utils 30*8975f5c5SAndroid Build Coastguard Worker 31*8975f5c5SAndroid Build Coastguard Worker 32*8975f5c5SAndroid Build Coastguard Workerdef _HasJavaPackage(proto_lines): 33*8975f5c5SAndroid Build Coastguard Worker return any(line.strip().startswith('option java_package') 34*8975f5c5SAndroid Build Coastguard Worker for line in proto_lines) 35*8975f5c5SAndroid Build Coastguard Worker 36*8975f5c5SAndroid Build Coastguard Worker 37*8975f5c5SAndroid Build Coastguard Workerdef _EnforceJavaPackage(proto_srcs): 38*8975f5c5SAndroid Build Coastguard Worker for proto_path in proto_srcs: 39*8975f5c5SAndroid Build Coastguard Worker with open(proto_path) as in_proto: 40*8975f5c5SAndroid Build Coastguard Worker if not _HasJavaPackage(in_proto.readlines()): 41*8975f5c5SAndroid Build Coastguard Worker raise Exception('Proto files for java must contain a "java_package" ' 42*8975f5c5SAndroid Build Coastguard Worker 'line: {}'.format(proto_path)) 43*8975f5c5SAndroid Build Coastguard Worker 44*8975f5c5SAndroid Build Coastguard Worker 45*8975f5c5SAndroid Build Coastguard Workerdef main(argv): 46*8975f5c5SAndroid Build Coastguard Worker parser = argparse.ArgumentParser() 47*8975f5c5SAndroid Build Coastguard Worker action_helpers.add_depfile_arg(parser) 48*8975f5c5SAndroid Build Coastguard Worker parser.add_argument('--protoc', required=True, help='Path to protoc binary.') 49*8975f5c5SAndroid Build Coastguard Worker parser.add_argument('--plugin', help='Path to plugin executable') 50*8975f5c5SAndroid Build Coastguard Worker parser.add_argument('--proto-path', 51*8975f5c5SAndroid Build Coastguard Worker required=True, 52*8975f5c5SAndroid Build Coastguard Worker help='Path to proto directory.') 53*8975f5c5SAndroid Build Coastguard Worker parser.add_argument('--java-out-dir', 54*8975f5c5SAndroid Build Coastguard Worker help='Path to output directory for java files.') 55*8975f5c5SAndroid Build Coastguard Worker parser.add_argument('--srcjar', help='Path to output srcjar.') 56*8975f5c5SAndroid Build Coastguard Worker parser.add_argument('--stamp', help='File to touch on success.') 57*8975f5c5SAndroid Build Coastguard Worker parser.add_argument( 58*8975f5c5SAndroid Build Coastguard Worker '--import-dir', 59*8975f5c5SAndroid Build Coastguard Worker action='append', 60*8975f5c5SAndroid Build Coastguard Worker default=[], 61*8975f5c5SAndroid Build Coastguard Worker help='Extra import directory for protos, can be repeated.') 62*8975f5c5SAndroid Build Coastguard Worker parser.add_argument('protos', nargs='+', help='proto source files') 63*8975f5c5SAndroid Build Coastguard Worker options = parser.parse_args(argv) 64*8975f5c5SAndroid Build Coastguard Worker 65*8975f5c5SAndroid Build Coastguard Worker if not options.java_out_dir and not options.srcjar: 66*8975f5c5SAndroid Build Coastguard Worker raise Exception('One of --java-out-dir or --srcjar must be specified.') 67*8975f5c5SAndroid Build Coastguard Worker 68*8975f5c5SAndroid Build Coastguard Worker _EnforceJavaPackage(options.protos) 69*8975f5c5SAndroid Build Coastguard Worker 70*8975f5c5SAndroid Build Coastguard Worker with build_utils.TempDir() as temp_dir: 71*8975f5c5SAndroid Build Coastguard Worker protoc_args = [] 72*8975f5c5SAndroid Build Coastguard Worker 73*8975f5c5SAndroid Build Coastguard Worker generator = 'java' 74*8975f5c5SAndroid Build Coastguard Worker if options.plugin: 75*8975f5c5SAndroid Build Coastguard Worker generator = 'plugin' 76*8975f5c5SAndroid Build Coastguard Worker protoc_args += ['--plugin', 'protoc-gen-plugin=' + options.plugin] 77*8975f5c5SAndroid Build Coastguard Worker 78*8975f5c5SAndroid Build Coastguard Worker protoc_args += ['--proto_path', options.proto_path] 79*8975f5c5SAndroid Build Coastguard Worker for path in options.import_dir: 80*8975f5c5SAndroid Build Coastguard Worker protoc_args += ['--proto_path', path] 81*8975f5c5SAndroid Build Coastguard Worker 82*8975f5c5SAndroid Build Coastguard Worker protoc_args += ['--' + generator + '_out=lite:' + temp_dir] 83*8975f5c5SAndroid Build Coastguard Worker 84*8975f5c5SAndroid Build Coastguard Worker # Generate Java files using protoc. 85*8975f5c5SAndroid Build Coastguard Worker build_utils.CheckOutput( 86*8975f5c5SAndroid Build Coastguard Worker [options.protoc] + protoc_args + options.protos, 87*8975f5c5SAndroid Build Coastguard Worker # protoc generates superfluous warnings about LITE_RUNTIME deprecation 88*8975f5c5SAndroid Build Coastguard Worker # even though we are using the new non-deprecated method. 89*8975f5c5SAndroid Build Coastguard Worker stderr_filter=lambda output: build_utils.FilterLines( 90*8975f5c5SAndroid Build Coastguard Worker output, '|'.join([r'optimize_for = LITE_RUNTIME', r'java/lite\.md']) 91*8975f5c5SAndroid Build Coastguard Worker )) 92*8975f5c5SAndroid Build Coastguard Worker 93*8975f5c5SAndroid Build Coastguard Worker if options.java_out_dir: 94*8975f5c5SAndroid Build Coastguard Worker build_utils.DeleteDirectory(options.java_out_dir) 95*8975f5c5SAndroid Build Coastguard Worker shutil.copytree(temp_dir, options.java_out_dir) 96*8975f5c5SAndroid Build Coastguard Worker else: 97*8975f5c5SAndroid Build Coastguard Worker with action_helpers.atomic_output(options.srcjar) as f: 98*8975f5c5SAndroid Build Coastguard Worker zip_helpers.zip_directory(f, temp_dir) 99*8975f5c5SAndroid Build Coastguard Worker 100*8975f5c5SAndroid Build Coastguard Worker if options.depfile: 101*8975f5c5SAndroid Build Coastguard Worker assert options.srcjar 102*8975f5c5SAndroid Build Coastguard Worker deps = options.protos + [options.protoc] 103*8975f5c5SAndroid Build Coastguard Worker action_helpers.write_depfile(options.depfile, options.srcjar, deps) 104*8975f5c5SAndroid Build Coastguard Worker 105*8975f5c5SAndroid Build Coastguard Worker if options.stamp: 106*8975f5c5SAndroid Build Coastguard Worker build_utils.Touch(options.stamp) 107*8975f5c5SAndroid Build Coastguard Worker 108*8975f5c5SAndroid Build Coastguard Workerif __name__ == '__main__': 109*8975f5c5SAndroid Build Coastguard Worker sys.exit(main(sys.argv[1:])) 110