From 1ad8e16fbe990163d415ae0dc7f8b47983e97ce0 Mon Sep 17 00:00:00 2001 From: Jiyong Park Date: Tue, 1 Dec 2020 23:40:09 +0900 Subject: [PATCH] stub variants also re-exports headers This change fixes a bug that headers are not re-exported from stub variants of a library, if the headers are not from header libs, but from shared or static libs. This is because only header lib dependencies are respected for stubs variants. The fix is as follows. 1) dependencies to the shared/static libs are added even for stubs variants. 2) instead, in depsToPaths, they are treated like header libs (i.e. don't contribute to linkFile) for the stubs variants. Bug: 174558745 Test: m Change-Id: Iab6c77e7817055d0f2d09cb114186b30164fc231 --- apex/apex.go | 2 ++ cc/cc.go | 37 ++++++++++++++++++++++--------------- cc/cc_test.go | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 15 deletions(-) diff --git a/apex/apex.go b/apex/apex.go index 7ab74541f..b906b28f3 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -1697,6 +1697,8 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { filesInfo = append(filesInfo, af) return true // track transitive dependencies } + } else if cc.IsHeaderDepTag(depTag) { + // nothing } else if java.IsJniDepTag(depTag) { // Because APK-in-APEX embeds jni_libs transitively, we don't need to track transitive deps return false diff --git a/cc/cc.go b/cc/cc.go index b1c126431..6d2eb01df 100644 --- a/cc/cc.go +++ b/cc/cc.go @@ -1881,13 +1881,6 @@ func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) { } } - buildStubs := false - if versioned, ok := c.linker.(versionedInterface); ok { - if versioned.buildStubs() { - buildStubs = true - } - } - rewriteSnapshotLibs := func(lib string, snapshotMap *snapshotMap) string { // only modules with BOARD_VNDK_VERSION uses snapshot. if c.VndkVersion() != actx.DeviceConfig().VndkVersion() { @@ -1910,7 +1903,7 @@ func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) { lib = rewriteSnapshotLibs(lib, vendorSnapshotHeaderLibs) - if buildStubs { + if c.IsStubs() { actx.AddFarVariationDependencies(append(ctx.Target().Variations(), c.ImageVariation()), depTag, lib) } else { @@ -1918,12 +1911,6 @@ func (c *Module) DepsMutator(actx android.BottomUpMutatorContext) { } } - if buildStubs { - // Stubs lib does not have dependency to other static/shared libraries. - // Don't proceed. - return - } - // sysprop_library has to support both C++ and Java. So sysprop_library internally creates one // C++ implementation library and one Java implementation library. When a module links against // sysprop_library, the C++ implementation library has to be linked. syspropImplLibraries is a @@ -2237,6 +2224,11 @@ func checkDoubleLoadableLibraries(ctx android.TopDownMutatorContext) { return false } + depTag := ctx.OtherModuleDependencyTag(child) + if IsHeaderDepTag(depTag) { + return false + } + // Even if target lib has no vendor variant, keep checking dependency // graph in case it depends on vendor_available or product_available // but not double_loadable transtively. @@ -2483,6 +2475,12 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { } } + // Stubs lib doesn't link to the shared lib dependencies. Don't set + // linkFile, depFile, and ptr. + if c.IsStubs() { + break + } + linkFile = android.OptionalPathForPath(sharedLibraryInfo.SharedLibrary) depFile = sharedLibraryInfo.TableOfContents @@ -2510,6 +2508,13 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { } return } + + // Stubs lib doesn't link to the static lib dependencies. Don't set + // linkFile, depFile, and ptr. + if c.IsStubs() { + break + } + staticLibraryInfo := ctx.OtherModuleProvider(dep, StaticLibraryInfoProvider).(StaticLibraryInfo) linkFile = android.OptionalPathForPath(staticLibraryInfo.StaticLibrary) if libDepTag.wholeStatic { @@ -2637,7 +2642,9 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { c.Properties.AndroidMkStaticLibs, makeLibName) } } - } else { + } else if !c.IsStubs() { + // Stubs lib doesn't link to the runtime lib, object, crt, etc. dependencies. + switch depTag { case runtimeDepTag: c.Properties.AndroidMkRuntimeLibs = append( diff --git a/cc/cc_test.go b/cc/cc_test.go index af9b9436c..ce941d5d9 100644 --- a/cc/cc_test.go +++ b/cc/cc_test.go @@ -4056,3 +4056,35 @@ func TestInstallSharedLibs(t *testing.T) { } } + +func TestStubsLibReexportsHeaders(t *testing.T) { + ctx := testCc(t, ` + cc_library_shared { + name: "libclient", + srcs: ["foo.c"], + shared_libs: ["libfoo#1"], + } + + cc_library_shared { + name: "libfoo", + srcs: ["foo.c"], + shared_libs: ["libbar"], + export_shared_lib_headers: ["libbar"], + stubs: { + symbol_file: "foo.map.txt", + versions: ["1", "2", "3"], + }, + } + + cc_library_shared { + name: "libbar", + export_include_dirs: ["include/libbar"], + srcs: ["foo.c"], + }`) + + cFlags := ctx.ModuleForTests("libclient", "android_arm64_armv8-a_shared").Rule("cc").Args["cFlags"] + + if !strings.Contains(cFlags, "-Iinclude/libbar") { + t.Errorf("expected %q in cflags, got %q", "-Iinclude/libbar", cFlags) + } +}