Fix generated headers of snapshot

For VNDK snapshot and SDK snapshot, deps files have been used to capture
generated headers. But exported deps might contain intermediate phony
files instead of actual header files, which are for optimization of
ninja. To correctly capture all headers, exported generated header files
are gathered separately.

Bug: 65377115
Test: m nothing
Change-Id: Ia03fa69186490a818578190e3c0bfb0261d1fd6e
This commit is contained in:
Inseob Kim
2019-12-06 13:15:38 +09:00
parent 667039f404
commit d110f878a7
5 changed files with 55 additions and 16 deletions

View File

@@ -94,6 +94,7 @@ type Deps struct {
GeneratedSources []string GeneratedSources []string
GeneratedHeaders []string GeneratedHeaders []string
GeneratedDeps []string
ReexportGeneratedHeaders []string ReexportGeneratedHeaders []string
@@ -120,6 +121,7 @@ type PathDeps struct {
// Paths to generated source files // Paths to generated source files
GeneratedSources android.Paths GeneratedSources android.Paths
GeneratedHeaders android.Paths GeneratedHeaders android.Paths
GeneratedDeps android.Paths
Flags []string Flags []string
IncludeDirs android.Paths IncludeDirs android.Paths
@@ -127,6 +129,7 @@ type PathDeps struct {
ReexportedDirs android.Paths ReexportedDirs android.Paths
ReexportedSystemDirs android.Paths ReexportedSystemDirs android.Paths
ReexportedFlags []string ReexportedFlags []string
ReexportedGeneratedHeaders android.Paths
ReexportedDeps android.Paths ReexportedDeps android.Paths
// Paths to crt*.o files // Paths to crt*.o files
@@ -894,6 +897,13 @@ func (c *Module) ExportedDeps() android.Paths {
return nil return nil
} }
func (c *Module) ExportedGeneratedHeaders() android.Paths {
if flagsProducer, ok := c.linker.(exportedFlagsProducer); ok {
return flagsProducer.exportedGeneratedHeaders()
}
return nil
}
func isBionic(name string) bool { func isBionic(name string) bool {
switch name { switch name {
case "libc", "libm", "libdl", "libdl_android", "linker": case "libc", "libm", "libdl", "libdl_android", "linker":
@@ -1905,6 +1915,7 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.exportedSystemDirs()...) depPaths.ReexportedSystemDirs = append(depPaths.ReexportedSystemDirs, exporter.exportedSystemDirs()...)
depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.exportedFlags()...) depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.exportedFlags()...)
depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.exportedDeps()...) depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.exportedDeps()...)
depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.exportedGeneratedHeaders()...)
} }
ctx.VisitDirectDeps(func(dep android.Module) { ctx.VisitDirectDeps(func(dep android.Module) {
@@ -1928,11 +1939,15 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
case genHeaderDepTag, genHeaderExportDepTag: case genHeaderDepTag, genHeaderExportDepTag:
if genRule, ok := dep.(genrule.SourceFileGenerator); ok { if genRule, ok := dep.(genrule.SourceFileGenerator); ok {
depPaths.GeneratedHeaders = append(depPaths.GeneratedHeaders, depPaths.GeneratedHeaders = append(depPaths.GeneratedHeaders,
genRule.GeneratedSourceFiles()...)
depPaths.GeneratedDeps = append(depPaths.GeneratedDeps,
genRule.GeneratedDeps()...) genRule.GeneratedDeps()...)
dirs := genRule.GeneratedHeaderDirs() dirs := genRule.GeneratedHeaderDirs()
depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...) depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...)
if depTag == genHeaderExportDepTag { if depTag == genHeaderExportDepTag {
depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...) depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...)
depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders,
genRule.GeneratedSourceFiles()...)
depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps()...) depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, genRule.GeneratedDeps()...)
// Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library. // Add these re-exported flags to help header-abi-dumper to infer the abi exported by a library.
c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...) c.sabi.Properties.ReexportedIncludes = append(c.sabi.Properties.ReexportedIncludes, dirs.Strings()...)
@@ -2045,7 +2060,8 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
if _, ok := ccDep.(*Module); ok { if _, ok := ccDep.(*Module); ok {
if i, ok := ccDep.(*Module).linker.(exportedFlagsProducer); ok { if i, ok := ccDep.(*Module).linker.(exportedFlagsProducer); ok {
depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, i.exportedSystemDirs()...) depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, i.exportedSystemDirs()...)
depPaths.GeneratedHeaders = append(depPaths.GeneratedHeaders, i.exportedDeps()...) depPaths.GeneratedHeaders = append(depPaths.GeneratedHeaders, i.exportedGeneratedHeaders()...)
depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, i.exportedDeps()...)
depPaths.Flags = append(depPaths.Flags, i.exportedFlags()...) depPaths.Flags = append(depPaths.Flags, i.exportedFlags()...)
if t.ReexportFlags { if t.ReexportFlags {
@@ -2243,10 +2259,12 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs) depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs)
depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs) depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs)
depPaths.GeneratedHeaders = android.FirstUniquePaths(depPaths.GeneratedHeaders) depPaths.GeneratedHeaders = android.FirstUniquePaths(depPaths.GeneratedHeaders)
depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps)
depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs) depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs)
depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs) depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs)
depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags) depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags)
depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps) depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps)
depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders)
if c.sabi != nil { if c.sabi != nil {
c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes) c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes)

