aboutsummaryrefslogtreecommitdiffstats
path: root/android
diff options
context:
space:
mode:
authorColin Cross <ccross@android.com>2019-03-28 19:30:56 -0700
committerColin Cross <ccross@android.com>2019-04-02 16:38:55 +0000
commitfe17f6f0e825b42542b4527c19cdd7b520ca5133 (patch)
tree496b65489ee342024f22129edd4ad98e21ac1f33 /android
parent19878da6a062ef474a1c905f48b1efb986862050 (diff)
downloadbuild_soong-fe17f6f0e825b42542b4527c19cdd7b520ca5133.tar.gz
build_soong-fe17f6f0e825b42542b4527c19cdd7b520ca5133.tar.bz2
build_soong-fe17f6f0e825b42542b4527c19cdd7b520ca5133.zip
Add support for protoc plugins
Add a proto.plugin property to allow specifying a custom protoc plugin to generate the code. Fixes: 70706119 Test: m am StreamingProtoTest Change-Id: I1ecdd346284b42bbcc8297019d98d2cd564eb94c
Diffstat (limited to 'android')
-rw-r--r--android/module.go4
-rw-r--r--android/proto.go52
2 files changed, 52 insertions, 4 deletions
diff --git a/android/module.go b/android/module.go
index abf2cae4..201c27a8 100644
--- a/android/module.go
+++ b/android/module.go
@@ -1425,6 +1425,10 @@ type SourceFileProducer interface {
Srcs() Paths
}
+type HostToolProvider interface {
+ HostToolPath() OptionalPath
+}
+
// Returns a list of paths expanded from globs and modules referenced using ":module" syntax. The property must
// be tagged with `android:"path" to support automatic source module dependency resolution.
//
diff --git a/android/proto.go b/android/proto.go
index 83dc32a9..5247c68d 100644
--- a/android/proto.go
+++ b/android/proto.go
@@ -17,6 +17,7 @@ package android
import (
"strings"
+ "github.com/google/blueprint"
"github.com/google/blueprint/proptools"
)
@@ -35,21 +36,61 @@ type ProtoFlags struct {
SubDir ModuleGenPath
OutTypeFlag string
OutParams []string
+ Deps Paths
+}
+
+type protoDependencyTag struct {
+ blueprint.BaseDependencyTag
+ name string
+}
+
+var ProtoPluginDepTag = protoDependencyTag{name: "plugin"}
+
+func ProtoDeps(ctx BottomUpMutatorContext, p *ProtoProperties) {
+ if String(p.Proto.Plugin) != "" && String(p.Proto.Type) != "" {
+ ctx.ModuleErrorf("only one of proto.type and proto.plugin can be specified.")
+ }
+
+ if plugin := String(p.Proto.Plugin); plugin != "" {
+ ctx.AddFarVariationDependencies([]blueprint.Variation{
+ {Mutator: "arch", Variation: ctx.Config().BuildOsVariant},
+ }, ProtoPluginDepTag, "protoc-gen-"+plugin)
+ }
}
func GetProtoFlags(ctx ModuleContext, p *ProtoProperties) ProtoFlags {
- var protoFlags []string
+ var flags []string
+ var deps Paths
+
if len(p.Proto.Local_include_dirs) > 0 {
localProtoIncludeDirs := PathsForModuleSrc(ctx, p.Proto.Local_include_dirs)
- protoFlags = append(protoFlags, JoinWithPrefix(localProtoIncludeDirs.Strings(), "-I"))
+ flags = append(flags, JoinWithPrefix(localProtoIncludeDirs.Strings(), "-I"))
}
if len(p.Proto.Include_dirs) > 0 {
rootProtoIncludeDirs := PathsForSource(ctx, p.Proto.Include_dirs)
- protoFlags = append(protoFlags, JoinWithPrefix(rootProtoIncludeDirs.Strings(), "-I"))
+ flags = append(flags, JoinWithPrefix(rootProtoIncludeDirs.Strings(), "-I"))
+ }
+
+ ctx.VisitDirectDepsWithTag(ProtoPluginDepTag, func(dep Module) {
+ if hostTool, ok := dep.(HostToolProvider); !ok || !hostTool.HostToolPath().Valid() {
+ ctx.PropertyErrorf("proto.plugin", "module %q is not a host tool provider",
+ ctx.OtherModuleName(dep))
+ } else {
+ plugin := String(p.Proto.Plugin)
+ deps = append(deps, hostTool.HostToolPath().Path())
+ flags = append(flags, "--plugin=protoc-gen-"+plugin+"="+hostTool.HostToolPath().String())
+ }
+ })
+
+ var protoOutFlag string
+ if plugin := String(p.Proto.Plugin); plugin != "" {
+ protoOutFlag = "--" + plugin + "_out"
}
return ProtoFlags{
- Flags: protoFlags,
+ Flags: flags,
+ Deps: deps,
+ OutTypeFlag: protoOutFlag,
CanonicalPathFromRoot: proptools.BoolDefault(p.Proto.Canonical_path_from_root, true),
Dir: PathForModuleGen(ctx, "proto"),
SubDir: PathForModuleGen(ctx, "proto", ctx.ModuleDir()),
@@ -61,6 +102,9 @@ type ProtoProperties struct {
// Proto generator type. C++: full or lite. Java: micro, nano, stream, or lite.
Type *string `android:"arch_variant"`
+ // Proto plugin to use as the generator. Must be a cc_binary_host module.
+ Plugin *string `android:"arch_variant"`
+
// list of directories that will be added to the protoc include paths.
Include_dirs []string