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

Commit f92e14b0 authored by Jingwen Chen's avatar Jingwen Chen Committed by Gerrit Code Review
Browse files

Merge "bp2build: automatically convert all genrules."

parents 467f8b6c 316e07c5
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -11,6 +11,7 @@ bootstrap_go_package {
    deps: [
        "soong-android",
        "soong-bazel",
        "soong-genrule",
    ],
    testSrcs: [
        "build_conversion_test.go",
+49 −0
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@ package bp2build

import (
	"android/soong/android"
	"android/soong/genrule"
	"testing"
)

@@ -300,6 +301,54 @@ func TestModuleTypeBp2Build(t *testing.T) {
        "a",
        "b",
    ],
)`,
		},
		{
			moduleTypeUnderTest:        "genrule",
			moduleTypeUnderTestFactory: genrule.GenRuleFactory,
			bp: `genrule {
    name: "foo",
    out: ["foo.out"],
    srcs: ["foo.in"],
    tool_files: [":foo.tool"],
    cmd: "$(location :foo.tool) arg $(in) $(out)",
}`,
			expectedBazelTarget: `genrule(
    name = "foo",
    cmd = "$(location :foo.tool) arg $(SRCS) $(OUTS)",
    outs = [
        "foo.out",
    ],
    srcs = [
        "foo.in",
    ],
    tools = [
        ":foo.tool",
    ],
)`,
		},
		{
			moduleTypeUnderTest:        "genrule",
			moduleTypeUnderTestFactory: genrule.GenRuleFactory,
			bp: `genrule {
    name: "foo",
    out: ["foo.out"],
    srcs: ["foo.in"],
    tools: [":foo.tool"],
    cmd: "$(location :foo.tool) --out-dir=$(genDir) $(in)",
}`,
			expectedBazelTarget: `genrule(
    name = "foo",
    cmd = "$(location :foo.tool) --out-dir=$(GENDIR) $(SRCS)",
    outs = [
        "foo.out",
    ],
    srcs = [
        "foo.in",
    ],
    tools = [
        ":foo.tool",
    ],
)`,
		},
	}
+66 −0
Original line number Diff line number Diff line
@@ -46,6 +46,8 @@ func RegisterGenruleBuildComponents(ctx android.RegistrationContext) {
	ctx.FinalDepsMutators(func(ctx android.RegisterMutatorsContext) {
		ctx.BottomUp("genrule_tool_deps", toolDepsMutator).Parallel()
	})

	android.RegisterBp2BuildMutator("genrule", bp2buildMutator)
}

var (
@@ -772,6 +774,70 @@ type genRuleProperties struct {
	Out []string `android:"arch_variant"`
}

type bazelGenruleAttributes struct {
	Name  *string
	Srcs  []string
	Outs  []string
	Tools []string
	Cmd   string
}

type bazelGenrule struct {
	android.BazelTargetModuleBase
	bazelGenruleAttributes
}

func BazelGenruleFactory() android.Module {
	module := &bazelGenrule{}
	module.AddProperties(&module.bazelGenruleAttributes)
	android.InitBazelTargetModule(module)
	return module
}

func bp2buildMutator(ctx android.TopDownMutatorContext) {
	if m, ok := ctx.Module().(*Module); ok {
		name := "__bp2build__" + m.Name()
		// Replace in and out variables with $< and $@
		var cmd string
		if m.properties.Cmd != nil {
			cmd = strings.Replace(*m.properties.Cmd, "$(in)", "$(SRCS)", -1)
			cmd = strings.Replace(cmd, "$(out)", "$(OUTS)", -1)
			cmd = strings.Replace(cmd, "$(genDir)", "$(GENDIR)", -1)
		}

		// The Out prop is not in an immediately accessible field
		// in the Module struct, so use GetProperties and cast it
		// to the known struct prop.
		var outs []string
		for _, propIntf := range m.GetProperties() {
			if props, ok := propIntf.(*genRuleProperties); ok {
				outs = props.Out
				break
			}
		}

		// Bazel only has the "tools" attribute.
		tools := append(m.properties.Tools, m.properties.Tool_files...)

		// Create the BazelTargetModule.
		ctx.CreateModule(BazelGenruleFactory, &bazelGenruleAttributes{
			Name:  proptools.StringPtr(name),
			Srcs:  m.properties.Srcs,
			Outs:  outs,
			Cmd:   cmd,
			Tools: tools,
		}, &bazel.BazelTargetModuleProperties{
			Rule_class: "genrule",
		})
	}
}

func (m *bazelGenrule) Name() string {
	return m.BaseModuleName()
}

func (m *bazelGenrule) GenerateAndroidBuildActions(ctx android.ModuleContext) {}

var Bool = proptools.Bool
var String = proptools.String