View File

@@ -560,7 +560,7 @@ func ndkPathDeps(ctx ModuleContext) android.Paths {
} }
func (compiler *baseCompiler) compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects { func (compiler *baseCompiler) compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects {
pathDeps := deps.GeneratedHeaders pathDeps := deps.GeneratedDeps
pathDeps = append(pathDeps, ndkPathDeps(ctx)...) pathDeps = append(pathDeps, ndkPathDeps(ctx)...)
buildFlags := flagsToBuilderFlags(flags) buildFlags := flagsToBuilderFlags(flags)

View File

@@ -238,6 +238,7 @@ type flagExporter struct {
systemDirs android.Paths systemDirs android.Paths
flags []string flags []string
deps android.Paths deps android.Paths
headers android.Paths
} }
func (f *flagExporter) exportedIncludes(ctx ModuleContext) android.Paths { func (f *flagExporter) exportedIncludes(ctx ModuleContext) android.Paths {
@@ -281,6 +282,12 @@ func (f *flagExporter) reexportDeps(deps ...android.Path) {
f.deps = append(f.deps, deps...) f.deps = append(f.deps, deps...)
} }
// addExportedGeneratedHeaders does nothing but collects generated header files.
// This can be differ to exportedDeps which may contain phony files to minimize ninja.
func (f *flagExporter) addExportedGeneratedHeaders(headers ...android.Path) {
f.headers = append(f.headers, headers...)
}
func (f *flagExporter) exportedDirs() android.Paths { func (f *flagExporter) exportedDirs() android.Paths {
return f.dirs return f.dirs
} }
@@ -297,11 +304,16 @@ func (f *flagExporter) exportedDeps() android.Paths {
return f.deps return f.deps
} }
func (f *flagExporter) exportedGeneratedHeaders() android.Paths {
return f.headers
}
type exportedFlagsProducer interface { type exportedFlagsProducer interface {
exportedDirs() android.Paths exportedDirs() android.Paths
exportedSystemDirs() android.Paths exportedSystemDirs() android.Paths
exportedFlags() []string exportedFlags() []string
exportedDeps() android.Paths exportedDeps() android.Paths
exportedGeneratedHeaders() android.Paths
} }
var _ exportedFlagsProducer = (*flagExporter)(nil) var _ exportedFlagsProducer = (*flagExporter)(nil)
@@ -967,12 +979,16 @@ func (library *libraryDecorator) link(ctx ModuleContext,
library.reexportSystemDirs(deps.ReexportedSystemDirs...) library.reexportSystemDirs(deps.ReexportedSystemDirs...)
library.reexportFlags(deps.ReexportedFlags...) library.reexportFlags(deps.ReexportedFlags...)
library.reexportDeps(deps.ReexportedDeps...) library.reexportDeps(deps.ReexportedDeps...)
library.addExportedGeneratedHeaders(deps.ReexportedGeneratedHeaders...)
if Bool(library.Properties.Aidl.Export_aidl_headers) { if Bool(library.Properties.Aidl.Export_aidl_headers) {
if library.baseCompiler.hasSrcExt(".aidl") { if library.baseCompiler.hasSrcExt(".aidl") {
dir := android.PathForModuleGen(ctx, "aidl") dir := android.PathForModuleGen(ctx, "aidl")
library.reexportDirs(dir) library.reexportDirs(dir)
library.reexportDeps(library.baseCompiler.pathDeps...) // TODO: restrict to aidl deps
// TODO: restrict to aidl deps
library.reexportDeps(library.baseCompiler.pathDeps...)
library.addExportedGeneratedHeaders(library.baseCompiler.pathDeps...)
} }
} }
@@ -984,7 +1000,10 @@ func (library *libraryDecorator) link(ctx ModuleContext,
} }
includes = append(includes, flags.proto.Dir) includes = append(includes, flags.proto.Dir)
library.reexportDirs(includes...) library.reexportDirs(includes...)
library.reexportDeps(library.baseCompiler.pathDeps...) // TODO: restrict to proto deps
// TODO: restrict to proto deps
library.reexportDeps(library.baseCompiler.pathDeps...)
library.addExportedGeneratedHeaders(library.baseCompiler.pathDeps...)
} }
} }
@@ -1002,6 +1021,7 @@ func (library *libraryDecorator) link(ctx ModuleContext,
library.reexportDirs(dir) library.reexportDirs(dir)
library.reexportDeps(library.baseCompiler.pathDeps...) library.reexportDeps(library.baseCompiler.pathDeps...)
library.addExportedGeneratedHeaders(library.baseCompiler.pathDeps...)
} }
if library.buildStubs() { if library.buildStubs() {
@@ -1448,7 +1468,7 @@ func buildSharedNativeLibSnapshot(sdkModuleContext android.ModuleContext, info *
} }
for _, dir := range includeDirs { for _, dir := range includeDirs {
if _, gen := dir.(android.WritablePath); gen { if _, gen := dir.(android.WritablePath); gen {
// generated headers are copied via exportedDeps. See below. // generated headers are copied via exportedGeneratedHeaders. See below.
continue continue
} }
targetDir := nativeIncludeDir targetDir := nativeIncludeDir
@@ -1465,7 +1485,7 @@ func buildSharedNativeLibSnapshot(sdkModuleContext android.ModuleContext, info *
} }
} }
genHeaders := lib.exportedDeps genHeaders := lib.exportedGeneratedHeaders
for _, file := range genHeaders { for _, file := range genHeaders {
targetDir := nativeGeneratedIncludeDir targetDir := nativeGeneratedIncludeDir
if info.hasArchSpecificFlags { if info.hasArchSpecificFlags {
@@ -1574,7 +1594,7 @@ type archSpecificNativeLibInfo struct {
exportedIncludeDirs android.Paths exportedIncludeDirs android.Paths
exportedSystemIncludeDirs android.Paths exportedSystemIncludeDirs android.Paths
exportedFlags []string exportedFlags []string
exportedDeps android.Paths exportedGeneratedHeaders android.Paths
outputFile android.Path outputFile android.Path
} }
@@ -1608,7 +1628,7 @@ func organizeVariants(member android.SdkMember) *nativeLibInfo {
exportedIncludeDirs: ccModule.ExportedIncludeDirs(), exportedIncludeDirs: ccModule.ExportedIncludeDirs(),
exportedSystemIncludeDirs: ccModule.ExportedSystemIncludeDirs(), exportedSystemIncludeDirs: ccModule.ExportedSystemIncludeDirs(),
exportedFlags: ccModule.ExportedFlags(), exportedFlags: ccModule.ExportedFlags(),
exportedDeps: ccModule.ExportedDeps(), exportedGeneratedHeaders: ccModule.ExportedGeneratedHeaders(),
outputFile: ccModule.OutputFile().Path(), outputFile: ccModule.OutputFile().Path(),
}) })
} }

