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

Commit ab29f57c authored by Spandan Das's avatar Spandan Das
Browse files

Fix target_compatible_with non-determinism for proto.include_dirs

A single proto providing directory can be used by multiple soong modules. Some of these
can be
1. Host specific
2. Device specific
3. Both host and device

Since the generated proto_library can have 1:many mapping, it should
have an empty target_compatible_with. Compatiblity will be enforced at
the top-level {cc|java|python}_proto_library.

(This is a followup to aosp/2727054 which did not handle this correctly)

Test: Added a unit test

Change-Id: I09b3def70e3d043fd8ba0d1eb4ffff1910f097d1
parent 08e17921
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1371,7 +1371,7 @@ func (attrs *CommonAttributes) fillCommonBp2BuildModuleAttrs(ctx *topDownMutator
		for _, axis := range enabledPropertyOverrides.SortedConfigurationAxes() {
			configToBools := enabledPropertyOverrides.ConfigurableValues[axis]
			for cfg, val := range configToBools {
				if axis != bazel.OsConfigurationAxis || osSupport[cfg] {
				if axis != bazel.OsConfigurationAxis || osSupport[cfg] || val /*If enabled is explicitly requested via overrides */ {
					enabledProperty.SetSelectValue(axis, cfg, &val)
				}
			}
+5 −0
Original line number Diff line number Diff line
@@ -408,6 +408,11 @@ func createProtoLibraryTargetsForIncludeDirs(ctx Bp2buildMutatorContext, include
			// As a workarounds, delete `target_compatible_with`
			alwaysEnabled := bazel.BoolAttribute{}
			alwaysEnabled.Value = proptools.BoolPtr(true)
			// Add android and linux explicitly so that fillcommonbp2buildmoduleattrs can override these configs
			// When we extend b support for other os'es (darwin/windows), we should add those configs here as well
			alwaysEnabled.SetSelectValue(bazel.OsConfigurationAxis, bazel.OsAndroid, proptools.BoolPtr(true))
			alwaysEnabled.SetSelectValue(bazel.OsConfigurationAxis, bazel.OsLinux, proptools.BoolPtr(true))

			ctx.CreateBazelTargetModuleWithRestrictions(
				bazel.BazelTargetModuleProperties{Rule_class: "proto_library"},
				CommonAttributes{
+38 −0
Original line number Diff line number Diff line
@@ -5241,3 +5241,41 @@ func TestProtoLocalIncludeDirs(t *testing.T) {
	}
	runCcLibraryTestCase(t, tc)
}

// `foo_device` and `bar_host` can depend on .proto files of a specific dir,
// the dynamically generated proto_library should not have any target_compatible_with
func TestProtoLibraryForIncludeDirsIsOsAgnostic(t *testing.T) {
	tc := Bp2buildTestCase{
		Description:                "proto_library generated for proto.include_dirs is compatible for all axes",
		ModuleTypeUnderTest:        "cc_library",
		ModuleTypeUnderTestFactory: cc.LibraryFactory,
		Blueprint: simpleModuleDoNotConvertBp2build("cc_library", "libprotobuf-cpp-lite") + `
cc_library {
	name: "foo_device",
	device_supported: true, // this is the default behavior, but added explicitly here for illustration
	host_supported: false,
	proto: {include_dirs: ["dir"]},
}
cc_library {
	name: "bar_host",
	device_supported: false,
	host_supported: true,
	srcs: ["bar.proto"],
	proto: {include_dirs: ["dir"]},
}
`,
		Filesystem: map[string]string{
			"dir/Android.bp": "",
			"dir/dir.proto":  "",
		},
		Dir: "dir", // check for the generated proto_library
		ExpectedBazelTargets: []string{
			MakeBazelTargetNoRestrictions("proto_library", "dir.include_dir_bp2build_generated_proto", AttrNameToString{
				"srcs":                `["dir.proto"]`,
				"strip_import_prefix": `""`,
				"tags":                `["manual"]`,
			}),
		},
	}
	runCcLibraryTestCase(t, tc)
}