From d110f878a7e7ff065e66859da78cb082e92d0169 Mon Sep 17 00:00:00 2001 From: Inseob Kim Date: Fri, 6 Dec 2019 13:15:38 +0900 Subject: [PATCH] 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 --- cc/cc.go | 34 ++++++++++++++++++++++++++-------- cc/compiler.go | 2 +- cc/library.go | 32 ++++++++++++++++++++++++++------ cc/prebuilt.go | 1 + cc/vndk.go | 2 +- 5 files changed, 55 insertions(+), 16 deletions(-) diff --git a/cc/cc.go b/cc/cc.go index e80e2a297..a56978d66 100644 --- a/cc/cc.go +++ b/cc/cc.go @@ -94,6 +94,7 @@ type Deps struct { GeneratedSources []string GeneratedHeaders []string + GeneratedDeps []string ReexportGeneratedHeaders []string @@ -120,14 +121,16 @@ type PathDeps struct { // Paths to generated source files GeneratedSources android.Paths GeneratedHeaders android.Paths + GeneratedDeps android.Paths - Flags []string - IncludeDirs android.Paths - SystemIncludeDirs android.Paths - ReexportedDirs android.Paths - ReexportedSystemDirs android.Paths - ReexportedFlags []string - ReexportedDeps android.Paths + Flags []string + IncludeDirs android.Paths + SystemIncludeDirs android.Paths + ReexportedDirs android.Paths + ReexportedSystemDirs android.Paths + ReexportedFlags []string + ReexportedGeneratedHeaders android.Paths + ReexportedDeps android.Paths // Paths to crt*.o files CrtBegin, CrtEnd android.OptionalPath @@ -894,6 +897,13 @@ func (c *Module) ExportedDeps() android.Paths { 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 { switch name { 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.ReexportedFlags = append(depPaths.ReexportedFlags, exporter.exportedFlags()...) depPaths.ReexportedDeps = append(depPaths.ReexportedDeps, exporter.exportedDeps()...) + depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, exporter.exportedGeneratedHeaders()...) } ctx.VisitDirectDeps(func(dep android.Module) { @@ -1928,11 +1939,15 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { case genHeaderDepTag, genHeaderExportDepTag: if genRule, ok := dep.(genrule.SourceFileGenerator); ok { depPaths.GeneratedHeaders = append(depPaths.GeneratedHeaders, + genRule.GeneratedSourceFiles()...) + depPaths.GeneratedDeps = append(depPaths.GeneratedDeps, genRule.GeneratedDeps()...) dirs := genRule.GeneratedHeaderDirs() depPaths.IncludeDirs = append(depPaths.IncludeDirs, dirs...) if depTag == genHeaderExportDepTag { depPaths.ReexportedDirs = append(depPaths.ReexportedDirs, dirs...) + depPaths.ReexportedGeneratedHeaders = append(depPaths.ReexportedGeneratedHeaders, + genRule.GeneratedSourceFiles()...) 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. 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 i, ok := ccDep.(*Module).linker.(exportedFlagsProducer); ok { 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()...) if t.ReexportFlags { @@ -2243,10 +2259,12 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { depPaths.IncludeDirs = android.FirstUniquePaths(depPaths.IncludeDirs) depPaths.SystemIncludeDirs = android.FirstUniquePaths(depPaths.SystemIncludeDirs) depPaths.GeneratedHeaders = android.FirstUniquePaths(depPaths.GeneratedHeaders) + depPaths.GeneratedDeps = android.FirstUniquePaths(depPaths.GeneratedDeps) depPaths.ReexportedDirs = android.FirstUniquePaths(depPaths.ReexportedDirs) depPaths.ReexportedSystemDirs = android.FirstUniquePaths(depPaths.ReexportedSystemDirs) depPaths.ReexportedFlags = android.FirstUniqueStrings(depPaths.ReexportedFlags) depPaths.ReexportedDeps = android.FirstUniquePaths(depPaths.ReexportedDeps) + depPaths.ReexportedGeneratedHeaders = android.FirstUniquePaths(depPaths.ReexportedGeneratedHeaders) if c.sabi != nil { c.sabi.Properties.ReexportedIncludes = android.FirstUniqueStrings(c.sabi.Properties.ReexportedIncludes) diff --git a/cc/compiler.go b/cc/compiler.go index 2bc6ae26e..1ced451fa 100644 --- a/cc/compiler.go +++ b/cc/compiler.go @@ -560,7 +560,7 @@ func ndkPathDeps(ctx ModuleContext) android.Paths { } func (compiler *baseCompiler) compile(ctx ModuleContext, flags Flags, deps PathDeps) Objects { - pathDeps := deps.GeneratedHeaders + pathDeps := deps.GeneratedDeps pathDeps = append(pathDeps, ndkPathDeps(ctx)...) buildFlags := flagsToBuilderFlags(flags) diff --git a/cc/library.go b/cc/library.go index 60b00b193..64ee9072b 100644 --- a/cc/library.go +++ b/cc/library.go @@ -238,6 +238,7 @@ type flagExporter struct { systemDirs android.Paths flags []string deps android.Paths + headers 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...) } +// 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 { return f.dirs } @@ -297,11 +304,16 @@ func (f *flagExporter) exportedDeps() android.Paths { return f.deps } +func (f *flagExporter) exportedGeneratedHeaders() android.Paths { + return f.headers +} + type exportedFlagsProducer interface { exportedDirs() android.Paths exportedSystemDirs() android.Paths exportedFlags() []string exportedDeps() android.Paths + exportedGeneratedHeaders() android.Paths } var _ exportedFlagsProducer = (*flagExporter)(nil) @@ -967,12 +979,16 @@ func (library *libraryDecorator) link(ctx ModuleContext, library.reexportSystemDirs(deps.ReexportedSystemDirs...) library.reexportFlags(deps.ReexportedFlags...) library.reexportDeps(deps.ReexportedDeps...) + library.addExportedGeneratedHeaders(deps.ReexportedGeneratedHeaders...) if Bool(library.Properties.Aidl.Export_aidl_headers) { if library.baseCompiler.hasSrcExt(".aidl") { dir := android.PathForModuleGen(ctx, "aidl") 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) 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.reexportDeps(library.baseCompiler.pathDeps...) + library.addExportedGeneratedHeaders(library.baseCompiler.pathDeps...) } if library.buildStubs() { @@ -1448,7 +1468,7 @@ func buildSharedNativeLibSnapshot(sdkModuleContext android.ModuleContext, info * } for _, dir := range includeDirs { if _, gen := dir.(android.WritablePath); gen { - // generated headers are copied via exportedDeps. See below. + // generated headers are copied via exportedGeneratedHeaders. See below. continue } targetDir := nativeIncludeDir @@ -1465,7 +1485,7 @@ func buildSharedNativeLibSnapshot(sdkModuleContext android.ModuleContext, info * } } - genHeaders := lib.exportedDeps + genHeaders := lib.exportedGeneratedHeaders for _, file := range genHeaders { targetDir := nativeGeneratedIncludeDir if info.hasArchSpecificFlags { @@ -1574,7 +1594,7 @@ type archSpecificNativeLibInfo struct { exportedIncludeDirs android.Paths exportedSystemIncludeDirs android.Paths exportedFlags []string - exportedDeps android.Paths + exportedGeneratedHeaders android.Paths outputFile android.Path } @@ -1608,7 +1628,7 @@ func organizeVariants(member android.SdkMember) *nativeLibInfo { exportedIncludeDirs: ccModule.ExportedIncludeDirs(), exportedSystemIncludeDirs: ccModule.ExportedSystemIncludeDirs(), exportedFlags: ccModule.ExportedFlags(), - exportedDeps: ccModule.ExportedDeps(), + exportedGeneratedHeaders: ccModule.ExportedGeneratedHeaders(), outputFile: ccModule.OutputFile().Path(), }) } diff --git a/cc/prebuilt.go b/cc/prebuilt.go index 4e6cdd755..32676d6f5 100644 --- a/cc/prebuilt.go +++ b/cc/prebuilt.go @@ -90,6 +90,7 @@ func (p *prebuiltLibraryLinker) link(ctx ModuleContext, p.libraryDecorator.reexportSystemDirs(deps.ReexportedSystemDirs...) p.libraryDecorator.reexportFlags(deps.ReexportedFlags...) p.libraryDecorator.reexportDeps(deps.ReexportedDeps...) + p.libraryDecorator.addExportedGeneratedHeaders(deps.ReexportedGeneratedHeaders...) builderFlags := flagsToBuilderFlags(flags) diff --git a/cc/vndk.go b/cc/vndk.go index f25861af9..5aeb2e635 100644 --- a/cc/vndk.go +++ b/cc/vndk.go @@ -704,7 +704,7 @@ func (c *vndkSnapshotSingleton) GenerateBuildActions(ctx android.SingletonContex // 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 // 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()...) { exportedIncludes[dir.String()] = true }