Check reused source files in hasSrcExt

hasSrcExt is used to determine extra flags and dependencies when
generated files are used.  If the generated files are being handled
in a static library whose objects are reused in a shared library,
the flags and dependencies still need to apply.  Instead of clearing
the source files in the shared library, move them to an OriginalSrcs
property, and check that in hasSrcExt along with the Srcs property.

Also pass extra exported include directories from the static
library to the shared library.

Bug: 37555583
Test: use protos in a cc_library
Change-Id: I709779ec03b66b220b7bd58a1f6f0b9b5067d955
This commit is contained in:
Colin Cross 2017-05-03 11:01:58 -07:00
parent 5ff51b5caa
commit 10d2231d44
3 changed files with 44 additions and 19 deletions

View file

@ -950,7 +950,9 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
if tag == reuseObjTag {
if l, ok := cc.compiler.(libraryInterface); ok {
depPaths.Objs = depPaths.Objs.Append(l.reuseObjs())
objs, flags := l.reuseObjs()
depPaths.Objs = depPaths.Objs.Append(objs)
depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, flags...)
return
}
}

View file

@ -125,6 +125,9 @@ type BaseCompilerProperties struct {
Exclude_srcs []string
}
}
// Stores the original list of source files before being cleared by library reuse
OriginalSrcs []string `blueprint:"mutated"`
}
func NewBaseCompiler() *baseCompiler {
@ -427,6 +430,11 @@ func (compiler *baseCompiler) hasSrcExt(ext string) bool {
return true
}
}
for _, src := range compiler.Properties.OriginalSrcs {
if filepath.Ext(src) == ext {
return true
}
}
return false
}

View file

@ -200,7 +200,9 @@ type libraryDecorator struct {
MutatedProperties LibraryMutatedProperties
// For reusing static library objects for shared library
reuseObjects Objects
reuseObjects Objects
reuseExportedFlags []string
// table-of-contents file to optimize out relinking when possible
tocFile android.OptionalPath
@ -362,7 +364,7 @@ type libraryInterface interface {
getWholeStaticMissingDeps() []string
static() bool
objs() Objects
reuseObjs() Objects
reuseObjs() (Objects, []string)
toc() android.OptionalPath
// Returns true if the build options for the module have selected a static or shared build
@ -615,19 +617,23 @@ func (library *libraryDecorator) link(ctx ModuleContext,
if library.Properties.Aidl.Export_aidl_headers {
if library.baseCompiler.hasSrcExt(".aidl") {
library.reexportFlags([]string{
flags := []string{
"-I" + android.PathForModuleGen(ctx, "aidl").String(),
})
}
library.reexportFlags(flags)
library.reuseExportedFlags = append(library.reuseExportedFlags, flags...)
library.reexportDeps(library.baseCompiler.deps) // TODO: restrict to aidl deps
}
}
if library.Properties.Proto.Export_proto_headers {
if library.baseCompiler.hasSrcExt(".proto") {
library.reexportFlags([]string{
flags := []string{
"-I" + protoSubDir(ctx).String(),
"-I" + protoDir(ctx).String(),
})
}
library.reexportFlags(flags)
library.reuseExportedFlags = append(library.reuseExportedFlags, flags...)
library.reexportDeps(library.baseCompiler.deps) // TODO: restrict to proto deps
}
}
@ -653,8 +659,8 @@ func (library *libraryDecorator) objs() Objects {
return library.objects
}
func (library *libraryDecorator) reuseObjs() Objects {
return library.reuseObjects
func (library *libraryDecorator) reuseObjs() (Objects, []string) {
return library.reuseObjects, library.reuseExportedFlags
}
func (library *libraryDecorator) toc() android.OptionalPath {
@ -724,6 +730,23 @@ func NewLibrary(hod android.HostOrDeviceSupported) (*Module, *libraryDecorator)
return module, library
}
// connects a shared library to a static library in order to reuse its .o files to avoid
// compiling source files twice.
func reuseStaticLibrary(mctx android.BottomUpMutatorContext, static, shared *Module) {
if staticCompiler, ok := static.compiler.(*libraryDecorator); ok {
sharedCompiler := shared.compiler.(*libraryDecorator)
if len(staticCompiler.Properties.Static.Cflags) == 0 &&
len(sharedCompiler.Properties.Shared.Cflags) == 0 {
mctx.AddInterVariantDependency(reuseObjTag, shared, static)
sharedCompiler.baseCompiler.Properties.OriginalSrcs =
sharedCompiler.baseCompiler.Properties.Srcs
sharedCompiler.baseCompiler.Properties.Srcs = nil
sharedCompiler.baseCompiler.Properties.Generated_sources = nil
}
}
}
func linkageMutator(mctx android.BottomUpMutatorContext) {
if m, ok := mctx.Module().(*Module); ok && m.linker != nil {
if library, ok := m.linker.(libraryInterface); ok {
@ -736,16 +759,8 @@ func linkageMutator(mctx android.BottomUpMutatorContext) {
static.linker.(libraryInterface).setStatic()
shared.linker.(libraryInterface).setShared()
if staticCompiler, ok := static.compiler.(*libraryDecorator); ok {
sharedCompiler := shared.compiler.(*libraryDecorator)
if len(staticCompiler.Properties.Static.Cflags) == 0 &&
len(sharedCompiler.Properties.Shared.Cflags) == 0 {
// Optimize out compiling common .o files twice for static+shared libraries
mctx.AddInterVariantDependency(reuseObjTag, shared, static)
sharedCompiler.baseCompiler.Properties.Srcs = nil
sharedCompiler.baseCompiler.Properties.Generated_sources = nil
}
}
reuseStaticLibrary(mctx, static, shared)
} else if library.buildStatic() {
modules = mctx.CreateLocalVariations("static")
modules[0].(*Module).linker.(libraryInterface).setStatic()