diff options
Diffstat (limited to 'android/proto.go')
-rw-r--r-- | android/proto.go | 61 |
1 files changed, 60 insertions, 1 deletions
diff --git a/android/proto.go b/android/proto.go index 0be7893c8..64d4d057c 100644 --- a/android/proto.go +++ b/android/proto.go @@ -15,12 +15,17 @@ package android import ( + "android/soong/bazel" "strings" "github.com/google/blueprint" "github.com/google/blueprint/proptools" ) +const ( + canonicalPathFromRootDefault = true +) + // 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 @@ -90,7 +95,7 @@ func GetProtoFlags(ctx ModuleContext, p *ProtoProperties) ProtoFlags { Flags: flags, Deps: deps, OutTypeFlag: protoOutFlag, - CanonicalPathFromRoot: proptools.BoolDefault(p.Proto.Canonical_path_from_root, true), + CanonicalPathFromRoot: proptools.BoolDefault(p.Proto.Canonical_path_from_root, canonicalPathFromRootDefault), Dir: PathForModuleGen(ctx, "proto"), SubDir: PathForModuleGen(ctx, "proto", ctx.ModuleDir()), } @@ -146,3 +151,57 @@ func ProtoRule(rule *RuleBuilder, protoFile Path, flags ProtoFlags, deps Paths, rule.Command(). BuiltTool("dep_fixer").Flag(depFile.String()) } + +// Bp2buildProtoInfo contains information necessary to pass on to language specific conversion. +type Bp2buildProtoInfo struct { + Type *string + Name string +} + +type protoAttrs struct { + Srcs bazel.LabelListAttribute + Strip_import_prefix *string +} + +// Bp2buildProtoProperties converts proto properties, creating a proto_library and returning the +// information necessary for language-specific handling. +func Bp2buildProtoProperties(ctx Bp2buildMutatorContext, module Module, srcs bazel.LabelListAttribute) (Bp2buildProtoInfo, bool) { + var info Bp2buildProtoInfo + if srcs.IsEmpty() { + return info, false + } + m := module.base() + + info.Name = m.Name() + "_proto" + attrs := protoAttrs{ + Srcs: srcs, + } + + for axis, configToProps := range m.GetArchVariantProperties(ctx, &ProtoProperties{}) { + for _, rawProps := range configToProps { + var props *ProtoProperties + var ok bool + if props, ok = rawProps.(*ProtoProperties); !ok { + ctx.ModuleErrorf("Could not cast ProtoProperties to expected type") + } + if axis == bazel.NoConfigAxis { + info.Type = props.Proto.Type + + if proptools.BoolDefault(props.Proto.Canonical_path_from_root, canonicalPathFromRootDefault) { + // an empty string indicates to strips the package path + path := "" + attrs.Strip_import_prefix = &path + } + } else if props.Proto.Type != info.Type && props.Proto.Type != nil { + ctx.ModuleErrorf("Cannot handle arch-variant types for protos at this time.") + } + } + } + + ctx.CreateBazelTargetModule( + bazel.BazelTargetModuleProperties{Rule_class: "proto_library"}, + CommonAttributes{Name: info.Name}, + &attrs) + + return info, true +} |