Merge changes I2373d366,I908496d9 am: c7a4de25c1 am: 9729b0a9ed am: 8f7bf4891b am: 508ccd58fe am: 7c2cdd055c

Original change: https://android-review.googlesource.com/c/platform/build/soong/+/1877337

Change-Id: I7906faab94f0a0e2048cc56a192216e8c0968205
This commit is contained in:
Ivan Lozano
2021-11-02 13:46:49 +00:00
committed by Automerger Merge Worker
3 changed files with 24 additions and 8 deletions

View File

@@ -31,6 +31,11 @@ type BinaryCompilerProperties struct {
Static_executable *bool `android:"arch_variant"`
}
type binaryInterface interface {
binary() bool
staticallyLinked() bool
}
type binaryDecorator struct {
*baseCompiler
stripper Stripper
@@ -155,3 +160,11 @@ func (binary *binaryDecorator) stdLinkage(ctx *depsContext) RustLinkage {
}
return binary.baseCompiler.stdLinkage(ctx)
}
func (binary *binaryDecorator) binary() bool {
return true
}
func (binary *binaryDecorator) staticallyLinked() bool {
return Bool(binary.Properties.Static_executable)
}

View File

@@ -261,10 +261,8 @@ func (mod *Module) Rlib() bool {
}
func (mod *Module) Binary() bool {
if mod.compiler != nil {
if _, ok := mod.compiler.(*binaryDecorator); ok {
return true
}
if binary, ok := mod.compiler.(binaryInterface); ok {
return binary.binary()
}
return false
}
@@ -273,7 +271,7 @@ func (mod *Module) StaticExecutable() bool {
if !mod.Binary() {
return false
}
return Bool(mod.compiler.(*binaryDecorator).Properties.Static_executable)
return mod.StaticallyLinked()
}
func (mod *Module) Object() bool {
@@ -1123,7 +1121,12 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
if cc.IsWholeStaticLib(depTag) {
// rustc will bundle static libraries when they're passed with "-lstatic=<lib>". This will fail
// if the library is not prefixed by "lib".
if libName, ok := libNameFromFilePath(linkObject.Path()); ok {
if mod.Binary() {
// Binaries may sometimes need to link whole static libraries that don't start with 'lib'.
// Since binaries don't need to 'rebundle' these like libraries and only use these for the
// final linkage, pass the args directly to the linker to handle these cases.
depPaths.depLinkFlags = append(depPaths.depLinkFlags, []string{"-Wl,--whole-archive", linkObject.Path().String(), "-Wl,--no-whole-archive"}...)
} else if libName, ok := libNameFromFilePath(linkObject.Path()); ok {
depPaths.depFlags = append(depPaths.depFlags, "-lstatic="+libName)
} else {
ctx.ModuleErrorf("'%q' cannot be listed as a whole_static_library in Rust modules unless the output is prefixed by 'lib'", depName, ctx.ModuleName())

View File

@@ -311,8 +311,8 @@ func (mod *Module) SetSanitizeDep(b bool) {
func (mod *Module) StaticallyLinked() bool {
if lib, ok := mod.compiler.(libraryInterface); ok {
return lib.rlib() || lib.static()
} else if binary, ok := mod.compiler.(*binaryDecorator); ok {
return Bool(binary.Properties.Static_executable)
} else if binary, ok := mod.compiler.(binaryInterface); ok {
return binary.staticallyLinked()
}
return false
}