blob: c53dcf4050db9aa1b2361fe61ede679989ec9bcb [file] [log] [blame]
Colin Cross0c461f12016-10-20 16:11:43 -07001// 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
15package cc
16
17import (
Dan Willemsenab9f4262018-02-14 13:58:34 -080018 "strings"
19
Colin Cross6af17aa2017-09-20 12:59:05 -070020 "github.com/google/blueprint"
Dan Willemsenab9f4262018-02-14 13:58:34 -080021 "github.com/google/blueprint/pathtools"
Joe Onorato09e94ab2017-11-18 18:23:14 -080022 "github.com/google/blueprint/proptools"
Colin Cross0c461f12016-10-20 16:11:43 -070023
24 "android/soong/android"
25)
26
Colin Cross6af17aa2017-09-20 12:59:05 -070027func init() {
28 pctx.HostBinToolVariable("protocCmd", "aprotoc")
29}
30
31var (
32 proto = pctx.AndroidStaticRule("protoc",
33 blueprint.RuleParams{
Dan Willemsenab9f4262018-02-14 13:58:34 -080034 Command: "$protocCmd --cpp_out=$protoOutParams:$outDir -I $protoBase $protoFlags $in",
Colin Cross6af17aa2017-09-20 12:59:05 -070035 CommandDeps: []string{"$protocCmd"},
Dan Willemsenab9f4262018-02-14 13:58:34 -080036 }, "protoFlags", "protoOutParams", "protoBase", "outDir")
Colin Cross6af17aa2017-09-20 12:59:05 -070037)
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.
41func genProto(ctx android.ModuleContext, protoFile android.Path,
Dan Willemsenab9f4262018-02-14 13:58:34 -080042 protoFlags, protoOutParams string, root bool) (ccFile, headerFile android.WritablePath) {
Colin Cross6af17aa2017-09-20 12:59:05 -070043
Dan Willemsenab9f4262018-02-14 13:58:34 -080044 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 }
Colin Cross6af17aa2017-09-20 12:59:05 -070055
Colin Crossae887032017-10-23 17:16:14 -070056 ctx.Build(pctx, android.BuildParams{
Colin Cross6af17aa2017-09-20 12:59:05 -070057 Rule: proto,
58 Description: "protoc " + protoFile.Rel(),
59 Outputs: android.WritablePaths{ccFile, headerFile},
60 Input: protoFile,
61 Args: map[string]string{
Joe Onorato09e94ab2017-11-18 18:23:14 -080062 "outDir": android.ProtoDir(ctx).String(),
63 "protoFlags": protoFlags,
64 "protoOutParams": protoOutParams,
Dan Willemsenab9f4262018-02-14 13:58:34 -080065 "protoBase": protoBase,
Colin Cross6af17aa2017-09-20 12:59:05 -070066 },
67 })
68
69 return ccFile, headerFile
70}
71
Colin Cross38f794e2017-09-07 10:53:07 -070072func protoDeps(ctx BaseModuleContext, deps Deps, p *android.ProtoProperties, static bool) Deps {
Colin Cross0c461f12016-10-20 16:11:43 -070073 var lib string
Colin Cross0c461f12016-10-20 16:11:43 -070074
Nan Zhang0007d812017-11-07 10:57:05 -080075 switch String(p.Proto.Type) {
Colin Cross0c461f12016-10-20 16:11:43 -070076 case "full":
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -070077 if ctx.useSdk() {
Colin Cross0c461f12016-10-20 16:11:43 -070078 lib = "libprotobuf-cpp-full-ndk"
79 static = true
80 } else {
81 lib = "libprotobuf-cpp-full"
82 }
83 case "lite", "":
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -070084 if ctx.useSdk() {
Colin Cross0c461f12016-10-20 16:11:43 -070085 lib = "libprotobuf-cpp-lite-ndk"
86 static = true
87 } else {
88 lib = "libprotobuf-cpp-lite"
Colin Cross0c461f12016-10-20 16:11:43 -070089 }
90 default:
Colin Cross5ff51b52017-05-02 13:34:32 -070091 ctx.PropertyErrorf("proto.type", "unknown proto type %q",
Nan Zhang0007d812017-11-07 10:57:05 -080092 String(p.Proto.Type))
Colin Cross0c461f12016-10-20 16:11:43 -070093 }
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
Colin Cross38f794e2017-09-07 10:53:07 -0700106func protoFlags(ctx ModuleContext, flags Flags, p *android.ProtoProperties) Flags {
Colin Cross0c461f12016-10-20 16:11:43 -0700107 flags.CFlags = append(flags.CFlags, "-DGOOGLE_PROTOBUF_NO_RTTI")
Dan Willemsenab9f4262018-02-14 13:58:34 -0800108
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())
Colin Cross0c461f12016-10-20 16:11:43 -0700114
Colin Cross38f794e2017-09-07 10:53:07 -0700115 flags.protoFlags = android.ProtoFlags(ctx, p)
Colin Cross5ff51b52017-05-02 13:34:32 -0700116
Joe Onorato09e94ab2017-11-18 18:23:14 -0800117 if proptools.String(p.Proto.Type) == "lite" {
118 flags.protoOutParams = []string{"lite"}
119 }
120
Colin Cross0c461f12016-10-20 16:11:43 -0700121 return flags
122}