Gen a header library when genrules export includes
Embedding multiple includes from a genrule may be difficult to read,
instead we generate a header library that contains the headers and all
include dirs that Soong generates.
Test: go test bp2build tests
Change-Id: I590c74c133f015f27cccf5a2fd916153ad9c125e
diff --git a/bp2build/genrule_conversion_test.go b/bp2build/genrule_conversion_test.go
index 5cf4fb2..5a73969 100644
--- a/bp2build/genrule_conversion_test.go
+++ b/bp2build/genrule_conversion_test.go
@@ -16,6 +16,7 @@
import (
"fmt"
+ "path/filepath"
"testing"
"android/soong/android"
@@ -695,3 +696,79 @@
})
})
}
+
+func TestGenruleWithExportIncludeDirs(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,
+ },
+ }
+
+ dir := "baz"
+
+ bp := `%s {
+ name: "foo",
+ out: ["foo.out.h"],
+ srcs: ["foo.in"],
+ cmd: "cp $(in) $(out)",
+ export_include_dirs: ["foo", "bar", "."],
+ bazel_module: { bp2build_available: true },
+}`
+
+ for _, tc := range testCases {
+ moduleAttrs := AttrNameToString{
+ "cmd": `"cp $(SRCS) $(OUTS)"`,
+ "outs": `["foo.out.h"]`,
+ "srcs": `["foo.in"]`,
+ }
+
+ expectedBazelTargets := []string{
+ makeBazelTargetHostOrDevice("genrule", "foo", moduleAttrs, tc.hod),
+ makeBazelTargetHostOrDevice("cc_library_headers", "foo__header_library", AttrNameToString{
+ "hdrs": `[":foo"]`,
+ "export_includes": `[
+ "foo",
+ "baz/foo",
+ "bar",
+ "baz/bar",
+ ".",
+ "baz",
+ ]`,
+ },
+ tc.hod),
+ }
+
+ t.Run(tc.moduleType, func(t *testing.T) {
+ RunBp2BuildTestCase(t, func(ctx android.RegistrationContext) {},
+ Bp2buildTestCase{
+ ModuleTypeUnderTest: tc.moduleType,
+ ModuleTypeUnderTestFactory: tc.factory,
+ Filesystem: map[string]string{
+ filepath.Join(dir, "Android.bp"): fmt.Sprintf(bp, tc.moduleType),
+ },
+ Dir: dir,
+ ExpectedBazelTargets: expectedBazelTargets,
+ })
+ })
+ }
+}