Merge "Refactor BazelTargetModule"

This commit is contained in:
Treehugger Robot 2021-02-23 20:40:23 +00:00 committed by Gerrit Code Review
commit 30899caf1f
10 changed files with 85 additions and 102 deletions

View File

@ -57,9 +57,9 @@ func FilegroupBp2Build(ctx TopDownMutatorContext) {
Srcs: BazelLabelForModuleSrcExcludes(ctx, fg.properties.Srcs, fg.properties.Exclude_srcs), Srcs: BazelLabelForModuleSrcExcludes(ctx, fg.properties.Srcs, fg.properties.Exclude_srcs),
} }
props := bazel.NewBazelTargetModuleProperties(fg.Name(), "filegroup", "") props := bazel.BazelTargetModuleProperties{Rule_class: "filegroup"}
ctx.CreateBazelTargetModule(BazelFileGroupFactory, props, attrs) ctx.CreateBazelTargetModule(BazelFileGroupFactory, fg.Name(), props, attrs)
} }
type fileGroupProperties struct { type fileGroupProperties struct {

View File

@ -507,13 +507,17 @@ type Module interface {
type BazelTargetModule interface { type BazelTargetModule interface {
Module Module
BazelTargetModuleProperties() *bazel.BazelTargetModuleProperties bazelTargetModuleProperties() *bazel.BazelTargetModuleProperties
SetBazelTargetModuleProperties(props bazel.BazelTargetModuleProperties)
RuleClass() string
BzlLoadLocation() string
} }
// InitBazelTargetModule is a wrapper function that decorates BazelTargetModule // InitBazelTargetModule is a wrapper function that decorates BazelTargetModule
// with property structs containing metadata for bp2build conversion. // with property structs containing metadata for bp2build conversion.
func InitBazelTargetModule(module BazelTargetModule) { func InitBazelTargetModule(module BazelTargetModule) {
module.AddProperties(module.BazelTargetModuleProperties()) module.AddProperties(module.bazelTargetModuleProperties())
InitAndroidModule(module) InitAndroidModule(module)
} }
@ -524,11 +528,26 @@ type BazelTargetModuleBase struct {
Properties bazel.BazelTargetModuleProperties Properties bazel.BazelTargetModuleProperties
} }
// BazelTargetModuleProperties getter. // bazelTargetModuleProperties getter.
func (btmb *BazelTargetModuleBase) BazelTargetModuleProperties() *bazel.BazelTargetModuleProperties { func (btmb *BazelTargetModuleBase) bazelTargetModuleProperties() *bazel.BazelTargetModuleProperties {
return &btmb.Properties return &btmb.Properties
} }
// SetBazelTargetModuleProperties setter for BazelTargetModuleProperties
func (btmb *BazelTargetModuleBase) SetBazelTargetModuleProperties(props bazel.BazelTargetModuleProperties) {
btmb.Properties = props
}
// RuleClass returns the rule class for this Bazel target
func (b *BazelTargetModuleBase) RuleClass() string {
return b.bazelTargetModuleProperties().Rule_class
}
// BzlLoadLocation returns the rule class for this Bazel target
func (b *BazelTargetModuleBase) BzlLoadLocation() string {
return b.bazelTargetModuleProperties().Bzl_load_location
}
// Qualified id for a module // Qualified id for a module
type qualifiedModuleName struct { type qualifiedModuleName struct {
// The package (i.e. directory) in which the module is defined, without trailing / // The package (i.e. directory) in which the module is defined, without trailing /

View File

@ -283,7 +283,7 @@ type TopDownMutatorContext interface {
// factory method, just like in CreateModule, but also requires // factory method, just like in CreateModule, but also requires
// BazelTargetModuleProperties containing additional metadata for the // BazelTargetModuleProperties containing additional metadata for the
// bp2build codegenerator. // bp2build codegenerator.
CreateBazelTargetModule(ModuleFactory, bazel.BazelTargetModuleProperties, interface{}) BazelTargetModule CreateBazelTargetModule(ModuleFactory, string, bazel.BazelTargetModuleProperties, interface{}) BazelTargetModule
} }
type topDownMutatorContext struct { type topDownMutatorContext struct {
@ -513,17 +513,25 @@ func registerDepsMutatorBp2Build(ctx RegisterMutatorsContext) {
func (t *topDownMutatorContext) CreateBazelTargetModule( func (t *topDownMutatorContext) CreateBazelTargetModule(
factory ModuleFactory, factory ModuleFactory,
name string,
bazelProps bazel.BazelTargetModuleProperties, bazelProps bazel.BazelTargetModuleProperties,
attrs interface{}) BazelTargetModule { attrs interface{}) BazelTargetModule {
if !strings.HasPrefix(*bazelProps.Name, bazel.BazelTargetModuleNamePrefix) { if strings.HasPrefix(name, bazel.BazelTargetModuleNamePrefix) {
panic(fmt.Errorf( panic(fmt.Errorf(
"bp2build error: the bazel target module name must start with '%s': %s", "The %s name prefix is added automatically, do not set it manually: %s",
bazel.BazelTargetModuleNamePrefix, bazel.BazelTargetModuleNamePrefix,
*bazelProps.Name, name))
)) }
name = bazel.BazelTargetModuleNamePrefix + name
nameProp := struct {
Name *string
}{
Name: &name,
} }
return t.CreateModule(factory, &bazelProps, attrs).(BazelTargetModule) b := t.CreateModule(factory, &nameProp, attrs).(BazelTargetModule)
b.SetBazelTargetModuleProperties(bazelProps)
return b
} }
func (t *topDownMutatorContext) AppendProperties(props ...interface{}) { func (t *topDownMutatorContext) AppendProperties(props ...interface{}) {

View File

@ -14,11 +14,6 @@
package bazel package bazel
import (
"fmt"
"strings"
)
type bazelModuleProperties struct { type bazelModuleProperties struct {
// The label of the Bazel target replacing this Soong module. // The label of the Bazel target replacing this Soong module.
Label string Label string
@ -37,32 +32,15 @@ type Properties struct {
// BazelTargetModuleProperties contain properties and metadata used for // BazelTargetModuleProperties contain properties and metadata used for
// Blueprint to BUILD file conversion. // Blueprint to BUILD file conversion.
type BazelTargetModuleProperties struct { type BazelTargetModuleProperties struct {
Name *string
// The Bazel rule class for this target. // The Bazel rule class for this target.
Rule_class string Rule_class string `blueprint:"mutated"`
// The target label for the bzl file containing the definition of the rule class. // The target label for the bzl file containing the definition of the rule class.
Bzl_load_location string Bzl_load_location string `blueprint:"mutated"`
} }
const BazelTargetModuleNamePrefix = "__bp2build__" const BazelTargetModuleNamePrefix = "__bp2build__"
func NewBazelTargetModuleProperties(name string, ruleClass string, bzlLoadLocation string) BazelTargetModuleProperties {
if strings.HasPrefix(name, BazelTargetModuleNamePrefix) {
panic(fmt.Errorf(
"The %s name prefix is added automatically, do not set it manually: %s",
BazelTargetModuleNamePrefix,
name))
}
name = BazelTargetModuleNamePrefix + name
return BazelTargetModuleProperties{
Name: &name,
Rule_class: ruleClass,
Bzl_load_location: bzlLoadLocation,
}
}
// Label is used to represent a Bazel compatible Label. Also stores the original bp text to support // Label is used to represent a Bazel compatible Label. Also stores the original bp text to support
// string replacement. // string replacement.
type Label struct { type Label struct {

View File

@ -19,7 +19,6 @@ import (
"android/soong/bazel" "android/soong/bazel"
"fmt" "fmt"
"reflect" "reflect"
"strconv"
"strings" "strings"
"github.com/google/blueprint" "github.com/google/blueprint"
@ -178,13 +177,14 @@ func GenerateBazelTargets(ctx CodegenContext) (map[string]BazelTargets, CodegenM
switch ctx.Mode() { switch ctx.Mode() {
case Bp2Build: case Bp2Build:
if _, ok := m.(android.BazelTargetModule); !ok { if b, ok := m.(android.BazelTargetModule); !ok {
// Only include regular Soong modules (non-BazelTargetModules) into the total count. // Only include regular Soong modules (non-BazelTargetModules) into the total count.
totalModuleCount += 1 totalModuleCount += 1
return return
} else {
t = generateBazelTarget(bpCtx, m, b)
ruleClassCount[t.ruleClass] += 1
} }
t = generateBazelTarget(bpCtx, m)
ruleClassCount[t.ruleClass] += 1
case QueryView: case QueryView:
// Blocklist certain module types from being generated. // Blocklist certain module types from being generated.
if canonicalizeModuleType(bpCtx.ModuleType(m)) == "package" { if canonicalizeModuleType(bpCtx.ModuleType(m)) == "package" {
@ -208,36 +208,13 @@ func GenerateBazelTargets(ctx CodegenContext) (map[string]BazelTargets, CodegenM
return buildFileToTargets, metrics return buildFileToTargets, metrics
} }
// Helper method to trim quotes around strings. func generateBazelTarget(ctx bpToBuildContext, m blueprint.Module, b android.BazelTargetModule) BazelTarget {
func trimQuotes(s string) string { ruleClass := b.RuleClass()
if s == "" { bzlLoadLocation := b.BzlLoadLocation()
// strconv.Unquote would error out on empty strings, but this method
// allows them, so return the empty string directly.
return ""
}
ret, err := strconv.Unquote(s)
if err != nil {
// Panic the error immediately.
panic(fmt.Errorf("Trying to unquote '%s', but got error: %s", s, err))
}
return ret
}
func generateBazelTarget(ctx bpToBuildContext, m blueprint.Module) BazelTarget {
// extract the bazel attributes from the module. // extract the bazel attributes from the module.
props := getBuildProperties(ctx, m) props := getBuildProperties(ctx, m)
// extract the rule class name from the attributes. Since the string value
// will be string-quoted, remove the quotes here.
ruleClass := trimQuotes(props.Attrs["rule_class"])
// Delete it from being generated in the BUILD file.
delete(props.Attrs, "rule_class")
// extract the bzl_load_location, and also remove the quotes around it here.
bzlLoadLocation := trimQuotes(props.Attrs["bzl_load_location"])
// Delete it from being generated in the BUILD file.
delete(props.Attrs, "bzl_load_location")
delete(props.Attrs, "bp2build_available") delete(props.Attrs, "bp2build_available")
// Return the Bazel target with rule class and attributes, ready to be // Return the Bazel target with rule class and attributes, ready to be

View File

@ -136,9 +136,11 @@ func customBp2BuildMutator(ctx android.TopDownMutatorContext) {
String_list_prop: m.props.String_list_prop, String_list_prop: m.props.String_list_prop,
} }
props := bazel.NewBazelTargetModuleProperties(m.Name(), "custom", "") props := bazel.BazelTargetModuleProperties{
Rule_class: "custom",
}
ctx.CreateBazelTargetModule(customBazelModuleFactory, props, attrs) ctx.CreateBazelTargetModule(customBazelModuleFactory, m.Name(), props, attrs)
} }
} }
@ -153,26 +155,23 @@ func customBp2BuildMutatorFromStarlark(ctx android.TopDownMutatorContext) {
baseName := m.Name() baseName := m.Name()
attrs := &customBazelModuleAttributes{} attrs := &customBazelModuleAttributes{}
myLibraryProps := bazel.NewBazelTargetModuleProperties( myLibraryProps := bazel.BazelTargetModuleProperties{
baseName, Rule_class: "my_library",
"my_library", Bzl_load_location: "//build/bazel/rules:rules.bzl",
"//build/bazel/rules:rules.bzl", }
) ctx.CreateBazelTargetModule(customBazelModuleFactory, baseName, myLibraryProps, attrs)
ctx.CreateBazelTargetModule(customBazelModuleFactory, myLibraryProps, attrs)
protoLibraryProps := bazel.NewBazelTargetModuleProperties( protoLibraryProps := bazel.BazelTargetModuleProperties{
baseName+"_proto_library_deps", Rule_class: "proto_library",
"proto_library", Bzl_load_location: "//build/bazel/rules:proto.bzl",
"//build/bazel/rules:proto.bzl", }
) ctx.CreateBazelTargetModule(customBazelModuleFactory, baseName+"_proto_library_deps", protoLibraryProps, attrs)
ctx.CreateBazelTargetModule(customBazelModuleFactory, protoLibraryProps, attrs)
myProtoLibraryProps := bazel.NewBazelTargetModuleProperties( myProtoLibraryProps := bazel.BazelTargetModuleProperties{
baseName+"_my_proto_library_deps", Rule_class: "my_proto_library",
"my_proto_library", Bzl_load_location: "//build/bazel/rules:proto.bzl",
"//build/bazel/rules:proto.bzl", }
) ctx.CreateBazelTargetModule(customBazelModuleFactory, baseName+"_my_proto_library_deps", myProtoLibraryProps, attrs)
ctx.CreateBazelTargetModule(customBazelModuleFactory, myProtoLibraryProps, attrs)
} }
} }

View File

@ -129,13 +129,12 @@ func CcLibraryHeadersBp2Build(ctx android.TopDownMutatorContext) {
Deps: headerLibLabels, Deps: headerLibLabels,
} }
props := bazel.NewBazelTargetModuleProperties( props := bazel.BazelTargetModuleProperties{
module.Name(), Rule_class: "cc_library_headers",
"cc_library_headers", Bzl_load_location: "//build/bazel/rules:cc_library_headers.bzl",
"//build/bazel/rules:cc_library_headers.bzl", }
)
ctx.CreateBazelTargetModule(BazelCcLibraryHeadersFactory, props, attrs) ctx.CreateBazelTargetModule(BazelCcLibraryHeadersFactory, module.Name(), props, attrs)
} }
func (m *bazelCcLibraryHeaders) Name() string { func (m *bazelCcLibraryHeaders) Name() string {

View File

@ -150,13 +150,12 @@ func ObjectBp2Build(ctx android.TopDownMutatorContext) {
Local_include_dirs: localIncludeDirs, Local_include_dirs: localIncludeDirs,
} }
props := bazel.NewBazelTargetModuleProperties( props := bazel.BazelTargetModuleProperties{
m.Name(), Rule_class: "cc_object",
"cc_object", Bzl_load_location: "//build/bazel/rules:cc_object.bzl",
"//build/bazel/rules:cc_object.bzl", }
)
ctx.CreateBazelTargetModule(BazelObjectFactory, props, attrs) ctx.CreateBazelTargetModule(BazelObjectFactory, m.Name(), props, attrs)
} }
func (object *objectLinker) appendLdflags(flags []string) { func (object *objectLinker) appendLdflags(flags []string) {

View File

@ -853,10 +853,12 @@ func GenruleBp2Build(ctx android.TopDownMutatorContext) {
Tools: tools, Tools: tools,
} }
props := bazel.NewBazelTargetModuleProperties(m.Name(), "genrule", "") props := bazel.BazelTargetModuleProperties{
Rule_class: "genrule",
}
// Create the BazelTargetModule. // Create the BazelTargetModule.
ctx.CreateBazelTargetModule(BazelGenruleFactory, props, attrs) ctx.CreateBazelTargetModule(BazelGenruleFactory, m.Name(), props, attrs)
} }
func (m *bazelGenrule) Name() string { func (m *bazelGenrule) Name() string {

View File

@ -514,9 +514,11 @@ func ShBinaryBp2Build(ctx android.TopDownMutatorContext) {
Srcs: srcs, Srcs: srcs,
} }
props := bazel.NewBazelTargetModuleProperties(m.Name(), "sh_binary", "") props := bazel.BazelTargetModuleProperties{
Rule_class: "sh_binary",
}
ctx.CreateBazelTargetModule(BazelShBinaryFactory, props, attrs) ctx.CreateBazelTargetModule(BazelShBinaryFactory, m.Name(), props, attrs)
} }
func (m *bazelShBinary) Name() string { func (m *bazelShBinary) Name() string {