Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c63677b3 authored by Jingwen Chen's avatar Jingwen Chen
Browse files

Direct Bazel builds from m.

This CL adds support to bp2build/Soong to dump a BUILD file under
out/soong/soong_injection/targets containing alias targets to their real
targets for every converted Soong module, regardless of whether they are
handcrafted or generated.

Test: TH
Change-Id: Ic1816fda5d019c395301618134fac68b3057d752
parent c4dc9b4f
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ import (
	"path/filepath"
	"regexp"
	"sort"
	"strings"
)

// BazelTargetModuleProperties contain properties and metadata used for
@@ -33,6 +34,10 @@ type BazelTargetModuleProperties struct {

const BazelTargetModuleNamePrefix = "__bp2build__"

func StripNamePrefix(moduleName string) string {
	return strings.TrimPrefix(moduleName, BazelTargetModuleNamePrefix)
}

var productVariableSubstitutionPattern = regexp.MustCompile("%(d|s)")

// Label is used to represent a Bazel compatible Label. Also stores the original
+1 −0
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@ bootstrap_go_package {
        "build_conversion.go",
        "bzl_conversion.go",
        "configurability.go",
        "compatibility.go",
        "constants.go",
        "conversion.go",
        "metrics.go",
+2 −2
Original line number Diff line number Diff line
@@ -29,12 +29,12 @@ func Codegen(ctx *CodegenContext) CodegenMetrics {
	bp2buildDir := android.PathForOutput(ctx, "bp2build")
	android.RemoveAllOutputDir(bp2buildDir)

	buildToTargets, metrics := GenerateBazelTargets(ctx, true)
	buildToTargets, metrics, compatLayer := GenerateBazelTargets(ctx, true)
	bp2buildFiles := CreateBazelFiles(nil, buildToTargets, ctx.mode)
	writeFiles(ctx, bp2buildDir, bp2buildFiles)

	soongInjectionDir := android.PathForOutput(ctx, bazel.SoongInjectionDirName)
	writeFiles(ctx, soongInjectionDir, CreateSoongInjectionFiles())
	writeFiles(ctx, soongInjectionDir, CreateSoongInjectionFiles(compatLayer))

	return metrics
}
+20 −2
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ type BazelAttributes struct {

type BazelTarget struct {
	name            string
	packageName     string
	content         string
	ruleClass       string
	bzlLoadLocation string
@@ -44,6 +45,16 @@ func (t BazelTarget) IsLoadedFromStarlark() bool {
	return t.bzlLoadLocation != ""
}

// Label is the fully qualified Bazel label constructed from the BazelTarget's
// package name and target name.
func (t BazelTarget) Label() string {
	if t.packageName == "." {
		return "//:" + t.name
	} else {
		return "//" + t.packageName + ":" + t.name
	}
}

// BazelTargets is a typedef for a slice of BazelTarget objects.
type BazelTargets []BazelTarget

@@ -213,7 +224,7 @@ func propsToAttributes(props map[string]string) string {
	return attributes
}

func GenerateBazelTargets(ctx *CodegenContext, generateFilegroups bool) (map[string]BazelTargets, CodegenMetrics) {
func GenerateBazelTargets(ctx *CodegenContext, generateFilegroups bool) (map[string]BazelTargets, CodegenMetrics, CodegenCompatLayer) {
	buildFileToTargets := make(map[string]BazelTargets)
	buildFileToAppend := make(map[string]bool)

@@ -222,6 +233,10 @@ func GenerateBazelTargets(ctx *CodegenContext, generateFilegroups bool) (map[str
		RuleClassCount: make(map[string]int),
	}

	compatLayer := CodegenCompatLayer{
		NameToLabelMap: make(map[string]string),
	}

	dirs := make(map[string]bool)

	bpCtx := ctx.Context()
@@ -236,6 +251,7 @@ func GenerateBazelTargets(ctx *CodegenContext, generateFilegroups bool) (map[str
			if b, ok := m.(android.Bazelable); ok && b.HasHandcraftedLabel() {
				metrics.handCraftedTargetCount += 1
				metrics.TotalModuleCount += 1
				compatLayer.AddNameToLabelEntry(m.Name(), b.HandcraftedLabel())
				pathToBuildFile := getBazelPackagePath(b)
				// We are using the entire contents of handcrafted build file, so if multiple targets within
				// a package have handcrafted targets, we only want to include the contents one time.
@@ -253,6 +269,7 @@ func GenerateBazelTargets(ctx *CodegenContext, generateFilegroups bool) (map[str
			} else if btm, ok := m.(android.BazelTargetModule); ok {
				t = generateBazelTarget(bpCtx, m, btm)
				metrics.RuleClassCount[t.ruleClass] += 1
				compatLayer.AddNameToLabelEntry(m.Name(), t.Label())
			} else {
				metrics.TotalModuleCount += 1
				return
@@ -283,7 +300,7 @@ func GenerateBazelTargets(ctx *CodegenContext, generateFilegroups bool) (map[str
		}
	}

	return buildFileToTargets, metrics
	return buildFileToTargets, metrics, compatLayer
}

func getBazelPackagePath(b android.Bazelable) string {
@@ -324,6 +341,7 @@ func generateBazelTarget(ctx bpToBuildContext, m blueprint.Module, btm android.B
	targetName := targetNameForBp2Build(ctx, m)
	return BazelTarget{
		name:            targetName,
		packageName:     ctx.ModuleDir(m),
		ruleClass:       ruleClass,
		bzlLoadLocation: bzlLoadLocation,
		content: fmt.Sprintf(
+37 −31
Original line number Diff line number Diff line
@@ -1414,25 +1414,31 @@ filegroup {
			},
		},
		{
			description:                        "filegroup bazel_module.label and bp2build",
			description:                        "filegroup bazel_module.label and bp2build in subdir",
			moduleTypeUnderTest:                "filegroup",
			moduleTypeUnderTestFactory:         android.FileGroupFactory,
			moduleTypeUnderTestBp2BuildMutator: android.FilegroupBp2Build,
			bp: `filegroup {
			dir:                                "other",
			bp:                                 ``,
			fs: map[string]string{
				"other/Android.bp": `filegroup {
				name: "fg_foo",
				bazel_module: {
      label: "//other:fg_foo",
					bp2build_available: true,
				},
			}
			filegroup {
				name: "fg_bar",
				bazel_module: {
					label: "//other:fg_bar"
				},
			}`,
				"other/BUILD.bazel": `// definition for fg_bar`,
			},
			expectedBazelTargets: []string{
				`filegroup(
    name = "fg_foo",
)`,
				`// BUILD file`,
			},
			fs: map[string]string{
				"other/BUILD.bazel": `// BUILD file`,
)`, `// definition for fg_bar`,
			},
		},
		{
Loading