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

Commit 234bb3bd authored by Spandan Das's avatar Spandan Das Committed by Gerrit Code Review
Browse files

Merge changes from topic "proto-include-dir-py" into main

* changes:
  Handle proto.include_dirs in bp2build for py
  Add proto.local_include_dirs support in bp2build
  Add manual tag to proto_library at the root package
parents 55e775f9 4ed3d120
Loading
Loading
Loading
Loading
+13 −1
Original line number Diff line number Diff line
@@ -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.")
					}
@@ -292,9 +299,14 @@ func Bp2buildProtoProperties(ctx Bp2buildMutatorContext, m *ModuleBase, srcs baz
			// (or a different subpackage), it will not find it.
			// The CcProtoGen action itself runs fine because we construct the correct ProtoInfo,
			// but the FileDescriptorSet of each proto_library might not be compile-able
			if pkg != ctx.ModuleDir() {
			//
			// Add manual tag if either
			// 1. .proto files are in more than one package
			// 2. proto.include_dirs is not empty
			if len(SortedStringKeys(pkgToSrcs)) > 1 || len(protoIncludeDirs) > 0 {
				tags.Append(bazel.MakeStringListAttribute([]string{"manual"}))
			}

			ctx.CreateBazelTargetModule(
				bazel.BazelTargetModuleProperties{Rule_class: "proto_library"},
				CommonAttributes{Name: name, Dir: proptools.StringPtr(pkg), Tags: tags},
+58 −0
Original line number Diff line number Diff line
@@ -4965,6 +4965,7 @@ cc_library_static {
		}),
		MakeBazelTarget("proto_library", "foo_proto", AttrNameToString{
			"srcs": `["foo.proto"]`,
			"tags": `["manual"]`,
		}),
		MakeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", AttrNameToString{
			"deps": `[
@@ -5033,6 +5034,7 @@ cc_library_static {
		MakeBazelTarget("proto_library", "foo_proto", AttrNameToString{
			"srcs":                `["foo.proto"]`,
			"strip_import_prefix": `""`,
			"tags":                `["manual"]`,
		}),
		MakeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", AttrNameToString{
			"deps": `[
@@ -5103,6 +5105,7 @@ cc_library_static {
		}),
		MakeBazelTarget("proto_library", "foo_proto", AttrNameToString{
			"srcs": `["foo.proto"]`,
			"tags": `["manual"]`,
		}),
		MakeBazelTarget("cc_lite_proto_library", "foo_cc_proto_lite", AttrNameToString{
			"deps": `[":foo_proto"]`,
@@ -5137,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)
}
+8 −1
Original line number Diff line number Diff line
@@ -33,6 +33,12 @@ type bazelPythonLibraryAttributes struct {

type bazelPythonProtoLibraryAttributes struct {
	Deps bazel.LabelListAttribute

	// A list of proto_library targets that the proto_library in `deps` depends on
	// This list is overestimation.
	// Overestimation is necessary since Soong includes other protos via proto.include_dirs and not
	// a specific .proto file module explicitly.
	Transitive_deps bazel.LabelListAttribute
}

type baseAttributes struct {
@@ -82,6 +88,7 @@ func (m *PythonLibraryModule) makeArchVariantBaseAttributes(ctx android.TopDownM
			Name: pyProtoLibraryName,
		}, &bazelPythonProtoLibraryAttributes{
			Deps:            bazel.MakeLabelListAttribute(protoInfo.Proto_libs),
			Transitive_deps: bazel.MakeLabelListAttribute(protoInfo.Transitive_proto_libs),
		})

		attrs.Deps.Add(bazel.MakeLabelAttribute(":" + pyProtoLibraryName))