diff options
Diffstat (limited to 'cc')
-rw-r--r-- | cc/binary_sdk_member.go | 5 | ||||
-rw-r--r-- | cc/cc.go | 2 | ||||
-rw-r--r-- | cc/library.go | 19 | ||||
-rw-r--r-- | cc/library_sdk_member.go | 7 | ||||
-rw-r--r-- | cc/linker.go | 10 |
5 files changed, 36 insertions, 7 deletions
diff --git a/cc/binary_sdk_member.go b/cc/binary_sdk_member.go index 9b3235c5d..1d9cc54f8 100644 --- a/cc/binary_sdk_member.go +++ b/cc/binary_sdk_member.go @@ -18,6 +18,7 @@ import ( "path/filepath" "android/soong/android" + "github.com/google/blueprint" ) @@ -137,7 +138,9 @@ func (p *nativeBinaryInfoProperties) AddToPropertySet(ctx android.SdkMemberConte propertySet.AddPropertyWithTag("shared_libs", p.SharedLibs, builder.SdkMemberReferencePropertyTag(false)) } - if len(p.SystemSharedLibs) > 0 { + // SystemSharedLibs needs to be propagated if it's a list, even if it's empty, + // so check for non-nil instead of nonzero length. + if p.SystemSharedLibs != nil { propertySet.AddPropertyWithTag("system_shared_libs", p.SystemSharedLibs, builder.SdkMemberReferencePropertyTag(false)) } } @@ -378,7 +378,7 @@ type linker interface { type specifiedDeps struct { sharedLibs []string - systemSharedLibs []string + systemSharedLibs []string // Note nil and [] are semantically distinct. } type installer interface { diff --git a/cc/library.go b/cc/library.go index 346e7d84d..2ced2c5dc 100644 --- a/cc/library.go +++ b/cc/library.go @@ -749,10 +749,12 @@ func (library *libraryDecorator) compilerDeps(ctx DepsContext, deps Deps) Deps { func (library *libraryDecorator) linkerDeps(ctx DepsContext, deps Deps) Deps { if library.static() { + // Compare with nil because an empty list needs to be propagated. if library.StaticProperties.Static.System_shared_libs != nil { library.baseLinker.Properties.System_shared_libs = library.StaticProperties.Static.System_shared_libs } } else if library.shared() { + // Compare with nil because an empty list needs to be propagated. if library.SharedProperties.Shared.System_shared_libs != nil { library.baseLinker.Properties.System_shared_libs = library.SharedProperties.Shared.System_shared_libs } @@ -828,10 +830,21 @@ func (library *libraryDecorator) linkerSpecifiedDeps(specifiedDeps specifiedDeps } specifiedDeps.sharedLibs = append(specifiedDeps.sharedLibs, properties.Shared_libs...) - specifiedDeps.systemSharedLibs = append(specifiedDeps.systemSharedLibs, properties.System_shared_libs...) + + // Must distinguish nil and [] in system_shared_libs - ensure that [] in + // either input list doesn't come out as nil. + if specifiedDeps.systemSharedLibs == nil { + specifiedDeps.systemSharedLibs = properties.System_shared_libs + } else { + specifiedDeps.systemSharedLibs = append(specifiedDeps.systemSharedLibs, properties.System_shared_libs...) + } specifiedDeps.sharedLibs = android.FirstUniqueStrings(specifiedDeps.sharedLibs) - specifiedDeps.systemSharedLibs = android.FirstUniqueStrings(specifiedDeps.systemSharedLibs) + if len(specifiedDeps.systemSharedLibs) > 0 { + // Skip this if systemSharedLibs is either nil or [], to ensure they are + // retained. + specifiedDeps.systemSharedLibs = android.FirstUniqueStrings(specifiedDeps.systemSharedLibs) + } return specifiedDeps } @@ -1371,6 +1384,8 @@ func reuseStaticLibrary(mctx android.BottomUpMutatorContext, static, shared *Mod len(sharedCompiler.SharedProperties.Shared.Static_libs) == 0 && len(staticCompiler.StaticProperties.Static.Shared_libs) == 0 && len(sharedCompiler.SharedProperties.Shared.Shared_libs) == 0 && + // Compare System_shared_libs properties with nil because empty lists are + // semantically significant for them. staticCompiler.StaticProperties.Static.System_shared_libs == nil && sharedCompiler.SharedProperties.Shared.System_shared_libs == nil { diff --git a/cc/library_sdk_member.go b/cc/library_sdk_member.go index 49674552f..0a11af126 100644 --- a/cc/library_sdk_member.go +++ b/cc/library_sdk_member.go @@ -212,7 +212,9 @@ func addPossiblyArchSpecificProperties(sdkModuleContext android.ModuleContext, b outputProperties.AddPropertyWithTag("shared_libs", libInfo.SharedLibs, builder.SdkMemberReferencePropertyTag(false)) } - if len(libInfo.SystemSharedLibs) > 0 { + // SystemSharedLibs needs to be propagated if it's a list, even if it's empty, + // so check for non-nil instead of nonzero length. + if libInfo.SystemSharedLibs != nil { outputProperties.AddPropertyWithTag("system_shared_libs", libInfo.SystemSharedLibs, builder.SdkMemberReferencePropertyTag(false)) } @@ -327,7 +329,8 @@ type nativeLibInfoProperties struct { // This field is exported as its contents may not be arch specific. SharedLibs []string - // The set of system shared libraries + // The set of system shared libraries. Note nil and [] are semantically + // distinct - see BaseLinkerProperties.System_shared_libs. // // This field is exported as its contents may not be arch specific. SystemSharedLibs []string diff --git a/cc/linker.go b/cc/linker.go index ae5ee0ac3..f65d7c8d3 100644 --- a/cc/linker.go +++ b/cc/linker.go @@ -491,7 +491,15 @@ func (linker *baseLinker) link(ctx ModuleContext, func (linker *baseLinker) linkerSpecifiedDeps(specifiedDeps specifiedDeps) specifiedDeps { specifiedDeps.sharedLibs = append(specifiedDeps.sharedLibs, linker.Properties.Shared_libs...) - specifiedDeps.systemSharedLibs = append(specifiedDeps.systemSharedLibs, linker.Properties.System_shared_libs...) + + // Must distinguish nil and [] in system_shared_libs - ensure that [] in + // either input list doesn't come out as nil. + if specifiedDeps.systemSharedLibs == nil { + specifiedDeps.systemSharedLibs = linker.Properties.System_shared_libs + } else { + specifiedDeps.systemSharedLibs = append(specifiedDeps.systemSharedLibs, linker.Properties.System_shared_libs...) + } + return specifiedDeps } |