1*333d2b36SAndroid Build Coastguard Worker// Copyright 2017 Google Inc. All rights reserved. 2*333d2b36SAndroid Build Coastguard Worker// 3*333d2b36SAndroid Build Coastguard Worker// Licensed under the Apache License, Version 2.0 (the "License"); 4*333d2b36SAndroid Build Coastguard Worker// you may not use this file except in compliance with the License. 5*333d2b36SAndroid Build Coastguard Worker// You may obtain a copy of the License at 6*333d2b36SAndroid Build Coastguard Worker// 7*333d2b36SAndroid Build Coastguard Worker// http://www.apache.org/licenses/LICENSE-2.0 8*333d2b36SAndroid Build Coastguard Worker// 9*333d2b36SAndroid Build Coastguard Worker// Unless required by applicable law or agreed to in writing, software 10*333d2b36SAndroid Build Coastguard Worker// distributed under the License is distributed on an "AS IS" BASIS, 11*333d2b36SAndroid Build Coastguard Worker// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*333d2b36SAndroid Build Coastguard Worker// See the License for the specific language governing permissions and 13*333d2b36SAndroid Build Coastguard Worker// limitations under the License. 14*333d2b36SAndroid Build Coastguard Worker 15*333d2b36SAndroid Build Coastguard Workerpackage java 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "path/filepath" 19*333d2b36SAndroid Build Coastguard Worker "strconv" 20*333d2b36SAndroid Build Coastguard Worker 21*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 22*333d2b36SAndroid Build Coastguard Worker) 23*333d2b36SAndroid Build Coastguard Worker 24*333d2b36SAndroid Build Coastguard Workerconst ( 25*333d2b36SAndroid Build Coastguard Worker protoTypeDefault = "lite" 26*333d2b36SAndroid Build Coastguard Worker) 27*333d2b36SAndroid Build Coastguard Worker 28*333d2b36SAndroid Build Coastguard Workerfunc genProto(ctx android.ModuleContext, protoFiles android.Paths, flags android.ProtoFlags) android.Paths { 29*333d2b36SAndroid Build Coastguard Worker // Shard proto files into groups of 100 to avoid having to recompile all of them if one changes and to avoid 30*333d2b36SAndroid Build Coastguard Worker // hitting command line length limits. 31*333d2b36SAndroid Build Coastguard Worker shards := android.ShardPaths(protoFiles, 50) 32*333d2b36SAndroid Build Coastguard Worker 33*333d2b36SAndroid Build Coastguard Worker srcJarFiles := make(android.Paths, 0, len(shards)) 34*333d2b36SAndroid Build Coastguard Worker 35*333d2b36SAndroid Build Coastguard Worker for i, shard := range shards { 36*333d2b36SAndroid Build Coastguard Worker srcJarFile := android.PathForModuleGen(ctx, "proto", "proto"+strconv.Itoa(i)+".srcjar") 37*333d2b36SAndroid Build Coastguard Worker srcJarFiles = append(srcJarFiles, srcJarFile) 38*333d2b36SAndroid Build Coastguard Worker 39*333d2b36SAndroid Build Coastguard Worker outDir := srcJarFile.ReplaceExtension(ctx, "tmp") 40*333d2b36SAndroid Build Coastguard Worker 41*333d2b36SAndroid Build Coastguard Worker rule := android.NewRuleBuilder(pctx, ctx) 42*333d2b36SAndroid Build Coastguard Worker 43*333d2b36SAndroid Build Coastguard Worker rule.Command().Text("rm -rf").Flag(outDir.String()) 44*333d2b36SAndroid Build Coastguard Worker rule.Command().Text("mkdir -p").Flag(outDir.String()) 45*333d2b36SAndroid Build Coastguard Worker 46*333d2b36SAndroid Build Coastguard Worker for _, protoFile := range shard { 47*333d2b36SAndroid Build Coastguard Worker depFile := srcJarFile.InSameDir(ctx, protoFile.String()+".d") 48*333d2b36SAndroid Build Coastguard Worker rule.Command().Text("mkdir -p").Flag(filepath.Dir(depFile.String())) 49*333d2b36SAndroid Build Coastguard Worker android.ProtoRule(rule, protoFile, flags, flags.Deps, outDir, depFile, nil) 50*333d2b36SAndroid Build Coastguard Worker } 51*333d2b36SAndroid Build Coastguard Worker 52*333d2b36SAndroid Build Coastguard Worker // Proto generated java files have an unknown package name in the path, so package the entire output directory 53*333d2b36SAndroid Build Coastguard Worker // into a srcjar. 54*333d2b36SAndroid Build Coastguard Worker rule.Command(). 55*333d2b36SAndroid Build Coastguard Worker BuiltTool("soong_zip"). 56*333d2b36SAndroid Build Coastguard Worker Flag("-srcjar"). 57*333d2b36SAndroid Build Coastguard Worker Flag("-write_if_changed"). 58*333d2b36SAndroid Build Coastguard Worker FlagWithOutput("-o ", srcJarFile). 59*333d2b36SAndroid Build Coastguard Worker FlagWithArg("-C ", outDir.String()). 60*333d2b36SAndroid Build Coastguard Worker FlagWithArg("-D ", outDir.String()) 61*333d2b36SAndroid Build Coastguard Worker 62*333d2b36SAndroid Build Coastguard Worker rule.Command().Text("rm -rf").Flag(outDir.String()) 63*333d2b36SAndroid Build Coastguard Worker 64*333d2b36SAndroid Build Coastguard Worker rule.Restat() 65*333d2b36SAndroid Build Coastguard Worker 66*333d2b36SAndroid Build Coastguard Worker ruleName := "protoc" 67*333d2b36SAndroid Build Coastguard Worker ruleDesc := "protoc" 68*333d2b36SAndroid Build Coastguard Worker if len(shards) > 1 { 69*333d2b36SAndroid Build Coastguard Worker ruleName += "_" + strconv.Itoa(i) 70*333d2b36SAndroid Build Coastguard Worker ruleDesc += " " + strconv.Itoa(i) 71*333d2b36SAndroid Build Coastguard Worker } 72*333d2b36SAndroid Build Coastguard Worker 73*333d2b36SAndroid Build Coastguard Worker rule.Build(ruleName, ruleDesc) 74*333d2b36SAndroid Build Coastguard Worker } 75*333d2b36SAndroid Build Coastguard Worker 76*333d2b36SAndroid Build Coastguard Worker return srcJarFiles 77*333d2b36SAndroid Build Coastguard Worker} 78*333d2b36SAndroid Build Coastguard Worker 79*333d2b36SAndroid Build Coastguard Workerfunc protoDeps(ctx android.BottomUpMutatorContext, p *android.ProtoProperties) { 80*333d2b36SAndroid Build Coastguard Worker const unspecifiedProtobufPluginType = "" 81*333d2b36SAndroid Build Coastguard Worker if String(p.Proto.Plugin) == "" { 82*333d2b36SAndroid Build Coastguard Worker switch String(p.Proto.Type) { 83*333d2b36SAndroid Build Coastguard Worker case "stream": // does not require additional dependencies 84*333d2b36SAndroid Build Coastguard Worker case "micro": 85*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(nil, staticLibTag, "libprotobuf-java-micro") 86*333d2b36SAndroid Build Coastguard Worker case "nano": 87*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(nil, staticLibTag, "libprotobuf-java-nano") 88*333d2b36SAndroid Build Coastguard Worker case "lite", unspecifiedProtobufPluginType: 89*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(nil, staticLibTag, "libprotobuf-java-lite") 90*333d2b36SAndroid Build Coastguard Worker case "full": 91*333d2b36SAndroid Build Coastguard Worker if ctx.Host() { 92*333d2b36SAndroid Build Coastguard Worker ctx.AddVariationDependencies(nil, staticLibTag, "libprotobuf-java-full") 93*333d2b36SAndroid Build Coastguard Worker } else { 94*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("proto.type", "full java protos only supported on the host") 95*333d2b36SAndroid Build Coastguard Worker } 96*333d2b36SAndroid Build Coastguard Worker default: 97*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("proto.type", "unknown proto type %q", 98*333d2b36SAndroid Build Coastguard Worker String(p.Proto.Type)) 99*333d2b36SAndroid Build Coastguard Worker } 100*333d2b36SAndroid Build Coastguard Worker } 101*333d2b36SAndroid Build Coastguard Worker} 102*333d2b36SAndroid Build Coastguard Worker 103*333d2b36SAndroid Build Coastguard Workerfunc protoFlags(ctx android.ModuleContext, j *CommonProperties, p *android.ProtoProperties, 104*333d2b36SAndroid Build Coastguard Worker flags javaBuilderFlags) javaBuilderFlags { 105*333d2b36SAndroid Build Coastguard Worker 106*333d2b36SAndroid Build Coastguard Worker flags.proto = android.GetProtoFlags(ctx, p) 107*333d2b36SAndroid Build Coastguard Worker 108*333d2b36SAndroid Build Coastguard Worker if String(p.Proto.Plugin) == "" { 109*333d2b36SAndroid Build Coastguard Worker var typeToPlugin string 110*333d2b36SAndroid Build Coastguard Worker switch String(p.Proto.Type) { 111*333d2b36SAndroid Build Coastguard Worker case "stream": 112*333d2b36SAndroid Build Coastguard Worker flags.proto.OutTypeFlag = "--javastream_out" 113*333d2b36SAndroid Build Coastguard Worker typeToPlugin = "javastream" 114*333d2b36SAndroid Build Coastguard Worker case "micro": 115*333d2b36SAndroid Build Coastguard Worker flags.proto.OutTypeFlag = "--javamicro_out" 116*333d2b36SAndroid Build Coastguard Worker typeToPlugin = "javamicro" 117*333d2b36SAndroid Build Coastguard Worker case "nano": 118*333d2b36SAndroid Build Coastguard Worker flags.proto.OutTypeFlag = "--javanano_out" 119*333d2b36SAndroid Build Coastguard Worker typeToPlugin = "javanano" 120*333d2b36SAndroid Build Coastguard Worker case "lite", "": 121*333d2b36SAndroid Build Coastguard Worker flags.proto.OutTypeFlag = "--java_out" 122*333d2b36SAndroid Build Coastguard Worker flags.proto.OutParams = append(flags.proto.OutParams, "lite") 123*333d2b36SAndroid Build Coastguard Worker case "full": 124*333d2b36SAndroid Build Coastguard Worker flags.proto.OutTypeFlag = "--java_out" 125*333d2b36SAndroid Build Coastguard Worker default: 126*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("proto.type", "unknown proto type %q", 127*333d2b36SAndroid Build Coastguard Worker String(p.Proto.Type)) 128*333d2b36SAndroid Build Coastguard Worker } 129*333d2b36SAndroid Build Coastguard Worker 130*333d2b36SAndroid Build Coastguard Worker if typeToPlugin != "" { 131*333d2b36SAndroid Build Coastguard Worker hostTool := ctx.Config().HostToolPath(ctx, "protoc-gen-"+typeToPlugin) 132*333d2b36SAndroid Build Coastguard Worker flags.proto.Deps = append(flags.proto.Deps, hostTool) 133*333d2b36SAndroid Build Coastguard Worker flags.proto.Flags = append(flags.proto.Flags, "--plugin=protoc-gen-"+typeToPlugin+"="+hostTool.String()) 134*333d2b36SAndroid Build Coastguard Worker } 135*333d2b36SAndroid Build Coastguard Worker } 136*333d2b36SAndroid Build Coastguard Worker 137*333d2b36SAndroid Build Coastguard Worker flags.proto.OutParams = append(flags.proto.OutParams, j.Proto.Output_params...) 138*333d2b36SAndroid Build Coastguard Worker 139*333d2b36SAndroid Build Coastguard Worker return flags 140*333d2b36SAndroid Build Coastguard Worker} 141