View File

@@ -90,6 +90,7 @@ func (p *prebuiltLibraryLinker) link(ctx ModuleContext,
p.libraryDecorator.reexportSystemDirs(deps.ReexportedSystemDirs...) p.libraryDecorator.reexportSystemDirs(deps.ReexportedSystemDirs...)
p.libraryDecorator.reexportFlags(deps.ReexportedFlags...) p.libraryDecorator.reexportFlags(deps.ReexportedFlags...)
p.libraryDecorator.reexportDeps(deps.ReexportedDeps...) p.libraryDecorator.reexportDeps(deps.ReexportedDeps...)
p.libraryDecorator.addExportedGeneratedHeaders(deps.ReexportedGeneratedHeaders...)
builderFlags := flagsToBuilderFlags(flags) builderFlags := flagsToBuilderFlags(flags)

View File

@@ -704,7 +704,7 @@ func (c *vndkSnapshotSingleton) GenerateBuildActions(ctx android.SingletonContex
// We glob headers from include directories inside source tree. So we first gather // We glob headers from include directories inside source tree. So we first gather
// all include directories inside our source tree. On the contrast, we manually // all include directories inside our source tree. On the contrast, we manually
// collect generated headers from dependencies as they can't globbed. // collect generated headers from dependencies as they can't globbed.
generatedHeaders = append(generatedHeaders, l.exportedDeps()...) generatedHeaders = append(generatedHeaders, l.exportedGeneratedHeaders()...)
for _, dir := range append(l.exportedDirs(), l.exportedSystemDirs()...) { for _, dir := range append(l.exportedDirs(), l.exportedSystemDirs()...) {
exportedIncludes[dir.String()] = true exportedIncludes[dir.String()] = true
} }