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

Commit ca438e6b authored by Sam Delmerico's avatar Sam Delmerico
Browse files

mixed builds correctly reference stubs libs

Bug: 270408757
Test: go test
Test: m NeuralNetworksTest_shared_partial --bazel-mode-staging
  && verify that Ninja commands link libneuralnetworks via stubs
Change-Id: I19bf5a829cea7fd00c0f82511ad2bddbc40fae4f
parent 2a1de1bf
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:
+37 −0
Original line number Diff line number Diff line
@@ -1249,3 +1249,40 @@ 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",
			"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"`,
			}),
		},
	})
}
+3 −1
Original line number Diff line number Diff line
@@ -762,8 +762,10 @@ func bp2BuildParseBaseProps(ctx android.Bp2buildMutatorContext, module *Module)

			if libraryProps, ok := archVariantLibraryProperties[axis][cfg].(*LibraryProperties); ok {
				if axis == bazel.NoConfigAxis {
					versions := android.CopyOf(libraryProps.Stubs.Versions)
					normalizeVersions(ctx, versions)
					compilerAttrs.stubsSymbolFile = libraryProps.Stubs.Symbol_file
					compilerAttrs.stubsVersions.SetSelectValue(axis, cfg, libraryProps.Stubs.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
@@ -1960,6 +1960,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.
	//
@@ -1979,13 +1990,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
@@ -3680,6 +3680,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