diff --git a/cc/cc.go b/cc/cc.go index c09a2f3a9..01577bc64 100644 --- a/cc/cc.go +++ b/cc/cc.go @@ -348,6 +348,7 @@ var ( linkerFlagsDepTag = dependencyTag{name: "linker flags file"} dynamicLinkerDepTag = dependencyTag{name: "dynamic linker"} reuseObjTag = dependencyTag{name: "reuse objects"} + staticVariantTag = dependencyTag{name: "static variant"} ndkStubDepTag = dependencyTag{name: "ndk stub", library: true} ndkLateStubDepTag = dependencyTag{name: "ndk late stub", library: true} vndkExtDepTag = dependencyTag{name: "vndk extends", library: true} @@ -1536,6 +1537,13 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { } } + if depTag == staticVariantTag { + if _, ok := ccDep.compiler.(libraryInterface); ok { + c.staticVariant = ccDep + return + } + } + // Extract explicitlyVersioned field from the depTag and reset it inside the struct. // Otherwise, sharedDepTag and lateSharedDepTag with explicitlyVersioned set to true // won't be matched to sharedDepTag and lateSharedDepTag. diff --git a/cc/cc_test.go b/cc/cc_test.go index dc23620e7..9d370c14b 100644 --- a/cc/cc_test.go +++ b/cc/cc_test.go @@ -215,6 +215,7 @@ func createTestContext(t *testing.T, config android.Config, bp string, os androi ctx.RegisterModuleType("cc_binary", android.ModuleFactoryAdaptor(BinaryFactory)) ctx.RegisterModuleType("cc_library", android.ModuleFactoryAdaptor(LibraryFactory)) ctx.RegisterModuleType("cc_library_shared", android.ModuleFactoryAdaptor(LibrarySharedFactory)) + ctx.RegisterModuleType("cc_library_static", android.ModuleFactoryAdaptor(LibraryStaticFactory)) ctx.RegisterModuleType("cc_library_headers", android.ModuleFactoryAdaptor(LibraryHeaderFactory)) ctx.RegisterModuleType("toolchain_library", android.ModuleFactoryAdaptor(ToolchainLibraryFactory)) ctx.RegisterModuleType("llndk_library", android.ModuleFactoryAdaptor(LlndkLibraryFactory)) @@ -1966,3 +1967,43 @@ func TestStaticExecutable(t *testing.T) { } } } + +func TestStaticDepsOrderWithStubs(t *testing.T) { + ctx := testCc(t, ` + cc_binary { + name: "mybin", + srcs: ["foo.c"], + static_libs: ["libB"], + static_executable: true, + stl: "none", + } + + cc_library { + name: "libB", + srcs: ["foo.c"], + shared_libs: ["libC"], + stl: "none", + } + + cc_library { + name: "libC", + srcs: ["foo.c"], + stl: "none", + stubs: { + versions: ["1"], + }, + }`) + + mybin := ctx.ModuleForTests("mybin", "android_arm64_armv8-a_core").Module().(*Module) + actual := mybin.depsInLinkOrder + expected := getOutputPaths(ctx, "android_arm64_armv8-a_core_static", []string{"libB", "libC"}) + + if !reflect.DeepEqual(actual, expected) { + t.Errorf("staticDeps orderings were not propagated correctly"+ + "\nactual: %v"+ + "\nexpected: %v", + actual, + expected, + ) + } +} diff --git a/cc/library.go b/cc/library.go index b4b89d2ac..a6c7bc871 100644 --- a/cc/library.go +++ b/cc/library.go @@ -1032,6 +1032,9 @@ func reuseStaticLibrary(mctx android.BottomUpMutatorContext, static, shared *Mod sharedCompiler.baseCompiler.Properties.Srcs sharedCompiler.baseCompiler.Properties.Srcs = nil sharedCompiler.baseCompiler.Properties.Generated_sources = nil + } else { + // This dep is just to reference static variant from shared variant + mctx.AddInterVariantDependency(staticVariantTag, shared, static) } } }