aboutsummaryrefslogtreecommitdiffstats
path: root/cc/proto.go
diff options
context:
space:
mode:
Diffstat (limited to 'cc/proto.go')
-rw-r--r--cc/proto.go131
1 files changed, 131 insertions, 0 deletions
diff --git a/cc/proto.go b/cc/proto.go
new file mode 100644
index 00000000..3d3ca59f
--- /dev/null
+++ b/cc/proto.go
@@ -0,0 +1,131 @@
+// Copyright 2016 Google Inc. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package cc
+
+import (
+ "strings"
+
+ "github.com/google/blueprint"
+
+ "android/soong/android"
+)
+
+func init() {
+ pctx.HostBinToolVariable("protocCmd", "aprotoc")
+}
+
+var (
+ proto = pctx.AndroidStaticRule("protoc",
+ blueprint.RuleParams{
+ Command: "$protocCmd --cpp_out=$outDir $protoFlags $in",
+ CommandDeps: []string{"$protocCmd"},
+ Description: "protoc $out",
+ }, "protoFlags", "outDir")
+)
+
+// TODO(ccross): protos are often used to communicate between multiple modules. If the only
+// way to convert a proto to source is to reference it as a source file, and external modules cannot
+// reference source files in other modules, then every module that owns a proto file will need to
+// export a library for every type of external user (lite vs. full, c vs. c++ vs. java). It would
+// be better to support a proto module type that exported a proto file along with some include dirs,
+// and then external modules could depend on the proto module but use their own settings to
+// generate the source.
+
+func genProto(ctx android.ModuleContext, protoFile android.Path,
+ protoFlags string) (android.ModuleGenPath, android.ModuleGenPath) {
+
+ outDir := android.PathForModuleGen(ctx, "proto")
+ baseName := strings.TrimSuffix(protoFile.Base(), protoFile.Ext())
+
+ outFile := android.PathForModuleGen(ctx, "proto", ctx.ModuleDir(), baseName+".pb.cc")
+ headerFile := android.PathForModuleGen(ctx, "proto", ctx.ModuleDir(), baseName+".pb.h")
+ ctx.ModuleBuild(pctx, android.ModuleBuildParams{
+ Rule: proto,
+ Outputs: android.WritablePaths{outFile, headerFile},
+ Input: protoFile,
+ Args: map[string]string{
+ "outDir": outDir.String(),
+ "protoFlags": protoFlags,
+ },
+ })
+
+ return outFile, headerFile
+}
+
+// protoDir returns the module's "gen/proto" directory
+func protoDir(ctx android.ModuleContext) android.ModuleGenPath {
+ return android.PathForModuleGen(ctx, "proto")
+}
+
+// protoSubDir returns the module's "gen/proto/path/to/module" directory
+func protoSubDir(ctx android.ModuleContext) android.ModuleGenPath {
+ return android.PathForModuleGen(ctx, "proto", ctx.ModuleDir())
+}
+
+type ProtoProperties struct {
+ Proto struct {
+ // Proto generator type (full, lite)
+ Type string
+ // Link statically against the protobuf runtime
+ Static bool
+ }
+}
+
+func protoDeps(ctx BaseModuleContext, deps Deps, p *ProtoProperties) Deps {
+ var lib string
+ var static bool
+
+ switch p.Proto.Type {
+ case "full":
+ if ctx.sdk() {
+ lib = "libprotobuf-cpp-full-ndk"
+ static = true
+ } else {
+ lib = "libprotobuf-cpp-full"
+ }
+ case "lite", "":
+ if ctx.sdk() {
+ lib = "libprotobuf-cpp-lite-ndk"
+ static = true
+ } else {
+ lib = "libprotobuf-cpp-lite"
+ if p.Proto.Static {
+ static = true
+ }
+ }
+ default:
+ ctx.PropertyErrorf("proto.type", "unknown proto type %q", p.Proto.Type)
+ }
+
+ if static {
+ deps.StaticLibs = append(deps.StaticLibs, lib)
+ deps.ReexportStaticLibHeaders = append(deps.ReexportStaticLibHeaders, lib)
+ } else {
+ deps.SharedLibs = append(deps.SharedLibs, lib)
+ deps.ReexportSharedLibHeaders = append(deps.ReexportSharedLibHeaders, lib)
+ }
+
+ return deps
+}
+
+func protoFlags(ctx ModuleContext, flags Flags, p *ProtoProperties) Flags {
+ flags.CFlags = append(flags.CFlags, "-DGOOGLE_PROTOBUF_NO_RTTI")
+ flags.GlobalFlags = append(flags.GlobalFlags,
+ "-I"+protoSubDir(ctx).String(),
+ "-I"+protoDir(ctx).String(),
+ )
+
+ return flags
+}