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

Commit 75dbca2e authored by Sam Delmerico's avatar Sam Delmerico Committed by Spandan Das
Browse files

Revert "Revert "mixed builds correctly reference stubs libs""

This reverts commit 1db43487.

Changes from original:
  - extracted function to add the current version to stub
    versions for bp2build.
  - added libc++ to mixed builds denylist

Reason for revert: re-uploading with fix in topic

Change-Id: Ifa0ed456bf8cb4a7f861d6826263adfedb4fdd9c
parent 28cbb75a
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -149,6 +149,7 @@ sharedLibraries = []
rootSharedLibraries = []

shared_info_tag = "//build/bazel/rules/cc:cc_library_shared.bzl%CcSharedLibraryOutputInfo"
stubs_tag = "//build/bazel/rules/cc:cc_stub_library.bzl%CcStubInfo"
unstripped_tag = "//build/bazel/rules/cc:stripped_cc_common.bzl%CcUnstrippedInfo"
unstripped = ""

@@ -160,6 +161,8 @@ if shared_info_tag in p:
  unstripped = path
  if unstripped_tag in p:
    unstripped = p[unstripped_tag].unstripped.path
elif stubs_tag in p:
  rootSharedLibraries.extend([f.path for f in target.files.to_list()])
else:
  for linker_input in linker_inputs:
    for library in linker_input.libraries:
+63 −0
Original line number Diff line number Diff line
@@ -1291,3 +1291,66 @@ cc_library_shared{
		},
	})
}

