diff --git a/android/proto.go b/android/proto.go index 178d54f7f..6887900c4 100644 --- a/android/proto.go +++ b/android/proto.go @@ -268,6 +268,13 @@ func Bp2buildProtoProperties(ctx Bp2buildMutatorContext, m *ModuleBase, srcs baz protoIncludeDirs = append(protoIncludeDirs, dir) } } + + // proto.local_include_dirs are similar to proto.include_dirs, except that it is relative to the module directory + for _, dir := range props.Proto.Local_include_dirs { + relativeToTop := pathForModuleSrc(ctx, dir).String() + protoIncludeDirs = append(protoIncludeDirs, relativeToTop) + } + } else if props.Proto.Type != info.Type && props.Proto.Type != nil { ctx.ModuleErrorf("Cannot handle arch-variant types for protos at this time.") } diff --git a/bp2build/cc_library_conversion_test.go b/bp2build/cc_library_conversion_test.go index 05d2e6aec..650121724 100644 --- a/bp2build/cc_library_conversion_test.go +++ b/bp2build/cc_library_conversion_test.go @@ -5140,3 +5140,58 @@ cc_library_static { } runCcLibraryTestCase(t, tc) } + +func TestProtoLocalIncludeDirs(t *testing.T) { + tc := Bp2buildTestCase{ + Description: "cc_library depends on .proto files using proto.local_include_dirs", + ModuleTypeUnderTest: "cc_library", + ModuleTypeUnderTestFactory: cc.LibraryFactory, + Blueprint: simpleModuleDoNotConvertBp2build("cc_library", "libprotobuf-cpp-lite"), + Filesystem: map[string]string{ + "foo/Android.bp": `cc_library_static { + name: "foo", + srcs: [ + "foo.proto", + ], + proto: { + local_include_dirs: ["foo_subdir"], + }, + bazel_module: { bp2build_available: true }, +}`, + "foo/foo.proto": "", + "foo/foo_subdir/Android.bp": "", + "foo/foo_subdir/foo_subdir.proto": "", + }, + } + + // We will run the test 2 times and check in foo and foo/foo_subdir directories + // foo dir + tc.Dir = "foo" + tc.ExpectedBazelTargets = []string{ + MakeBazelTarget("cc_library_static", "foo", AttrNameToString{ + "local_includes": `["."]`, + "deps": `["//:libprotobuf-cpp-lite"]`, + "implementation_whole_archive_deps": `[":foo_cc_proto_lite"]`, + }), + MakeBazelTarget("proto_library", "foo_proto", AttrNameToString{ + "srcs": `["foo.proto"]`, + "tags": `["manual"]`, + }), + MakeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", AttrNameToString{ + "deps": `[":foo_proto"]`, + "transitive_deps": `["//foo/foo_subdir:foo.foo_subdir.include_dir_bp2build_generated_proto"]`, + }), + } + runCcLibraryTestCase(t, tc) + + // foo/foo_subdir + tc.Dir = "foo/foo_subdir" + tc.ExpectedBazelTargets = []string{ + MakeBazelTarget("proto_library", "foo.foo_subdir.include_dir_bp2build_generated_proto", AttrNameToString{ + "srcs": `["foo_subdir.proto"]`, + "strip_import_prefix": `""`, + "tags": `["manual"]`, + }), + } + runCcLibraryTestCase(t, tc) +}