Support proto modules with external references.
Bug: 236055697 Test: Manual testing and adding new unit tests. Change-Id: I984c0ecb93f0023727a39a3af3921820337bf8c7
This commit is contained in:
@@ -32,10 +32,13 @@ const (
|
||||
Bp2BuildTopLevel = "."
|
||||
)
|
||||
|
||||
// Bp2buildAidlLibrary describes a filegroup module that are converted to aidl_library
|
||||
type Bp2buildAidlLibrary interface {
|
||||
// FileGroupAsLibrary describes a filegroup module that is converted to some library
|
||||
// such as aidl_library or proto_library.
|
||||
type FileGroupAsLibrary interface {
|
||||
ShouldConvertToAidlLibrary(ctx BazelConversionPathContext) bool
|
||||
ShouldConvertToProtoLibrary(ctx BazelConversionPathContext) bool
|
||||
GetAidlLibraryLabel(ctx BazelConversionPathContext) string
|
||||
GetProtoLibraryLabel(ctx BazelConversionPathContext) string
|
||||
}
|
||||
|
||||
type BazelConversionStatus struct {
|
||||
|
@@ -33,6 +33,8 @@ var PrepareForTestWithFilegroup = FixtureRegisterWithContext(func(ctx Registrati
|
||||
ctx.RegisterModuleType("filegroup", FileGroupFactory)
|
||||
})
|
||||
|
||||
var convertedProtoLibrarySuffix = "_bp2build_converted"
|
||||
|
||||
// IsFilegroup checks that a module is a filegroup type
|
||||
func IsFilegroup(ctx bazel.OtherModuleContext, m blueprint.Module) bool {
|
||||
return ctx.OtherModuleType(m) == "filegroup"
|
||||
@@ -117,6 +119,20 @@ func (fg *fileGroup) ConvertWithBp2build(ctx TopDownMutatorContext) {
|
||||
|
||||
ctx.CreateBazelTargetModule(props, CommonAttributes{Name: fg.Name()}, attrs)
|
||||
} else {
|
||||
if fg.ShouldConvertToProtoLibrary(ctx) {
|
||||
attrs := &ProtoAttrs{
|
||||
Srcs: srcs,
|
||||
Strip_import_prefix: fg.properties.Path,
|
||||
}
|
||||
|
||||
ctx.CreateBazelTargetModule(
|
||||
bazel.BazelTargetModuleProperties{Rule_class: "proto_library"},
|
||||
CommonAttributes{Name: fg.Name() + convertedProtoLibrarySuffix},
|
||||
attrs)
|
||||
}
|
||||
|
||||
// TODO(b/242847534): Still convert to a filegroup because other unconverted
|
||||
// modules may depend on the filegroup
|
||||
attrs := &bazelFilegroupAttributes{
|
||||
Srcs: srcs,
|
||||
}
|
||||
@@ -150,14 +166,14 @@ type fileGroupProperties struct {
|
||||
type fileGroup struct {
|
||||
ModuleBase
|
||||
BazelModuleBase
|
||||
Bp2buildAidlLibrary
|
||||
FileGroupAsLibrary
|
||||
properties fileGroupProperties
|
||||
srcs Paths
|
||||
}
|
||||
|
||||
var _ MixedBuildBuildable = (*fileGroup)(nil)
|
||||
var _ SourceFileProducer = (*fileGroup)(nil)
|
||||
var _ Bp2buildAidlLibrary = (*fileGroup)(nil)
|
||||
var _ FileGroupAsLibrary = (*fileGroup)(nil)
|
||||
|
||||
// filegroup contains a list of files that are referenced by other modules
|
||||
// properties (such as "srcs") using the syntax ":<name>". filegroup are
|
||||
@@ -243,11 +259,19 @@ func (fg *fileGroup) ProcessBazelQueryResponse(ctx ModuleContext) {
|
||||
}
|
||||
|
||||
func (fg *fileGroup) ShouldConvertToAidlLibrary(ctx BazelConversionPathContext) bool {
|
||||
return fg.shouldConvertToLibrary(ctx, ".aidl")
|
||||
}
|
||||
|
||||
func (fg *fileGroup) ShouldConvertToProtoLibrary(ctx BazelConversionPathContext) bool {
|
||||
return fg.shouldConvertToLibrary(ctx, ".proto")
|
||||
}
|
||||
|
||||
func (fg *fileGroup) shouldConvertToLibrary(ctx BazelConversionPathContext, suffix string) bool {
|
||||
if len(fg.properties.Srcs) == 0 || !fg.ShouldConvertWithBp2build(ctx) {
|
||||
return false
|
||||
}
|
||||
for _, src := range fg.properties.Srcs {
|
||||
if !strings.HasSuffix(src, ".aidl") {
|
||||
if !strings.HasSuffix(src, suffix) {
|
||||
return false
|
||||
}
|
||||
}
|
||||
@@ -255,6 +279,14 @@ func (fg *fileGroup) ShouldConvertToAidlLibrary(ctx BazelConversionPathContext)
|
||||
}
|
||||
|
||||
func (fg *fileGroup) GetAidlLibraryLabel(ctx BazelConversionPathContext) string {
|
||||
return fg.getFileGroupAsLibraryLabel(ctx)
|
||||
}
|
||||
|
||||
func (fg *fileGroup) GetProtoLibraryLabel(ctx BazelConversionPathContext) string {
|
||||
return fg.getFileGroupAsLibraryLabel(ctx) + convertedProtoLibrarySuffix
|
||||
}
|
||||
|
||||
func (fg *fileGroup) getFileGroupAsLibraryLabel(ctx BazelConversionPathContext) string {
|
||||
if ctx.OtherModuleDir(fg.module) == ctx.ModuleDir() {
|
||||
return ":" + fg.Name()
|
||||
} else {
|
||||
@@ -265,12 +297,19 @@ func (fg *fileGroup) GetAidlLibraryLabel(ctx BazelConversionPathContext) string
|
||||
// Given a name in srcs prop, check to see if the name references a filegroup
|
||||
// and the filegroup is converted to aidl_library
|
||||
func IsConvertedToAidlLibrary(ctx BazelConversionPathContext, name string) bool {
|
||||
if module, ok := ctx.ModuleFromName(name); ok {
|
||||
if IsFilegroup(ctx, module) {
|
||||
if fg, ok := module.(Bp2buildAidlLibrary); ok {
|
||||
return fg.ShouldConvertToAidlLibrary(ctx)
|
||||
}
|
||||
}
|
||||
if fg, ok := ToFileGroupAsLibrary(ctx, name); ok {
|
||||
return fg.ShouldConvertToAidlLibrary(ctx)
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func ToFileGroupAsLibrary(ctx BazelConversionPathContext, name string) (FileGroupAsLibrary, bool) {
|
||||
if module, ok := ctx.ModuleFromName(name); ok {
|
||||
if IsFilegroup(ctx, module) {
|
||||
if fg, ok := module.(FileGroupAsLibrary); ok {
|
||||
return fg, true
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil, false
|
||||
}
|
||||
|
101
android/proto.go
101
android/proto.go
@@ -155,11 +155,12 @@ func ProtoRule(rule *RuleBuilder, protoFile Path, flags ProtoFlags, deps Paths,
|
||||
|
||||
// Bp2buildProtoInfo contains information necessary to pass on to language specific conversion.
|
||||
type Bp2buildProtoInfo struct {
|
||||
Type *string
|
||||
Name string
|
||||
Type *string
|
||||
Name string
|
||||
Proto_libs bazel.LabelList
|
||||
}
|
||||
|
||||
type protoAttrs struct {
|
||||
type ProtoAttrs struct {
|
||||
Srcs bazel.LabelListAttribute
|
||||
Strip_import_prefix *string
|
||||
Deps bazel.LabelListAttribute
|
||||
@@ -179,44 +180,70 @@ func Bp2buildProtoProperties(ctx Bp2buildMutatorContext, m *ModuleBase, srcs baz
|
||||
return info, false
|
||||
}
|
||||
|
||||
info.Name = m.Name() + "_proto"
|
||||
attrs := protoAttrs{
|
||||
Srcs: srcs,
|
||||
}
|
||||
var protoLibraries bazel.LabelList
|
||||
var directProtoSrcs bazel.LabelList
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
for _, dir := range props.Proto.Include_dirs {
|
||||
if dep, ok := includeDirsToProtoDeps[dir]; ok {
|
||||
attrs.Deps.Add(bazel.MakeLabelAttribute(dep))
|
||||
} else {
|
||||
ctx.PropertyErrorf("Could not find the proto_library target for include dir", dir)
|
||||
}
|
||||
}
|
||||
} else if props.Proto.Type != info.Type && props.Proto.Type != nil {
|
||||
ctx.ModuleErrorf("Cannot handle arch-variant types for protos at this time.")
|
||||
}
|
||||
// For filegroups that should be converted to proto_library just collect the
|
||||
// labels of converted proto_library targets.
|
||||
for _, protoSrc := range srcs.Value.Includes {
|
||||
src := protoSrc.OriginalModuleName
|
||||
if fg, ok := ToFileGroupAsLibrary(ctx, src); ok &&
|
||||
fg.ShouldConvertToProtoLibrary(ctx) {
|
||||
protoLibraries.Add(&bazel.Label{
|
||||
Label: fg.GetProtoLibraryLabel(ctx),
|
||||
})
|
||||
} else {
|
||||
directProtoSrcs.Add(&protoSrc)
|
||||
}
|
||||
}
|
||||
|
||||
ctx.CreateBazelTargetModule(
|
||||
bazel.BazelTargetModuleProperties{Rule_class: "proto_library"},
|
||||
CommonAttributes{Name: info.Name},
|
||||
&attrs)
|
||||
info.Name = m.Name() + "_proto"
|
||||
|
||||
if len(directProtoSrcs.Includes) > 0 {
|
||||
attrs := ProtoAttrs{
|
||||
Srcs: bazel.MakeLabelListAttribute(directProtoSrcs),
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
for _, dir := range props.Proto.Include_dirs {
|
||||
if dep, ok := includeDirsToProtoDeps[dir]; ok {
|
||||
attrs.Deps.Add(bazel.MakeLabelAttribute(dep))
|
||||
} else {
|
||||
ctx.PropertyErrorf("Could not find the proto_library target for include dir", dir)
|
||||
}
|
||||
}
|
||||
} 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)
|
||||
|
||||
protoLibraries.Add(&bazel.Label{
|
||||
Label: ":" + info.Name,
|
||||
})
|
||||
}
|
||||
|
||||
info.Proto_libs = protoLibraries
|
||||
|
||||
return info, true
|
||||
}
|
||||
|
Reference in New Issue
Block a user