func TestCcLibrarySharedStubsDessertVersionConversion(t *testing.T) {
	runCcLibrarySharedTestCase(t, Bp2buildTestCase{
		Description: "cc_library_shared converts dessert codename versions to numerical versions",
		Blueprint: `
cc_library_shared {
	name: "a",
	include_build_directory: false,
	stubs: {
		symbol_file: "a.map.txt",
		versions: [
			"Q",
			"R",
			"31",
		],
	},
}
cc_library_shared {
	name: "b",
	include_build_directory: false,
	stubs: {
		symbol_file: "b.map.txt",
		versions: [
			"Q",
			"R",
			"31",
			"current",
		],
	},
}
`,
		ExpectedBazelTargets: []string{
			makeCcStubSuiteTargets("a", AttrNameToString{
				"soname":               `"a.so"`,
				"source_library_label": `"//:a"`,
				"stubs_symbol_file":    `"a.map.txt"`,
				"stubs_versions": `[
        "29",
        "30",
        "31",
        "current",
    ]`,
			}),
			MakeBazelTarget("cc_library_shared", "a", AttrNameToString{
				"stubs_symbol_file": `"a.map.txt"`,
			}),
			makeCcStubSuiteTargets("b", AttrNameToString{
				"soname":               `"b.so"`,
				"source_library_label": `"//:b"`,
				"stubs_symbol_file":    `"b.map.txt"`,
				"stubs_versions": `[
        "29",
        "30",
        "31",
        "current",
    ]`,
			}),
			MakeBazelTarget("cc_library_shared", "b", AttrNameToString{
				"stubs_symbol_file": `"b.map.txt"`,
			}),
		},
	})
}
+7 −2
Original line number Diff line number Diff line
@@ -772,8 +772,13 @@ func bp2BuildParseBaseProps(ctx android.Bp2buildMutatorContext, module *Module)

			if libraryProps, ok := archVariantLibraryProperties[axis][cfg].(*LibraryProperties); ok {
				if axis == bazel.NoConfigAxis {
					if libraryProps.Stubs.Symbol_file != nil {
						compilerAttrs.stubsSymbolFile = libraryProps.Stubs.Symbol_file
					compilerAttrs.stubsVersions.SetSelectValue(axis, cfg, libraryProps.Stubs.Versions)
						versions := android.CopyOf(libraryProps.Stubs.Versions)
						normalizeVersions(ctx, versions)
						versions = addCurrentVersionIfNotPresent(versions)
						compilerAttrs.stubsVersions.SetSelectValue(axis, cfg, versions)
					}
				}
				if suffix := libraryProps.Suffix; suffix != nil {
					compilerAttrs.suffix.SetSelectValue(axis, cfg, suffix)
+12 −7
Original line number Diff line number Diff line
@@ -1976,6 +1976,17 @@ func (c *Module) ProcessBazelQueryResponse(ctx android.ModuleContext) {
	c.maybeInstall(mctx, apexInfo)
}

func moduleContextFromAndroidModuleContext(actx android.ModuleContext, c *Module) ModuleContext {
	ctx := &moduleContext{
		ModuleContext: actx,
		moduleContextImpl: moduleContextImpl{
			mod: c,
		},
	}
	ctx.ctx = ctx
	return ctx
}

func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {
	// Handle the case of a test module split by `test_per_src` mutator.
	//
@@ -1995,13 +2006,7 @@ func (c *Module) GenerateAndroidBuildActions(actx android.ModuleContext) {

	c.makeLinkType = GetMakeLinkType(actx, c)

	ctx := &moduleContext{
		ModuleContext: actx,
		moduleContextImpl: moduleContextImpl{
			mod: c,
		},
	}
	ctx.ctx = ctx
	ctx := moduleContextFromAndroidModuleContext(actx, c)

	deps := c.depsToPaths(ctx)
	if ctx.Failed() {
+127 −0
Original line number Diff line number Diff line
@@ -3685,6 +3685,133 @@ func TestStubsForLibraryInMultipleApexes(t *testing.T) {
	}
}

func TestMixedBuildUsesStubs(t *testing.T) {
	// TODO(b/275313114): Test exposes non-determinism which should be corrected and the test
	// reenabled.
	t.Skip()
	t.Parallel()
	bp := `
		cc_library_shared {
			name: "libFoo",
			bazel_module: { label: "//:libFoo" },
			srcs: ["foo.c"],
			stubs: {
				symbol_file: "foo.map.txt",
				versions: ["current"],
			},
			apex_available: ["bar", "a1"],
		}

		cc_library_shared {
			name: "libBar",
			srcs: ["bar.c"],
			shared_libs: ["libFoo"],
			apex_available: ["a1"],
		}

		cc_library_shared {
			name: "libA1",
			srcs: ["a1.c"],
			shared_libs: ["libFoo"],
			apex_available: ["a1"],
		}

		cc_library_shared {
			name: "libBarA1",
			srcs: ["bara1.c"],
			shared_libs: ["libFoo"],
			apex_available: ["bar", "a1"],
		}

		cc_library_shared {
			name: "libAnyApex",
			srcs: ["anyApex.c"],
			shared_libs: ["libFoo"],
			apex_available: ["//apex_available:anyapex"],
		}

		cc_library_shared {
			name: "libBaz",
			srcs: ["baz.c"],
			shared_libs: ["libFoo"],
			apex_available: ["baz"],
		}

		cc_library_shared {
			name: "libQux",
			srcs: ["qux.c"],
			shared_libs: ["libFoo"],
			apex_available: ["qux", "bar"],
		}`

	result := android.GroupFixturePreparers(
		prepareForCcTest,
		android.FixtureModifyConfig(func(config android.Config) {
			config.BazelContext = android.MockBazelContext{
				OutputBaseDir: "out/bazel",
				LabelToCcInfo: map[string]cquery.CcInfo{
					"//:libFoo": {
						RootDynamicLibraries: []string{"libFoo.so"},
					},
					"//:libFoo_stub_libs-current": {
						RootDynamicLibraries: []string{"libFoo_stub_libs-current.so"},
					},
				},
			}
		}),
	).RunTestWithBp(t, bp)
	ctx := result.TestContext

	variants := ctx.ModuleVariantsForTests("libFoo")
	expectedVariants := []string{
		"android_arm64_armv8-a_shared",
		"android_arm64_armv8-a_shared_current",
		"android_arm_armv7-a-neon_shared",
		"android_arm_armv7-a-neon_shared_current",
	}
	variantsMismatch := false
	if len(variants) != len(expectedVariants) {
		variantsMismatch = true
	} else {
		for _, v := range expectedVariants {
			if !inList(v, variants) {
				variantsMismatch = false
			}
		}
	}
	if variantsMismatch {
		t.Errorf("variants of libFoo expected:\n")
		for _, v := range expectedVariants {
			t.Errorf("%q\n", v)
		}
		t.Errorf(", but got:\n")
		for _, v := range variants {
			t.Errorf("%q\n", v)
		}
	}

	linkAgainstFoo := []string{"libBarA1"}
	linkAgainstFooStubs := []string{"libBar", "libA1", "libBaz", "libQux", "libAnyApex"}

	libFooPath := "out/bazel/execroot/__main__/libFoo.so"
	for _, lib := range linkAgainstFoo {
		libLinkRule := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld")
		libFlags := libLinkRule.Args["libFlags"]
		if !strings.Contains(libFlags, libFooPath) {
			t.Errorf("%q: %q is not found in %q", lib, libFooPath, libFlags)
		}
	}

	libFooStubPath := "out/bazel/execroot/__main__/libFoo_stub_libs-current.so"
	for _, lib := range linkAgainstFooStubs {
		libLinkRule := ctx.ModuleForTests(lib, "android_arm64_armv8-a_shared").Rule("ld")
		libFlags := libLinkRule.Args["libFlags"]
		if !strings.Contains(libFlags, libFooStubPath) {
			t.Errorf("%q: %q is not found in %q", lib, libFooStubPath, libFlags)
		}
	}
}

func TestVersioningMacro(t *testing.T) {
	t.Parallel()
	for _, tc := range []struct{ moduleName, expected string }{
Loading