blob: 22e50ab48fe3f577362ac7531d41a8ac1e8da5da [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"
Colin Cross0c461f12016-10-20 16:11:43 -070022
23 "android/soong/android"
24)
25
Colin Cross6af17aa2017-09-20 12:59:05 -070026func init() {
27 pctx.HostBinToolVariable("protocCmd", "aprotoc")
28}
29
30var (
31 proto = pctx.AndroidStaticRule("protoc",
32 blueprint.RuleParams{
Dan Willemsenab9f4262018-02-14 13:58:34 -080033 Command: "$protocCmd --cpp_out=$protoOutParams:$outDir -I $protoBase $protoFlags $in",
Colin Cross6af17aa2017-09-20 12:59:05 -070034 CommandDeps: []string{"$protocCmd"},
Dan Willemsenab9f4262018-02-14 13:58:34 -080035 }, "protoFlags", "protoOutParams", "protoBase", "outDir")
Colin Cross6af17aa2017-09-20 12:59:05 -070036)
37
38// genProto creates a rule to convert a .proto file to generated .pb.cc and .pb.h files and returns
39// the paths to the generated files.
40func genProto(ctx android.ModuleContext, protoFile android.Path,
Dan Willemsenab9f4262018-02-14 13:58:34 -080041 protoFlags, protoOutParams string, root bool) (ccFile, headerFile android.WritablePath) {
Colin Cross6af17aa2017-09-20 12:59:05 -070042
Dan Willemsenab9f4262018-02-14 13:58:34 -080043 var protoBase string
44 if root {
45 protoBase = "."
46 ccFile = android.GenPathWithExt(ctx, "proto", protoFile, "pb.cc")
47 headerFile = android.GenPathWithExt(ctx, "proto", protoFile, "pb.h")
48 } else {
49 rel := protoFile.Rel()
50 protoBase = strings.TrimSuffix(protoFile.String(), rel)
51 ccFile = android.PathForModuleGen(ctx, "proto", pathtools.ReplaceExtension(rel, "pb.cc"))
52 headerFile = android.PathForModuleGen(ctx, "proto", pathtools.ReplaceExtension(rel, "pb.h"))
53 }
Colin Cross6af17aa2017-09-20 12:59:05 -070054
Colin Crossae887032017-10-23 17:16:14 -070055 ctx.Build(pctx, android.BuildParams{
Colin Cross6af17aa2017-09-20 12:59:05 -070056 Rule: proto,
57 Description: "protoc " + protoFile.Rel(),
58 Outputs: android.WritablePaths{ccFile, headerFile},
59 Input: protoFile,
60 Args: map[string]string{
Joe Onorato09e94ab2017-11-18 18:23:14 -080061 "outDir": android.ProtoDir(ctx).String(),
62 "protoFlags": protoFlags,
63 "protoOutParams": protoOutParams,
Dan Willemsenab9f4262018-02-14 13:58:34 -080064 "protoBase": protoBase,
Colin Cross6af17aa2017-09-20 12:59:05 -070065 },
66 })
67
68 return ccFile, headerFile
69}
70
Colin Cross38f794e2017-09-07 10:53:07 -070071func protoDeps(ctx BaseModuleContext, deps Deps, p *android.ProtoProperties, static bool) Deps {
Colin Cross0c461f12016-10-20 16:11:43 -070072 var lib string
Colin Cross0c461f12016-10-20 16:11:43 -070073
Nan Zhang0007d812017-11-07 10:57:05 -080074 switch String(p.Proto.Type) {
Colin Cross0c461f12016-10-20 16:11:43 -070075 case "full":
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -070076 if ctx.useSdk() {
Colin Cross0c461f12016-10-20 16:11:43 -070077 lib = "libprotobuf-cpp-full-ndk"
78 static = true
79 } else {
80 lib = "libprotobuf-cpp-full"
81 }
82 case "lite", "":
Jeff Gastonaf3cc2d2017-09-27 17:01:44 -070083 if ctx.useSdk() {
Colin Cross0c461f12016-10-20 16:11:43 -070084 lib = "libprotobuf-cpp-lite-ndk"
85 static = true
86 } else {
87 lib = "libprotobuf-cpp-lite"
Colin Cross0c461f12016-10-20 16:11:43 -070088 }
89 default:
Colin Cross5ff51b52017-05-02 13:34:32 -070090 ctx.PropertyErrorf("proto.type", "unknown proto type %q",
Nan Zhang0007d812017-11-07 10:57:05 -080091 String(p.Proto.Type))
Colin Cross0c461f12016-10-20 16:11:43 -070092 }
93
94 if static {
95 deps.StaticLibs = append(deps.StaticLibs, lib)
96 deps.ReexportStaticLibHeaders = append(deps.ReexportStaticLibHeaders, lib)
97 } else {
98 deps.SharedLibs = append(deps.SharedLibs, lib)
99 deps.ReexportSharedLibHeaders = append(deps.ReexportSharedLibHeaders, lib)
100 }
101
102 return deps
103}
104
Colin Cross38f794e2017-09-07 10:53:07 -0700105func protoFlags(ctx ModuleContext, flags Flags, p *android.ProtoProperties) Flags {
Colin Cross0c461f12016-10-20 16:11:43 -0700106 flags.CFlags = append(flags.CFlags, "-DGOOGLE_PROTOBUF_NO_RTTI")
Dan Willemsenab9f4262018-02-14 13:58:34 -0800107
108 flags.ProtoRoot = android.ProtoCanonicalPathFromRoot(ctx, p)
109 if flags.ProtoRoot {
110 flags.GlobalFlags = append(flags.GlobalFlags, "-I"+android.ProtoSubDir(ctx).String())
111 }
112 flags.GlobalFlags = append(flags.GlobalFlags, "-I"+android.ProtoDir(ctx).String())
Colin Cross0c461f12016-10-20 16:11:43 -0700113
Colin Cross38f794e2017-09-07 10:53:07 -0700114 flags.protoFlags = android.ProtoFlags(ctx, p)
Colin Cross5ff51b52017-05-02 13:34:32 -0700115
Colin Crossff3ae9d2018-04-10 16:15:18 -0700116 if String(p.Proto.Type) == "lite" {
Kweku Adamsfb5b31c2018-04-05 17:48:32 -0700117 flags.protoOutParams = append(flags.protoOutParams, "lite")
Joe Onorato09e94ab2017-11-18 18:23:14 -0800118 }
119
Colin Cross0c461f12016-10-20 16:11:43 -0700120 return flags
121}