Add export_generated_headers

Similar to export_shared_library_headers, this will export headers
imported from a gensrcs or genrule.

Bug: 31742855
Test: Add export_generated_headers, ensure it's in out/soong/Android-*.mk
Change-Id: Ieadefd007ece8b249f011a258a9c5b27f5d3f594
This commit is contained in:
Dan Willemsen 2016-09-28 17:34:58 -07:00
parent 9c8681f4f9
commit b3454ab24d
2 changed files with 43 additions and 19 deletions

View File

@ -64,6 +64,8 @@ type Deps struct {
GeneratedSources []string GeneratedSources []string
GeneratedHeaders []string GeneratedHeaders []string
ReexportGeneratedHeaders []string
CrtBegin, CrtEnd string CrtBegin, CrtEnd string
} }
@ -193,21 +195,22 @@ type dependencyTag struct {
} }
var ( var (
sharedDepTag = dependencyTag{name: "shared", library: true} sharedDepTag = dependencyTag{name: "shared", library: true}
sharedExportDepTag = dependencyTag{name: "shared", library: true, reexportFlags: true} sharedExportDepTag = dependencyTag{name: "shared", library: true, reexportFlags: true}
lateSharedDepTag = dependencyTag{name: "late shared", library: true} lateSharedDepTag = dependencyTag{name: "late shared", library: true}
staticDepTag = dependencyTag{name: "static", library: true} staticDepTag = dependencyTag{name: "static", library: true}
staticExportDepTag = dependencyTag{name: "static", library: true, reexportFlags: true} staticExportDepTag = dependencyTag{name: "static", library: true, reexportFlags: true}
lateStaticDepTag = dependencyTag{name: "late static", library: true} lateStaticDepTag = dependencyTag{name: "late static", library: true}
wholeStaticDepTag = dependencyTag{name: "whole static", library: true, reexportFlags: true} wholeStaticDepTag = dependencyTag{name: "whole static", library: true, reexportFlags: true}
genSourceDepTag = dependencyTag{name: "gen source"} genSourceDepTag = dependencyTag{name: "gen source"}
genHeaderDepTag = dependencyTag{name: "gen header"} genHeaderDepTag = dependencyTag{name: "gen header"}
objDepTag = dependencyTag{name: "obj"} genHeaderExportDepTag = dependencyTag{name: "gen header", reexportFlags: true}
crtBeginDepTag = dependencyTag{name: "crtbegin"} objDepTag = dependencyTag{name: "obj"}
crtEndDepTag = dependencyTag{name: "crtend"} crtBeginDepTag = dependencyTag{name: "crtbegin"}
reuseObjTag = dependencyTag{name: "reuse objects"} crtEndDepTag = dependencyTag{name: "crtend"}
ndkStubDepTag = dependencyTag{name: "ndk stub", library: true} reuseObjTag = dependencyTag{name: "reuse objects"}
ndkLateStubDepTag = dependencyTag{name: "ndk late stub", library: true} ndkStubDepTag = dependencyTag{name: "ndk stub", library: true}
ndkLateStubDepTag = dependencyTag{name: "ndk late stub", library: true}
) )
// Module contains the properties and members used by all C/C++ module types, and implements // Module contains the properties and members used by all C/C++ module types, and implements
@ -503,6 +506,12 @@ func (c *Module) deps(ctx BaseModuleContext) Deps {
} }
} }
for _, gen := range deps.ReexportGeneratedHeaders {
if !inList(gen, deps.GeneratedHeaders) {
ctx.PropertyErrorf("export_generated_headers", "Generated header module not in generated_headers: '%s'", gen)
}
}
return deps return deps
} }
@ -594,7 +603,14 @@ func (c *Module) depsMutator(actx android.BottomUpMutatorContext) {
deps.LateSharedLibs...) deps.LateSharedLibs...)
actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...) actx.AddDependency(c, genSourceDepTag, deps.GeneratedSources...)
actx.AddDependency(c, genHeaderDepTag, deps.GeneratedHeaders...)
for _, gen := range deps.GeneratedHeaders {
depTag := genHeaderDepTag
if inList(gen, deps.ReexportGeneratedHeaders) {
depTag = genHeaderExportDepTag
}
actx.AddDependency(c, depTag, gen)
}
actx.AddDependency(c, objDepTag, deps.ObjFiles...) actx.AddDependency(c, objDepTag, deps.ObjFiles...)
@ -736,12 +752,15 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps {
} else { } else {
ctx.ModuleErrorf("module %q is not a gensrcs or genrule", name) ctx.ModuleErrorf("module %q is not a gensrcs or genrule", name)
} }
case genHeaderDepTag: case genHeaderDepTag, genHeaderExportDepTag:
if genRule, ok := m.(genrule.SourceFileGenerator); ok { if genRule, ok := m.(genrule.SourceFileGenerator); ok {
depPaths.GeneratedHeaders = append(depPaths.GeneratedHeaders, depPaths.GeneratedHeaders = append(depPaths.GeneratedHeaders,
genRule.GeneratedSourceFiles()...) genRule.GeneratedSourceFiles()...)
depPaths.Flags = append(depPaths.Flags, flags := includeDirsToFlags(android.Paths{genRule.GeneratedHeaderDir()})
includeDirsToFlags(android.Paths{genRule.GeneratedHeaderDir()})) depPaths.Flags = append(depPaths.Flags, flags)
if tag == genHeaderExportDepTag {
depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, flags)
}
} else { } else {
ctx.ModuleErrorf("module %q is not a genrule", name) ctx.ModuleErrorf("module %q is not a genrule", name)
} }

View File

@ -67,6 +67,10 @@ type BaseLinkerProperties struct {
// present in static_libs. // present in static_libs.
Export_static_lib_headers []string `android:"arch_variant"` Export_static_lib_headers []string `android:"arch_variant"`
// list of generated headers to re-export include directories from. Entries must be
// present in generated_headers.
Export_generated_headers []string `android:"arch_variant"`
// don't link in crt_begin and crt_end. This flag should only be necessary for // don't link in crt_begin and crt_end. This flag should only be necessary for
// compiling crt or libc. // compiling crt or libc.
Nocrt *bool `android:"arch_variant"` Nocrt *bool `android:"arch_variant"`
@ -107,6 +111,7 @@ func (linker *baseLinker) linkerDeps(ctx BaseModuleContext, deps Deps) Deps {
deps.ReexportStaticLibHeaders = append(deps.ReexportStaticLibHeaders, linker.Properties.Export_static_lib_headers...) deps.ReexportStaticLibHeaders = append(deps.ReexportStaticLibHeaders, linker.Properties.Export_static_lib_headers...)
deps.ReexportSharedLibHeaders = append(deps.ReexportSharedLibHeaders, linker.Properties.Export_shared_lib_headers...) deps.ReexportSharedLibHeaders = append(deps.ReexportSharedLibHeaders, linker.Properties.Export_shared_lib_headers...)
deps.ReexportGeneratedHeaders = append(deps.ReexportGeneratedHeaders, linker.Properties.Export_generated_headers...)
if ctx.ModuleName() != "libcompiler_rt-extras" { if ctx.ModuleName() != "libcompiler_rt-extras" {
deps.LateStaticLibs = append(deps.LateStaticLibs, "libcompiler_rt-extras") deps.LateStaticLibs = append(deps.LateStaticLibs, "libcompiler_rt-extras")