bp2build: support genrule $(location) and $(locations)
Soong genrules support $(location) and $(locations) cmd variable
shortcuts without labels. The shortcut is for the location of the first
tool module from the concatenation of the tools and tool_files
properties.
Bazel doesn't support this shortcut, so the bp2build mapping needs to
support it.
Documentation:
https://cs.android.com/android/platform/superproject/+/master:build/soong/genrule/genrule.go;l=95-96;drc=316e07c593ab66599c74725cf482dedbb32b2875
Code: https://cs.android.com/android/platform/superproject/+/master:build/soong/genrule/genrule.go;l=236-246;drc=316e07c593ab66599c74725cf482dedbb32b2875
Test: build_conversion_test.go
Test: TH
Change-Id: I8aa98ae460af3a3fbb0a7835572518680dc7ade1
diff --git a/bp2build/build_conversion_test.go b/bp2build/build_conversion_test.go
index be32530..367e13f 100644
--- a/bp2build/build_conversion_test.go
+++ b/bp2build/build_conversion_test.go
@@ -274,8 +274,10 @@
moduleTypeUnderTestFactory android.ModuleFactory
bp string
expectedBazelTarget string
+ description string
}{
{
+ description: "filegroup with no srcs",
moduleTypeUnderTest: "filegroup",
moduleTypeUnderTestFactory: android.FileGroupFactory,
bp: `filegroup {
@@ -289,6 +291,7 @@
)`,
},
{
+ description: "filegroup with srcs",
moduleTypeUnderTest: "filegroup",
moduleTypeUnderTestFactory: android.FileGroupFactory,
bp: `filegroup {
@@ -304,18 +307,19 @@
)`,
},
{
+ description: "genrule with command line variable replacements",
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)",
+ tools: [":foo.tool"],
+ cmd: "$(location :foo.tool) --genDir=$(genDir) arg $(in) $(out)",
}`,
expectedBazelTarget: `genrule(
name = "foo",
- cmd = "$(location :foo.tool) arg $(SRCS) $(OUTS)",
+ cmd = "$(location :foo.tool) --genDir=$(GENDIR) arg $(SRCS) $(OUTS)",
outs = [
"foo.out",
],
@@ -328,18 +332,44 @@
)`,
},
{
+ description: "genrule using $(locations :label)",
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)",
+ tools: [":foo.tools"],
+ cmd: "$(locations :foo.tools) -s $(out) $(in)",
}`,
expectedBazelTarget: `genrule(
name = "foo",
- cmd = "$(location :foo.tool) --out-dir=$(GENDIR) $(SRCS)",
+ cmd = "$(locations :foo.tools) -s $(OUTS) $(SRCS)",
+ outs = [
+ "foo.out",
+ ],
+ srcs = [
+ "foo.in",
+ ],
+ tools = [
+ ":foo.tools",
+ ],
+)`,
+ },
+ {
+ description: "genrule using $(location) label should substitute first tool label automatically",
+ moduleTypeUnderTest: "genrule",
+ moduleTypeUnderTestFactory: genrule.GenRuleFactory,
+ bp: `genrule {
+ name: "foo",
+ out: ["foo.out"],
+ srcs: ["foo.in"],
+ tool_files: [":foo.tool", ":other.tool"],
+ cmd: "$(location) -s $(out) $(in)",
+}`,
+ expectedBazelTarget: `genrule(
+ name = "foo",
+ cmd = "$(location :foo.tool) -s $(OUTS) $(SRCS)",
outs = [
"foo.out",
],
@@ -348,6 +378,54 @@
],
tools = [
":foo.tool",
+ ":other.tool",
+ ],
+)`,
+ },
+ {
+ description: "genrule using $(locations) label should substitute first tool label automatically",
+ moduleTypeUnderTest: "genrule",
+ moduleTypeUnderTestFactory: genrule.GenRuleFactory,
+ bp: `genrule {
+ name: "foo",
+ out: ["foo.out"],
+ srcs: ["foo.in"],
+ tools: [":foo.tool", ":other.tool"],
+ cmd: "$(locations) -s $(out) $(in)",
+}`,
+ expectedBazelTarget: `genrule(
+ name = "foo",
+ cmd = "$(locations :foo.tool) -s $(OUTS) $(SRCS)",
+ outs = [
+ "foo.out",
+ ],
+ srcs = [
+ "foo.in",
+ ],
+ tools = [
+ ":foo.tool",
+ ":other.tool",
+ ],
+)`,
+ },
+ {
+ description: "genrule without tools or tool_files can convert successfully",
+ moduleTypeUnderTest: "genrule",
+ moduleTypeUnderTestFactory: genrule.GenRuleFactory,
+ bp: `genrule {
+ name: "foo",
+ out: ["foo.out"],
+ srcs: ["foo.in"],
+ cmd: "cp $(in) $(out)",
+}`,
+ expectedBazelTarget: `genrule(
+ name = "foo",
+ cmd = "cp $(SRCS) $(OUTS)",
+ outs = [
+ "foo.out",
+ ],
+ srcs = [
+ "foo.in",
],
)`,
},
@@ -367,13 +445,14 @@
bazelTargets := GenerateSoongModuleTargets(ctx.Context.Context, Bp2Build)[dir]
if actualCount, expectedCount := len(bazelTargets), 1; actualCount != expectedCount {
- t.Fatalf("Expected %d bazel target, got %d", expectedCount, actualCount)
+ t.Fatalf("%s: Expected %d bazel target, got %d", testCase.description, expectedCount, actualCount)
}
actualBazelTarget := bazelTargets[0]
if actualBazelTarget.content != testCase.expectedBazelTarget {
t.Errorf(
- "Expected generated Bazel target to be '%s', got '%s'",
+ "%s: Expected generated Bazel target to be '%s', got '%s'",
+ testCase.description,
testCase.expectedBazelTarget,
actualBazelTarget.content,
)