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

Commit 9db358d4 authored by Cole Faust's avatar Cole Faust Committed by Gerrit Code Review
Browse files

Merge "Bp2build genrule commands as configurable properties" into main

parents 9a3cd19b f0d4d4f9
Loading
Loading
Loading
Loading
+74 −0
Original line number Diff line number Diff line
@@ -772,3 +772,77 @@ func TestGenruleWithExportIncludeDirs(t *testing.T) {
		})
	}
}

func TestGenruleWithConfiguredCmd(t *testing.T) {
	testCases := []struct {
		moduleType string
		factory    android.ModuleFactory
		hod        android.HostOrDeviceSupported
	}{
		{
			moduleType: "genrule",
			factory:    genrule.GenRuleFactory,
		},
		{
			moduleType: "cc_genrule",
			factory:    cc.GenRuleFactory,
			hod:        android.DeviceSupported,
		},
		{
			moduleType: "java_genrule",
			factory:    java.GenRuleFactory,
			hod:        android.DeviceSupported,
		},
		{
			moduleType: "java_genrule_host",
			factory:    java.GenRuleFactoryHost,
			hod:        android.HostSupported,
		},
	}

	bp := `
soong_config_module_type {
    name: "my_genrule",
    module_type: "%s",
    config_namespace: "my_namespace",
    bool_variables: ["my_variable"],
    properties: ["cmd"],
}

my_genrule {
    name: "foo",
    out: ["foo.txt"],
    cmd: "echo 'no variable' > $(out)",
    soong_config_variables: {
        my_variable: {
            cmd: "echo 'with variable' > $(out)",
        },
    },
    bazel_module: { bp2build_available: true },
}
`

	for _, tc := range testCases {
		moduleAttrs := AttrNameToString{
			"cmd": `select({
        "//build/bazel/product_config/config_settings:my_namespace__my_variable": "echo 'with variable' > $(OUTS)",
        "//conditions:default": "echo 'no variable' > $(OUTS)",
    })`,
			"outs": `["foo.txt"]`,
		}

		expectedBazelTargets := []string{
			makeBazelTargetHostOrDevice("genrule", "foo", moduleAttrs, tc.hod),
		}

		t.Run(tc.moduleType, func(t *testing.T) {
			RunBp2BuildTestCase(t, func(ctx android.RegistrationContext) { android.RegisterSoongConfigModuleBuildComponents(ctx) },
				Bp2buildTestCase{
					Blueprint:                  fmt.Sprintf(bp, tc.moduleType),
					ModuleTypeUnderTest:        tc.moduleType,
					ModuleTypeUnderTestFactory: tc.factory,
					ExpectedBazelTargets:       expectedBazelTargets,
				})
		})
	}
}
+23 −10
Original line number Diff line number Diff line
@@ -869,7 +869,7 @@ type bazelGensrcsAttributes struct {
	Srcs             bazel.LabelListAttribute
	Output_extension *string
	Tools            bazel.LabelListAttribute
	Cmd              string
	Cmd              bazel.StringAttribute
	Data             bazel.LabelListAttribute
}

@@ -917,7 +917,7 @@ type bazelGenruleAttributes struct {
	Srcs  bazel.LabelListAttribute
	Outs  []string
	Tools bazel.LabelListAttribute
	Cmd   string
	Cmd   bazel.StringAttribute
}

// ConvertWithBp2build converts a Soong module -> Bazel target.
@@ -967,14 +967,13 @@ func (m *Module) ConvertWithBp2build(ctx android.TopDownMutatorContext) {
		}
	}

	replaceVariables := func(cmd string) string {
		// Replace in and out variables with $< and $@
	var cmd string
	if m.properties.Cmd != nil {
		if ctx.ModuleType() == "gensrcs" {
			cmd = strings.ReplaceAll(*m.properties.Cmd, "$(in)", "$(SRC)")
			cmd = strings.ReplaceAll(cmd, "$(in)", "$(SRC)")
			cmd = strings.ReplaceAll(cmd, "$(out)", "$(OUT)")
		} else {
			cmd = strings.Replace(*m.properties.Cmd, "$(in)", "$(SRCS)", -1)
			cmd = strings.Replace(cmd, "$(in)", "$(SRCS)", -1)
			cmd = strings.Replace(cmd, "$(out)", "$(OUTS)", -1)
		}
		cmd = strings.Replace(cmd, "$(genDir)", "$(RULEDIR)", -1)
@@ -990,6 +989,21 @@ func (m *Module) ConvertWithBp2build(ctx android.TopDownMutatorContext) {
			cmd = strings.Replace(cmd, bpLoc, bazelLoc, -1)
			cmd = strings.Replace(cmd, bpLocs, bazelLocs, -1)
		}
		return cmd
	}

	var cmdProp bazel.StringAttribute
	cmdProp.SetValue(replaceVariables(proptools.String(m.properties.Cmd)))
	allProductVariableProps := android.ProductVariableProperties(ctx, m)
	if productVariableProps, ok := allProductVariableProps["Cmd"]; ok {
		for productVariable, value := range productVariableProps {
			var cmd string
			if strValue, ok := value.(*string); ok && strValue != nil {
				cmd = *strValue
			}
			cmd = replaceVariables(cmd)
			cmdProp.SetSelectValue(productVariable.ConfigurationAxis(), productVariable.SelectKey(), &cmd)
		}
	}

	tags := android.ApexAvailableTagsWithoutTestApexes(ctx, m)
@@ -1003,7 +1017,7 @@ func (m *Module) ConvertWithBp2build(ctx android.TopDownMutatorContext) {
		attrs := &bazelGensrcsAttributes{
			Srcs:             srcs,
			Output_extension: outputExtension,
			Cmd:              cmd,
			Cmd:              cmdProp,
			Tools:            tools,
			Data:             data,
		}
@@ -1026,7 +1040,7 @@ func (m *Module) ConvertWithBp2build(ctx android.TopDownMutatorContext) {
		attrs := &bazelGenruleAttributes{
			Srcs:  srcs,
			Outs:  outs,
			Cmd:   cmd,
			Cmd:   cmdProp,
			Tools: tools,
		}
		props := bazel.BazelTargetModuleProperties{
@@ -1056,7 +1070,6 @@ func (m *Module) ConvertWithBp2build(ctx android.TopDownMutatorContext) {
			Name: m.Name() + genruleHeaderLibrarySuffix,
			Tags: tags,
		}, attrs)

	}
}