diff --git a/cc/cc.go b/cc/cc.go index e3ac6d716..aa656da6e 100644 --- a/cc/cc.go +++ b/cc/cc.go @@ -562,6 +562,10 @@ func (c *Module) CcLibraryInterface() bool { return false } +func (c *Module) NonCcVariants() bool { + return false +} + func (c *Module) SetBuildStubs() { if c.linker != nil { if library, ok := c.linker.(*libraryDecorator); ok { diff --git a/cc/library.go b/cc/library.go index dde067cab..b8c4b5125 100644 --- a/cc/library.go +++ b/cc/library.go @@ -1262,13 +1262,15 @@ func LinkageMutator(mctx android.BottomUpMutatorContext) { shared.linker.(prebuiltLibraryInterface).disablePrebuilt() } } else if library, ok := mctx.Module().(LinkableInterface); ok && library.CcLibraryInterface() { - if library.BuildStaticVariant() && library.BuildSharedVariant() { - variations := []string{"static", "shared"} - // Non-cc.Modules need an empty variant for their mutators. - if _, ok := mctx.Module().(*Module); !ok { - variations = append(variations, "") - } + // Non-cc.Modules may need an empty variant for their mutators. + variations := []string{} + if library.NonCcVariants() { + variations = append(variations, "") + } + + if library.BuildStaticVariant() && library.BuildSharedVariant() { + variations := append([]string{"static", "shared"}, variations...) modules := mctx.CreateLocalVariations(variations...) static := modules[0].(LinkableInterface) @@ -1281,16 +1283,18 @@ func LinkageMutator(mctx android.BottomUpMutatorContext) { reuseStaticLibrary(mctx, static.(*Module), shared.(*Module)) } } else if library.BuildStaticVariant() { - modules := mctx.CreateLocalVariations("static") + variations := append([]string{"static"}, variations...) + + modules := mctx.CreateLocalVariations(variations...) modules[0].(LinkableInterface).SetStatic() } else if library.BuildSharedVariant() { - modules := mctx.CreateLocalVariations("shared") - modules[0].(LinkableInterface).SetShared() - } else if _, ok := mctx.Module().(*Module); !ok { - // Non-cc.Modules need an empty variant for their mutators. - mctx.CreateLocalVariations("") - } + variations := append([]string{"shared"}, variations...) + modules := mctx.CreateLocalVariations(variations...) + modules[0].(LinkableInterface).SetShared() + } else if len(variations) > 0 { + mctx.CreateLocalVariations(variations...) + } } } diff --git a/cc/linkable.go b/cc/linkable.go index 2efefea19..815d405c8 100644 --- a/cc/linkable.go +++ b/cc/linkable.go @@ -20,6 +20,8 @@ type LinkableInterface interface { HasStaticVariant() bool GetStaticVariant() LinkableInterface + NonCcVariants() bool + StubsVersions() []string BuildStubs() bool SetBuildStubs() diff --git a/rust/rust.go b/rust/rust.go index 8782f8ec0..096f7b684 100644 --- a/rust/rust.go +++ b/rust/rust.go @@ -89,6 +89,19 @@ func (mod *Module) SelectedStl() string { return "" } +func (mod *Module) NonCcVariants() bool { + if mod.compiler != nil { + if library, ok := mod.compiler.(libraryInterface); ok { + if library.buildRlib() || library.buildDylib() { + return true + } else { + return false + } + } + } + panic(fmt.Errorf("NonCcVariants called on non-library module: %q", mod.BaseModuleName())) +} + func (mod *Module) ApiLevel() string { panic(fmt.Errorf("Called ApiLevel on Rust module %q; stubs libraries are not yet supported.", mod.BaseModuleName())) }