Allow cc modules to pull in rust includes.

Make sure LinkabeInterfaces can export include dirs to cc modules. This
fixes the Rust implementation and makes sure these are pulled in for cc
modules.

Bug: 144052093
Test: cc module depending on a rust library includes dirs correctly.
Change-Id: I6b5d5e6ab6afb507178b4f2cbdc45f01031dbfe4
diff --git a/cc/cc.go b/cc/cc.go
index 5dfc563..e890aa0 100644
--- a/cc/cc.go
+++ b/cc/cc.go
@@ -501,7 +501,7 @@
 	return String(c.Properties.Sdk_version)
 }
 
-func (c *Module) IncludeDirs(ctx android.BaseModuleContext) android.Paths {
+func (c *Module) IncludeDirs() android.Paths {
 	if c.linker != nil {
 		if library, ok := c.linker.(exportedFlagsProducer); ok {
 			return library.exportedDirs()
@@ -2027,10 +2027,11 @@
 				}
 			}
 
+			depPaths.IncludeDirs = append(depPaths.IncludeDirs, ccDep.IncludeDirs()...)
+
 			// Exporting flags only makes sense for cc.Modules
 			if _, ok := ccDep.(*Module); ok {
 				if i, ok := ccDep.(*Module).linker.(exportedFlagsProducer); ok {
-					depPaths.IncludeDirs = append(depPaths.IncludeDirs, i.exportedDirs()...)
 					depPaths.SystemIncludeDirs = append(depPaths.SystemIncludeDirs, i.exportedSystemDirs()...)
 					depPaths.GeneratedHeaders = append(depPaths.GeneratedHeaders, i.exportedDeps()...)
 					depPaths.Flags = append(depPaths.Flags, i.exportedFlags()...)
diff --git a/cc/linkable.go b/cc/linkable.go
index cfbaffe..2efefea 100644
--- a/cc/linkable.go
+++ b/cc/linkable.go
@@ -13,7 +13,7 @@
 
 	OutputFile() android.OptionalPath
 
-	IncludeDirs(ctx android.BaseModuleContext) android.Paths
+	IncludeDirs() android.Paths
 	SetDepsInLinkOrder([]android.Path)
 	GetDepsInLinkOrder() []android.Path
 
diff --git a/rust/library.go b/rust/library.go
index adf6e95..386ea47 100644
--- a/rust/library.go
+++ b/rust/library.go
@@ -78,6 +78,7 @@
 	MutatedProperties    LibraryMutatedProperties
 	distFile             android.OptionalPath
 	unstrippedOutputFile android.Path
+	includeDirs          android.Paths
 }
 
 type libraryInterface interface {
@@ -311,6 +312,13 @@
 
 	return deps
 }
+func (library *libraryDecorator) compilerFlags(ctx ModuleContext, flags Flags) Flags {
+	flags = library.baseCompiler.compilerFlags(ctx, flags)
+	if library.shared() || library.static() {
+		library.includeDirs = append(library.includeDirs, android.PathsForModuleSrc(ctx, library.Properties.Include_dirs)...)
+	}
+	return flags
+}
 
 func (library *libraryDecorator) compile(ctx ModuleContext, flags Flags, deps PathDeps) android.Path {
 	var outputFile android.WritablePath
diff --git a/rust/rust.go b/rust/rust.go
index 612e257..dc7ebf9 100644
--- a/rust/rust.go
+++ b/rust/rust.go
@@ -246,10 +246,10 @@
 	return false
 }
 
-func (mod *Module) IncludeDirs(ctx android.BaseModuleContext) android.Paths {
+func (mod *Module) IncludeDirs() android.Paths {
 	if mod.compiler != nil {
 		if library, ok := mod.compiler.(*libraryDecorator); ok {
-			return android.PathsForSource(ctx, library.Properties.Include_dirs)
+			return library.includeDirs
 		}
 	}
 	panic(fmt.Errorf("IncludeDirs called on non-library module: %q", mod.BaseModuleName()))