bp2build: framework for generating BazelTargetModules.
This CL creates the framework necessary for generating
BazelTargetModules from regular Soong Android modules.
BazelTargetModules are code-generated into Bazel targets in BUILD files.
See the follow-up CL for examples of creating filegroup/genrule
BazelTargetModules.
Test: GENERATE_BAZEL_FILES=true m nothing # creates out/soong/bp2build
with no BUILD files, because there are no BazelTargetModules in the
module graph.
Change-Id: I33a96365bd439043b13af6db9e439592e9983188
diff --git a/bp2build/build_conversion.go b/bp2build/build_conversion.go
index bece8f6..da2fb7f 100644
--- a/bp2build/build_conversion.go
+++ b/bp2build/build_conversion.go
@@ -73,16 +73,51 @@
return attributes
}
-func GenerateSoongModuleTargets(ctx bpToBuildContext) map[string][]BazelTarget {
+func GenerateSoongModuleTargets(ctx bpToBuildContext, bp2buildEnabled bool) map[string][]BazelTarget {
buildFileToTargets := make(map[string][]BazelTarget)
ctx.VisitAllModules(func(m blueprint.Module) {
dir := ctx.ModuleDir(m)
- t := generateSoongModuleTarget(ctx, m)
+ var t BazelTarget
+
+ if bp2buildEnabled {
+ if _, ok := m.(android.BazelTargetModule); !ok {
+ return
+ }
+ t = generateBazelTarget(ctx, m)
+ } else {
+ t = generateSoongModuleTarget(ctx, m)
+ }
+
buildFileToTargets[ctx.ModuleDir(m)] = append(buildFileToTargets[dir], t)
})
return buildFileToTargets
}
+func generateBazelTarget(ctx bpToBuildContext, m blueprint.Module) BazelTarget {
+ // extract the bazel attributes from the module.
+ 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 := strings.Replace(props.Attrs["rule_class"], "\"", "", 2)
+ // Delete it from being generated in the BUILD file.
+ delete(props.Attrs, "rule_class")
+
+ // Return the Bazel target with rule class and attributes, ready to be
+ // code-generated.
+ attributes := propsToAttributes(props.Attrs)
+ targetName := targetNameForBp2Build(ctx, m)
+ return BazelTarget{
+ name: targetName,
+ content: fmt.Sprintf(
+ bazelTarget,
+ ruleClass,
+ targetName,
+ attributes,
+ ),
+ }
+}
+
// Convert a module and its deps and props into a Bazel macro/rule
// representation in the BUILD file.
func generateSoongModuleTarget(ctx bpToBuildContext, m blueprint.Module) BazelTarget {
@@ -306,6 +341,10 @@
return strings.Repeat(" ", indent)
}
+func targetNameForBp2Build(c bpToBuildContext, logicModule blueprint.Module) string {
+ return strings.Replace(c.ModuleName(logicModule), "__bp2build__", "", 1)
+}
+
func targetNameWithVariant(c bpToBuildContext, logicModule blueprint.Module) string {
name := ""
if c.ModuleSubDir(logicModule) != "" {