github.com/westcoastroms/westcoastroms-build@v0.0.0-20190928114312-2350e5a73030/build/soong/cc/proto.go (about) 1 // Copyright 2016 Google Inc. All rights reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package cc 16 17 import ( 18 "strings" 19 20 "github.com/google/blueprint" 21 "github.com/google/blueprint/pathtools" 22 "github.com/google/blueprint/proptools" 23 24 "android/soong/android" 25 ) 26 27 func init() { 28 pctx.HostBinToolVariable("protocCmd", "aprotoc") 29 } 30 31 var ( 32 proto = pctx.AndroidStaticRule("protoc", 33 blueprint.RuleParams{ 34 Command: "$protocCmd --cpp_out=$protoOutParams:$outDir -I $protoBase $protoFlags $in", 35 CommandDeps: []string{"$protocCmd"}, 36 }, "protoFlags", "protoOutParams", "protoBase", "outDir") 37 ) 38 39 // genProto creates a rule to convert a .proto file to generated .pb.cc and .pb.h files and returns 40 // the paths to the generated files. 41 func genProto(ctx android.ModuleContext, protoFile android.Path, 42 protoFlags, protoOutParams string, root bool) (ccFile, headerFile android.WritablePath) { 43 44 var protoBase string 45 if root { 46 protoBase = "." 47 ccFile = android.GenPathWithExt(ctx, "proto", protoFile, "pb.cc") 48 headerFile = android.GenPathWithExt(ctx, "proto", protoFile, "pb.h") 49 } else { 50 rel := protoFile.Rel() 51 protoBase = strings.TrimSuffix(protoFile.String(), rel) 52 ccFile = android.PathForModuleGen(ctx, "proto", pathtools.ReplaceExtension(rel, "pb.cc")) 53 headerFile = android.PathForModuleGen(ctx, "proto", pathtools.ReplaceExtension(rel, "pb.h")) 54 } 55 56 ctx.Build(pctx, android.BuildParams{ 57 Rule: proto, 58 Description: "protoc " + protoFile.Rel(), 59 Outputs: android.WritablePaths{ccFile, headerFile}, 60 Input: protoFile, 61 Args: map[string]string{ 62 "outDir": android.ProtoDir(ctx).String(), 63 "protoFlags": protoFlags, 64 "protoOutParams": protoOutParams, 65 "protoBase": protoBase, 66 }, 67 }) 68 69 return ccFile, headerFile 70 } 71 72 func protoDeps(ctx BaseModuleContext, deps Deps, p *android.ProtoProperties, static bool) Deps { 73 var lib string 74 75 switch String(p.Proto.Type) { 76 case "full": 77 if ctx.useSdk() { 78 lib = "libprotobuf-cpp-full-ndk" 79 static = true 80 } else { 81 lib = "libprotobuf-cpp-full" 82 } 83 case "lite", "": 84 if ctx.useSdk() { 85 lib = "libprotobuf-cpp-lite-ndk" 86 static = true 87 } else { 88 lib = "libprotobuf-cpp-lite" 89 } 90 default: 91 ctx.PropertyErrorf("proto.type", "unknown proto type %q", 92 String(p.Proto.Type)) 93 } 94 95 if static { 96 deps.StaticLibs = append(deps.StaticLibs, lib) 97 deps.ReexportStaticLibHeaders = append(deps.ReexportStaticLibHeaders, lib) 98 } else { 99 deps.SharedLibs = append(deps.SharedLibs, lib) 100 deps.ReexportSharedLibHeaders = append(deps.ReexportSharedLibHeaders, lib) 101 } 102 103 return deps 104 } 105 106 func protoFlags(ctx ModuleContext, flags Flags, p *android.ProtoProperties) Flags { 107 flags.CFlags = append(flags.CFlags, "-DGOOGLE_PROTOBUF_NO_RTTI") 108 109 flags.ProtoRoot = android.ProtoCanonicalPathFromRoot(ctx, p) 110 if flags.ProtoRoot { 111 flags.GlobalFlags = append(flags.GlobalFlags, "-I"+android.ProtoSubDir(ctx).String()) 112 } 113 flags.GlobalFlags = append(flags.GlobalFlags, "-I"+android.ProtoDir(ctx).String()) 114 115 flags.protoFlags = android.ProtoFlags(ctx, p) 116 117 if proptools.String(p.Proto.Type) == "lite" { 118 flags.protoOutParams = append(flags.protoOutParams, "lite") 119 } 120 121 return flags 122 }