1*635a8641SAndroid Build Coastguard Worker#!/usr/bin/env python 2*635a8641SAndroid Build Coastguard Worker# Copyright (c) 2012 The Chromium Authors. All rights reserved. 3*635a8641SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 4*635a8641SAndroid Build Coastguard Worker# found in the LICENSE file. 5*635a8641SAndroid Build Coastguard Worker 6*635a8641SAndroid Build Coastguard Worker"""Generate java source files from protobuf files. 7*635a8641SAndroid Build Coastguard Worker 8*635a8641SAndroid Build Coastguard WorkerThis is a helper file for the genproto_java action in protoc_java.gypi. 9*635a8641SAndroid Build Coastguard Worker 10*635a8641SAndroid Build Coastguard WorkerIt performs the following steps: 11*635a8641SAndroid Build Coastguard Worker1. Deletes all old sources (ensures deleted classes are not part of new jars). 12*635a8641SAndroid Build Coastguard Worker2. Creates source directory. 13*635a8641SAndroid Build Coastguard Worker3. Generates Java files using protoc (output into either --java-out-dir or 14*635a8641SAndroid Build Coastguard Worker --srcjar). 15*635a8641SAndroid Build Coastguard Worker4. Creates a new stamp file. 16*635a8641SAndroid Build Coastguard Worker""" 17*635a8641SAndroid Build Coastguard Worker 18*635a8641SAndroid Build Coastguard Workerimport os 19*635a8641SAndroid Build Coastguard Workerimport optparse 20*635a8641SAndroid Build Coastguard Workerimport shutil 21*635a8641SAndroid Build Coastguard Workerimport subprocess 22*635a8641SAndroid Build Coastguard Workerimport sys 23*635a8641SAndroid Build Coastguard Worker 24*635a8641SAndroid Build Coastguard Workersys.path.append(os.path.join(os.path.dirname(__file__), "android", "gyp")) 25*635a8641SAndroid Build Coastguard Workerfrom util import build_utils 26*635a8641SAndroid Build Coastguard Worker 27*635a8641SAndroid Build Coastguard Workerdef main(argv): 28*635a8641SAndroid Build Coastguard Worker parser = optparse.OptionParser() 29*635a8641SAndroid Build Coastguard Worker build_utils.AddDepfileOption(parser) 30*635a8641SAndroid Build Coastguard Worker parser.add_option("--protoc", help="Path to protoc binary.") 31*635a8641SAndroid Build Coastguard Worker parser.add_option("--proto-path", help="Path to proto directory.") 32*635a8641SAndroid Build Coastguard Worker parser.add_option("--java-out-dir", 33*635a8641SAndroid Build Coastguard Worker help="Path to output directory for java files.") 34*635a8641SAndroid Build Coastguard Worker parser.add_option("--srcjar", help="Path to output srcjar.") 35*635a8641SAndroid Build Coastguard Worker parser.add_option("--stamp", help="File to touch on success.") 36*635a8641SAndroid Build Coastguard Worker parser.add_option("--nano", 37*635a8641SAndroid Build Coastguard Worker help="Use to generate nano protos.", action='store_true') 38*635a8641SAndroid Build Coastguard Worker options, args = parser.parse_args(argv) 39*635a8641SAndroid Build Coastguard Worker 40*635a8641SAndroid Build Coastguard Worker build_utils.CheckOptions(options, parser, ['protoc', 'proto_path']) 41*635a8641SAndroid Build Coastguard Worker if not options.java_out_dir and not options.srcjar: 42*635a8641SAndroid Build Coastguard Worker print('One of --java-out-dir or --srcjar must be specified.') 43*635a8641SAndroid Build Coastguard Worker return 1 44*635a8641SAndroid Build Coastguard Worker 45*635a8641SAndroid Build Coastguard Worker with build_utils.TempDir() as temp_dir: 46*635a8641SAndroid Build Coastguard Worker if options.nano: 47*635a8641SAndroid Build Coastguard Worker # Specify arguments to the generator. 48*635a8641SAndroid Build Coastguard Worker generator_args = ['optional_field_style=reftypes', 49*635a8641SAndroid Build Coastguard Worker 'store_unknown_fields=true'] 50*635a8641SAndroid Build Coastguard Worker out_arg = '--javanano_out=' + ','.join(generator_args) + ':' + temp_dir 51*635a8641SAndroid Build Coastguard Worker else: 52*635a8641SAndroid Build Coastguard Worker out_arg = '--java_out=' + temp_dir 53*635a8641SAndroid Build Coastguard Worker 54*635a8641SAndroid Build Coastguard Worker # Check if all proto files (which are listed in the args) are opting to 55*635a8641SAndroid Build Coastguard Worker # use the lite runtime, otherwise we'd have to include the much heavier 56*635a8641SAndroid Build Coastguard Worker # regular proto runtime in Chrome. 57*635a8641SAndroid Build Coastguard Worker # TODO(jkrcal): Replace this check by '--java_lite_out=' for the out_arg 58*635a8641SAndroid Build Coastguard Worker # above once this works on the master branch of the protobuf library, 59*635a8641SAndroid Build Coastguard Worker # expected in version 4.0 (see https://crbug.com/800281). 60*635a8641SAndroid Build Coastguard Worker for proto_file in args: 61*635a8641SAndroid Build Coastguard Worker if not 'LITE_RUNTIME' in open(proto_file).read(): 62*635a8641SAndroid Build Coastguard Worker raise Exception( 63*635a8641SAndroid Build Coastguard Worker 'Chrome only supports lite protos. Please add "optimize_for = ' 64*635a8641SAndroid Build Coastguard Worker 'LITE_RUNTIME" to your proto file to enable the lite runtime.') 65*635a8641SAndroid Build Coastguard Worker # Generate Java files using protoc. 66*635a8641SAndroid Build Coastguard Worker build_utils.CheckOutput( 67*635a8641SAndroid Build Coastguard Worker [options.protoc, '--proto_path', options.proto_path, out_arg] 68*635a8641SAndroid Build Coastguard Worker + args) 69*635a8641SAndroid Build Coastguard Worker 70*635a8641SAndroid Build Coastguard Worker if options.java_out_dir: 71*635a8641SAndroid Build Coastguard Worker build_utils.DeleteDirectory(options.java_out_dir) 72*635a8641SAndroid Build Coastguard Worker shutil.copytree(temp_dir, options.java_out_dir) 73*635a8641SAndroid Build Coastguard Worker else: 74*635a8641SAndroid Build Coastguard Worker build_utils.ZipDir(options.srcjar, temp_dir) 75*635a8641SAndroid Build Coastguard Worker 76*635a8641SAndroid Build Coastguard Worker if options.depfile: 77*635a8641SAndroid Build Coastguard Worker assert options.srcjar 78*635a8641SAndroid Build Coastguard Worker deps = args + [options.protoc] 79*635a8641SAndroid Build Coastguard Worker build_utils.WriteDepfile(options.depfile, options.srcjar, deps) 80*635a8641SAndroid Build Coastguard Worker 81*635a8641SAndroid Build Coastguard Worker if options.stamp: 82*635a8641SAndroid Build Coastguard Worker build_utils.Touch(options.stamp) 83*635a8641SAndroid Build Coastguard Worker 84*635a8641SAndroid Build Coastguard Workerif __name__ == '__main__': 85*635a8641SAndroid Build Coastguard Worker sys.exit(main(sys.argv[1:])) 86