1*333d2b36SAndroid Build Coastguard Worker// Copyright 2016 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 cc 16*333d2b36SAndroid Build Coastguard Worker 17*333d2b36SAndroid Build Coastguard Workerimport ( 18*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/pathtools" 19*333d2b36SAndroid Build Coastguard Worker "github.com/google/blueprint/proptools" 20*333d2b36SAndroid Build Coastguard Worker 21*333d2b36SAndroid Build Coastguard Worker "android/soong/android" 22*333d2b36SAndroid Build Coastguard Worker 23*333d2b36SAndroid Build Coastguard Worker "strings" 24*333d2b36SAndroid Build Coastguard Worker) 25*333d2b36SAndroid Build Coastguard Worker 26*333d2b36SAndroid Build Coastguard Workerconst ( 27*333d2b36SAndroid Build Coastguard Worker protoTypeDefault = "lite" 28*333d2b36SAndroid Build Coastguard Worker) 29*333d2b36SAndroid Build Coastguard Worker 30*333d2b36SAndroid Build Coastguard Worker// genProto creates a rule to convert a .proto file to generated .pb.cc and .pb.h files and returns 31*333d2b36SAndroid Build Coastguard Worker// the paths to the generated files. 32*333d2b36SAndroid Build Coastguard Workerfunc genProto(ctx android.ModuleContext, protoFile android.Path, flags builderFlags) (cc, header android.WritablePath) { 33*333d2b36SAndroid Build Coastguard Worker var ccFile, headerFile android.ModuleGenPath 34*333d2b36SAndroid Build Coastguard Worker 35*333d2b36SAndroid Build Coastguard Worker srcSuffix := ".cc" 36*333d2b36SAndroid Build Coastguard Worker if flags.protoC { 37*333d2b36SAndroid Build Coastguard Worker srcSuffix = ".c" 38*333d2b36SAndroid Build Coastguard Worker } 39*333d2b36SAndroid Build Coastguard Worker 40*333d2b36SAndroid Build Coastguard Worker srcInfix := "pb" 41*333d2b36SAndroid Build Coastguard Worker for _, value := range flags.proto.Flags { 42*333d2b36SAndroid Build Coastguard Worker if strings.HasPrefix(value, "--plugin=") && strings.HasSuffix(value, "protoc-gen-grpc-cpp-plugin") { 43*333d2b36SAndroid Build Coastguard Worker srcInfix = "grpc.pb" 44*333d2b36SAndroid Build Coastguard Worker break 45*333d2b36SAndroid Build Coastguard Worker } 46*333d2b36SAndroid Build Coastguard Worker } 47*333d2b36SAndroid Build Coastguard Worker 48*333d2b36SAndroid Build Coastguard Worker if flags.proto.CanonicalPathFromRoot { 49*333d2b36SAndroid Build Coastguard Worker ccFile = android.GenPathWithExt(ctx, "proto", protoFile, srcInfix+srcSuffix) 50*333d2b36SAndroid Build Coastguard Worker headerFile = android.GenPathWithExt(ctx, "proto", protoFile, srcInfix+".h") 51*333d2b36SAndroid Build Coastguard Worker } else { 52*333d2b36SAndroid Build Coastguard Worker rel := protoFile.Rel() 53*333d2b36SAndroid Build Coastguard Worker ccFile = android.PathForModuleGen(ctx, "proto", pathtools.ReplaceExtension(rel, srcInfix+srcSuffix)) 54*333d2b36SAndroid Build Coastguard Worker headerFile = android.PathForModuleGen(ctx, "proto", pathtools.ReplaceExtension(rel, srcInfix+".h")) 55*333d2b36SAndroid Build Coastguard Worker } 56*333d2b36SAndroid Build Coastguard Worker 57*333d2b36SAndroid Build Coastguard Worker protoDeps := flags.proto.Deps 58*333d2b36SAndroid Build Coastguard Worker if flags.protoOptionsFile { 59*333d2b36SAndroid Build Coastguard Worker optionsFile := pathtools.ReplaceExtension(protoFile.String(), "options") 60*333d2b36SAndroid Build Coastguard Worker optionsPath := android.PathForSource(ctx, optionsFile) 61*333d2b36SAndroid Build Coastguard Worker protoDeps = append(android.Paths{optionsPath}, protoDeps...) 62*333d2b36SAndroid Build Coastguard Worker } 63*333d2b36SAndroid Build Coastguard Worker 64*333d2b36SAndroid Build Coastguard Worker outDir := flags.proto.Dir 65*333d2b36SAndroid Build Coastguard Worker depFile := ccFile.ReplaceExtension(ctx, "d") 66*333d2b36SAndroid Build Coastguard Worker outputs := android.WritablePaths{ccFile, headerFile} 67*333d2b36SAndroid Build Coastguard Worker 68*333d2b36SAndroid Build Coastguard Worker rule := android.NewRuleBuilder(pctx, ctx) 69*333d2b36SAndroid Build Coastguard Worker 70*333d2b36SAndroid Build Coastguard Worker android.ProtoRule(rule, protoFile, flags.proto, protoDeps, outDir, depFile, outputs) 71*333d2b36SAndroid Build Coastguard Worker 72*333d2b36SAndroid Build Coastguard Worker rule.Build("protoc_"+protoFile.Rel(), "protoc "+protoFile.Rel()) 73*333d2b36SAndroid Build Coastguard Worker 74*333d2b36SAndroid Build Coastguard Worker return ccFile, headerFile 75*333d2b36SAndroid Build Coastguard Worker} 76*333d2b36SAndroid Build Coastguard Worker 77*333d2b36SAndroid Build Coastguard Workerfunc protoDeps(ctx DepsContext, deps Deps, p *android.ProtoProperties, static bool) Deps { 78*333d2b36SAndroid Build Coastguard Worker var lib string 79*333d2b36SAndroid Build Coastguard Worker 80*333d2b36SAndroid Build Coastguard Worker if String(p.Proto.Plugin) == "" { 81*333d2b36SAndroid Build Coastguard Worker switch proptools.StringDefault(p.Proto.Type, protoTypeDefault) { 82*333d2b36SAndroid Build Coastguard Worker case "full": 83*333d2b36SAndroid Build Coastguard Worker if ctx.useSdk() { 84*333d2b36SAndroid Build Coastguard Worker lib = "libprotobuf-cpp-full-ndk" 85*333d2b36SAndroid Build Coastguard Worker static = true 86*333d2b36SAndroid Build Coastguard Worker } else { 87*333d2b36SAndroid Build Coastguard Worker lib = "libprotobuf-cpp-full" 88*333d2b36SAndroid Build Coastguard Worker } 89*333d2b36SAndroid Build Coastguard Worker case "lite": 90*333d2b36SAndroid Build Coastguard Worker if ctx.useSdk() { 91*333d2b36SAndroid Build Coastguard Worker lib = "libprotobuf-cpp-lite-ndk" 92*333d2b36SAndroid Build Coastguard Worker static = true 93*333d2b36SAndroid Build Coastguard Worker } else { 94*333d2b36SAndroid Build Coastguard Worker lib = "libprotobuf-cpp-lite" 95*333d2b36SAndroid Build Coastguard Worker } 96*333d2b36SAndroid Build Coastguard Worker case "nanopb-c": 97*333d2b36SAndroid Build Coastguard Worker lib = "libprotobuf-c-nano" 98*333d2b36SAndroid Build Coastguard Worker static = true 99*333d2b36SAndroid Build Coastguard Worker case "nanopb-c-enable_malloc": 100*333d2b36SAndroid Build Coastguard Worker lib = "libprotobuf-c-nano-enable_malloc" 101*333d2b36SAndroid Build Coastguard Worker static = true 102*333d2b36SAndroid Build Coastguard Worker case "nanopb-c-16bit": 103*333d2b36SAndroid Build Coastguard Worker lib = "libprotobuf-c-nano-16bit" 104*333d2b36SAndroid Build Coastguard Worker static = true 105*333d2b36SAndroid Build Coastguard Worker case "nanopb-c-enable_malloc-16bit": 106*333d2b36SAndroid Build Coastguard Worker lib = "libprotobuf-c-nano-enable_malloc-16bit" 107*333d2b36SAndroid Build Coastguard Worker static = true 108*333d2b36SAndroid Build Coastguard Worker case "nanopb-c-32bit": 109*333d2b36SAndroid Build Coastguard Worker lib = "libprotobuf-c-nano-32bit" 110*333d2b36SAndroid Build Coastguard Worker static = true 111*333d2b36SAndroid Build Coastguard Worker case "nanopb-c-enable_malloc-32bit": 112*333d2b36SAndroid Build Coastguard Worker lib = "libprotobuf-c-nano-enable_malloc-32bit" 113*333d2b36SAndroid Build Coastguard Worker static = true 114*333d2b36SAndroid Build Coastguard Worker default: 115*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("proto.type", "unknown proto type %q", 116*333d2b36SAndroid Build Coastguard Worker String(p.Proto.Type)) 117*333d2b36SAndroid Build Coastguard Worker } 118*333d2b36SAndroid Build Coastguard Worker 119*333d2b36SAndroid Build Coastguard Worker if static { 120*333d2b36SAndroid Build Coastguard Worker deps.StaticLibs = append(deps.StaticLibs, lib) 121*333d2b36SAndroid Build Coastguard Worker deps.ReexportStaticLibHeaders = append(deps.ReexportStaticLibHeaders, lib) 122*333d2b36SAndroid Build Coastguard Worker } else { 123*333d2b36SAndroid Build Coastguard Worker deps.SharedLibs = append(deps.SharedLibs, lib) 124*333d2b36SAndroid Build Coastguard Worker deps.ReexportSharedLibHeaders = append(deps.ReexportSharedLibHeaders, lib) 125*333d2b36SAndroid Build Coastguard Worker } 126*333d2b36SAndroid Build Coastguard Worker } 127*333d2b36SAndroid Build Coastguard Worker 128*333d2b36SAndroid Build Coastguard Worker return deps 129*333d2b36SAndroid Build Coastguard Worker} 130*333d2b36SAndroid Build Coastguard Worker 131*333d2b36SAndroid Build Coastguard Workerfunc protoFlags(ctx ModuleContext, flags Flags, p *android.ProtoProperties) Flags { 132*333d2b36SAndroid Build Coastguard Worker flags.Local.CFlags = append(flags.Local.CFlags, "-DGOOGLE_PROTOBUF_NO_RTTI") 133*333d2b36SAndroid Build Coastguard Worker 134*333d2b36SAndroid Build Coastguard Worker flags.proto = android.GetProtoFlags(ctx, p) 135*333d2b36SAndroid Build Coastguard Worker if flags.proto.CanonicalPathFromRoot { 136*333d2b36SAndroid Build Coastguard Worker flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+flags.proto.SubDir.String()) 137*333d2b36SAndroid Build Coastguard Worker } 138*333d2b36SAndroid Build Coastguard Worker flags.Local.CommonFlags = append(flags.Local.CommonFlags, "-I"+flags.proto.Dir.String()) 139*333d2b36SAndroid Build Coastguard Worker 140*333d2b36SAndroid Build Coastguard Worker if String(p.Proto.Plugin) == "" { 141*333d2b36SAndroid Build Coastguard Worker var plugin string 142*333d2b36SAndroid Build Coastguard Worker 143*333d2b36SAndroid Build Coastguard Worker switch String(p.Proto.Type) { 144*333d2b36SAndroid Build Coastguard Worker case "nanopb-c", "nanopb-c-enable_malloc", "nanopb-c-16bit", "nanopb-c-enable_malloc-16bit", "nanopb-c-32bit", "nanopb-c-enable_malloc-32bit": 145*333d2b36SAndroid Build Coastguard Worker flags.protoC = true 146*333d2b36SAndroid Build Coastguard Worker flags.protoOptionsFile = true 147*333d2b36SAndroid Build Coastguard Worker flags.proto.OutTypeFlag = "--nanopb_out" 148*333d2b36SAndroid Build Coastguard Worker // Disable nanopb timestamps to support remote caching. 149*333d2b36SAndroid Build Coastguard Worker flags.proto.OutParams = append(flags.proto.OutParams, "-T") 150*333d2b36SAndroid Build Coastguard Worker plugin = "protoc-gen-nanopb" 151*333d2b36SAndroid Build Coastguard Worker case "full": 152*333d2b36SAndroid Build Coastguard Worker flags.proto.OutTypeFlag = "--cpp_out" 153*333d2b36SAndroid Build Coastguard Worker case "lite": 154*333d2b36SAndroid Build Coastguard Worker flags.proto.OutTypeFlag = "--cpp_out" 155*333d2b36SAndroid Build Coastguard Worker flags.proto.OutParams = append(flags.proto.OutParams, "lite") 156*333d2b36SAndroid Build Coastguard Worker case "": 157*333d2b36SAndroid Build Coastguard Worker // TODO(b/119714316): this should be equivalent to "lite" in 158*333d2b36SAndroid Build Coastguard Worker // order to match protoDeps, but some modules are depending on 159*333d2b36SAndroid Build Coastguard Worker // this behavior 160*333d2b36SAndroid Build Coastguard Worker flags.proto.OutTypeFlag = "--cpp_out" 161*333d2b36SAndroid Build Coastguard Worker default: 162*333d2b36SAndroid Build Coastguard Worker ctx.PropertyErrorf("proto.type", "unknown proto type %q", 163*333d2b36SAndroid Build Coastguard Worker String(p.Proto.Type)) 164*333d2b36SAndroid Build Coastguard Worker } 165*333d2b36SAndroid Build Coastguard Worker 166*333d2b36SAndroid Build Coastguard Worker if plugin != "" { 167*333d2b36SAndroid Build Coastguard Worker path := ctx.Config().HostToolPath(ctx, plugin) 168*333d2b36SAndroid Build Coastguard Worker flags.proto.Deps = append(flags.proto.Deps, path) 169*333d2b36SAndroid Build Coastguard Worker flags.proto.Flags = append(flags.proto.Flags, "--plugin="+path.String()) 170*333d2b36SAndroid Build Coastguard Worker } 171*333d2b36SAndroid Build Coastguard Worker } 172*333d2b36SAndroid Build Coastguard Worker 173*333d2b36SAndroid Build Coastguard Worker return flags 174*333d2b36SAndroid Build Coastguard Worker} 175