Handle dependencies with export_generated_headers

This sets up the proper dependencies within Soong by adding the imported
dependencies into GeneratedHeaders, and re-exporting them as necessary.
It also exports them to Make using the new LOCAL_EXPORT_C_INCLUDE_DEPS.

Bug: 31742855
Test: Inspection, build hardware/interfaces (pending)
Change-Id: I6a10ceec377a97966baa9d4876b90fcda391dd01
diff --git a/cc/androidmk.go b/cc/androidmk.go
index 676ae30..a4d7fcf 100644
--- a/cc/androidmk.go
+++ b/cc/androidmk.go
@@ -100,6 +100,10 @@
 		if len(exportedIncludes) > 0 {
 			fmt.Fprintln(w, "LOCAL_EXPORT_C_INCLUDE_DIRS :=", strings.Join(exportedIncludes, " "))
 		}
+		exportedIncludeDeps := library.exportedFlagsDeps()
+		if len(exportedIncludeDeps) > 0 {
+			fmt.Fprintln(w, "LOCAL_EXPORT_C_INCLUDE_DEPS :=", strings.Join(exportedIncludeDeps.Strings(), " "))
+		}
 
 		fmt.Fprintln(w, "LOCAL_BUILT_MODULE_STEM := $(LOCAL_MODULE)"+outputFile.Ext())
 
diff --git a/cc/cc.go b/cc/cc.go
index 66c47c1..9a19812 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -80,6 +80,7 @@
 	GeneratedHeaders android.Paths
 
 	Flags, ReexportedFlags []string
+	ReexportedFlagsDeps    android.Paths
 
 	CrtBegin, CrtEnd android.OptionalPath
 }
@@ -760,6 +761,8 @@
 					depPaths.Flags = append(depPaths.Flags, flags)
 					if tag == genHeaderExportDepTag {
 						depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, flags)
+						depPaths.ReexportedFlagsDeps = append(depPaths.ReexportedFlagsDeps,
+							genRule.GeneratedSourceFiles()...)
 					}
 				} else {
 					ctx.ModuleErrorf("module %q is not a genrule", name)
@@ -799,10 +802,13 @@
 		if t, ok := tag.(dependencyTag); ok && t.library {
 			if i, ok := cc.linker.(exportedFlagsProducer); ok {
 				flags := i.exportedFlags()
+				deps := i.exportedFlagsDeps()
 				depPaths.Flags = append(depPaths.Flags, flags...)
+				depPaths.GeneratedHeaders = append(depPaths.GeneratedHeaders, deps...)
 
 				if t.reexportFlags {
 					depPaths.ReexportedFlags = append(depPaths.ReexportedFlags, flags...)
+					depPaths.ReexportedFlagsDeps = append(depPaths.ReexportedFlagsDeps, deps...)
 				}
 			}
 
diff --git a/cc/library.go b/cc/library.go
index cc5ff15..7cc587f 100644
--- a/cc/library.go
+++ b/cc/library.go
@@ -117,7 +117,8 @@
 type flagExporter struct {
 	Properties FlagExporterProperties
 
-	flags []string
+	flags     []string
+	flagsDeps android.Paths
 }
 
 func (f *flagExporter) exportIncludes(ctx ModuleContext, inc string) {
@@ -131,12 +132,21 @@
 	f.flags = append(f.flags, flags...)
 }
 
+func (f *flagExporter) reexportDeps(deps android.Paths) {
+	f.flagsDeps = append(f.flagsDeps, deps...)
+}
+
 func (f *flagExporter) exportedFlags() []string {
 	return f.flags
 }
 
+func (f *flagExporter) exportedFlagsDeps() android.Paths {
+	return f.flagsDeps
+}
+
 type exportedFlagsProducer interface {
 	exportedFlags() []string
+	exportedFlagsDeps() android.Paths
 }
 
 var _ exportedFlagsProducer = (*flagExporter)(nil)
@@ -445,6 +455,7 @@
 
 	library.exportIncludes(ctx, "-I")
 	library.reexportFlags(deps.ReexportedFlags)
+	library.reexportDeps(deps.ReexportedFlagsDeps)
 
 	return out
 }