Loading bazel/cquery/request_type.go +3 −0 Original line number Diff line number Diff line Loading @@ -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 = "" Loading @@ -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: Loading bp2build/cc_library_shared_conversion_test.go +37 −0 Original line number Diff line number Diff line Loading @@ -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"`, }), }, }) } cc/bp2build.go +3 −1 Original line number Diff line number Diff line Loading @@ -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) Loading cc/cc.go +12 −7 Original line number Diff line number Diff line Loading @@ -1964,6 +1964,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. // Loading @@ -1983,13 +1994,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() { Loading cc/cc_test.go +127 −0 Original line number Diff line number Diff line Loading @@ -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 Loading
bazel/cquery/request_type.go +3 −0 Original line number Diff line number Diff line Loading @@ -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 = "" Loading @@ -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: Loading
bp2build/cc_library_shared_conversion_test.go +37 −0 Original line number Diff line number Diff line Loading @@ -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"`, }), }, }) }
cc/bp2build.go +3 −1 Original line number Diff line number Diff line Loading @@ -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) Loading
cc/cc.go +12 −7 Original line number Diff line number Diff line Loading @@ -1964,6 +1964,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. // Loading @@ -1983,13 +1994,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() { Loading
cc/cc_test.go +127 −0 Original line number Diff line number Diff line Loading @@ -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