Ensure hermetic device rust_bindgen.

rust_bindgen was not hermetic previously as it would pull in host
headers for device targets. This fixes that by using the same flags we
use when compiling with Clang. This also makes sure our rust_bindgen
headers are built as similar as possible to their respective
cc_libraries.

This also pulls in the bionic dependencies as well, which provide the
headers required for device targets.

Bug: 162007475
Test: device rust_bindgen deps file does not reference host headers.

Change-Id: I4efdf333e011a6c6d73a0345e5485823f166d17a
diff --git a/rust/binary.go b/rust/binary.go
index 48f51db..0d7f541 100644
--- a/rust/binary.go
+++ b/rust/binary.go
@@ -86,7 +86,7 @@
 	deps = binary.baseCompiler.compilerDeps(ctx, deps)
 
 	if ctx.toolchain().Bionic() {
-		deps = binary.baseCompiler.bionicDeps(ctx, deps)
+		deps = bionicDeps(deps)
 		deps.CrtBegin = "crtbegin_dynamic"
 		deps.CrtEnd = "crtend_android"
 	}
diff --git a/rust/bindgen.go b/rust/bindgen.go
index 099bc6e..43053b0 100644
--- a/rust/bindgen.go
+++ b/rust/bindgen.go
@@ -15,11 +15,11 @@
 package rust
 
 import (
-	"github.com/google/blueprint"
 	"strings"
 
+	"github.com/google/blueprint"
+
 	"android/soong/android"
-	"android/soong/cc"
 	ccConfig "android/soong/cc/config"
 )
 
@@ -84,40 +84,39 @@
 	Properties BindgenProperties
 }
 
-func (b *bindgenDecorator) libraryExports(ctx android.ModuleContext) (android.Paths, []string) {
-	var libraryPaths android.Paths
-	var libraryFlags []string
-
-	for _, static_lib := range b.Properties.Static_libs {
-		if dep, ok := ctx.GetDirectDepWithTag(static_lib, cc.StaticDepTag).(*cc.Module); ok {
-			libraryPaths = append(libraryPaths, dep.ExportedIncludeDirs()...)
-			libraryFlags = append(libraryFlags, dep.ExportedFlags()...)
-		}
-	}
-	for _, shared_lib := range b.Properties.Shared_libs {
-		if dep, ok := ctx.GetDirectDepWithTag(shared_lib, cc.SharedDepTag).(*cc.Module); ok {
-			libraryPaths = append(libraryPaths, dep.ExportedIncludeDirs()...)
-			libraryFlags = append(libraryFlags, dep.ExportedFlags()...)
-		}
-	}
-
-	return libraryPaths, libraryFlags
-}
-
-func (b *bindgenDecorator) generateSource(ctx android.ModuleContext) android.Path {
+func (b *bindgenDecorator) generateSource(ctx android.ModuleContext, deps PathDeps) android.Path {
 	ccToolchain := ccConfig.FindToolchain(ctx.Os(), ctx.Arch())
-	includes, exportedFlags := b.libraryExports(ctx)
 
 	var cflags []string
-	cflags = append(cflags, b.Properties.Cflags...)
+	var implicits android.Paths
+
+	implicits = append(implicits, deps.depIncludePaths...)
+	implicits = append(implicits, deps.depSystemIncludePaths...)
+
+	// Default clang flags
+	cflags = append(cflags, "${ccConfig.CommonClangGlobalCflags}")
+	if ctx.Device() {
+		cflags = append(cflags, "${ccConfig.DeviceClangGlobalCflags}")
+	}
+
+	// Toolchain clang flags
 	cflags = append(cflags, "-target "+ccToolchain.ClangTriple())
 	cflags = append(cflags, strings.ReplaceAll(ccToolchain.ToolchainClangCflags(), "${config.", "${ccConfig."))
-	cflags = append(cflags, exportedFlags...)
-	for _, include := range includes {
+
+	// Dependency clang flags and include paths
+	cflags = append(cflags, deps.depClangFlags...)
+	for _, include := range deps.depIncludePaths {
 		cflags = append(cflags, "-I"+include.String())
 	}
+	for _, include := range deps.depSystemIncludePaths {
+		cflags = append(cflags, "-isystem "+include.String())
+	}
+
+	// Module defined clang flags and include paths
+	cflags = append(cflags, b.Properties.Cflags...)
 	for _, include := range b.Properties.Local_include_dirs {
 		cflags = append(cflags, "-I"+android.PathForModuleSrc(ctx, include).String())
+		implicits = append(implicits, android.PathForModuleSrc(ctx, include))
 	}
 
 	bindgenFlags := defaultBindgenFlags
@@ -135,7 +134,7 @@
 		Description: "bindgen " + wrapperFile.Path().Rel(),
 		Output:      outputFile,
 		Input:       wrapperFile.Path(),
-		Implicits:   includes,
+		Implicits:   implicits,
 		Args: map[string]string{
 			"flags":  strings.Join(bindgenFlags, " "),
 			"cflags": strings.Join(cflags, " "),
@@ -172,6 +171,10 @@
 
 func (b *bindgenDecorator) sourceProviderDeps(ctx DepsContext, deps Deps) Deps {
 	deps = b.baseSourceProvider.sourceProviderDeps(ctx, deps)
+	if ctx.toolchain().Bionic() {
+		deps = bionicDeps(deps)
+	}
+
 	deps.SharedLibs = append(deps.SharedLibs, b.Properties.Shared_libs...)
 	deps.StaticLibs = append(deps.StaticLibs, b.Properties.Static_libs...)
 	return deps
diff --git a/rust/bindgen_test.go b/rust/bindgen_test.go
index 18e188f..2122ec1 100644
--- a/rust/bindgen_test.go
+++ b/rust/bindgen_test.go
@@ -48,9 +48,9 @@
 		t.Errorf("missing clang cflags in rust_bindgen rule: cflags %#v", libbindgen.Args["cflags"])
 	}
 	if !strings.Contains(libbindgen.Args["cflags"], "-Ishared_include") {
-		t.Errorf("missing clang cflags in rust_bindgen rule: cflags %#v", libbindgen.Args["cflags"])
+		t.Errorf("missing shared_libs exported includes in rust_bindgen rule: cflags %#v", libbindgen.Args["cflags"])
 	}
 	if !strings.Contains(libbindgen.Args["cflags"], "-Istatic_include") {
-		t.Errorf("missing clang cflags in rust_bindgen rule: cflags %#v", libbindgen.Args["cflags"])
+		t.Errorf("missing static_libs exported includes in rust_bindgen rule: cflags %#v", libbindgen.Args["cflags"])
 	}
 }
diff --git a/rust/compiler.go b/rust/compiler.go
index ab3d2f4..040219d 100644
--- a/rust/compiler.go
+++ b/rust/compiler.go
@@ -199,7 +199,7 @@
 	return deps
 }
 
-func (compiler *baseCompiler) bionicDeps(ctx DepsContext, deps Deps) Deps {
+func bionicDeps(deps Deps) Deps {
 	deps.SharedLibs = append(deps.SharedLibs, "liblog")
 	deps.SharedLibs = append(deps.SharedLibs, "libc")
 	deps.SharedLibs = append(deps.SharedLibs, "libm")
diff --git a/rust/library.go b/rust/library.go
index acca256..28c9792 100644
--- a/rust/library.go
+++ b/rust/library.go
@@ -340,7 +340,7 @@
 	deps = library.baseCompiler.compilerDeps(ctx, deps)
 
 	if ctx.toolchain().Bionic() && (library.dylib() || library.shared()) {
-		deps = library.baseCompiler.bionicDeps(ctx, deps)
+		deps = bionicDeps(deps)
 		deps.CrtBegin = "crtbegin_so"
 		deps.CrtEnd = "crtend_so"
 	}
diff --git a/rust/rust.go b/rust/rust.go
index 28f8e1a..8ebd39d 100644
--- a/rust/rust.go
+++ b/rust/rust.go
@@ -256,6 +256,11 @@
 	depFlags   []string
 	//ReexportedDeps android.Paths
 
+	// Used by bindgen modules which call clang
+	depClangFlags         []string
+	depIncludePaths       android.Paths
+	depSystemIncludePaths android.Paths
+
 	coverageFiles android.Paths
 
 	CrtBegin android.OptionalPath
@@ -671,7 +676,7 @@
 			mod.compiler.install(ctx, mod.outputFile.Path())
 		}
 	} else if mod.sourceProvider != nil {
-		outputFile := mod.sourceProvider.generateSource(ctx)
+		outputFile := mod.sourceProvider.generateSource(ctx, deps)
 		mod.outputFile = android.OptionalPathForPath(outputFile)
 		mod.subName = ctx.ModuleSubDir()
 	}
@@ -821,6 +826,11 @@
 				depFlag = "-lstatic=" + libName
 				depPaths.linkDirs = append(depPaths.linkDirs, linkPath)
 				depPaths.depFlags = append(depPaths.depFlags, depFlag)
+				depPaths.depIncludePaths = append(depPaths.depIncludePaths, ccDep.IncludeDirs()...)
+				if mod, ok := ccDep.(*cc.Module); ok {
+					depPaths.depSystemIncludePaths = append(depPaths.depSystemIncludePaths, mod.ExportedSystemIncludeDirs()...)
+					depPaths.depClangFlags = append(depPaths.depClangFlags, mod.ExportedFlags()...)
+				}
 				depPaths.coverageFiles = append(depPaths.coverageFiles, ccDep.CoverageFiles()...)
 				directStaticLibDeps = append(directStaticLibDeps, ccDep)
 				mod.Properties.AndroidMkStaticLibs = append(mod.Properties.AndroidMkStaticLibs, depName)
@@ -828,6 +838,11 @@
 				depFlag = "-ldylib=" + libName
 				depPaths.linkDirs = append(depPaths.linkDirs, linkPath)
 				depPaths.depFlags = append(depPaths.depFlags, depFlag)
+				depPaths.depIncludePaths = append(depPaths.depIncludePaths, ccDep.IncludeDirs()...)
+				if mod, ok := ccDep.(*cc.Module); ok {
+					depPaths.depSystemIncludePaths = append(depPaths.depSystemIncludePaths, mod.ExportedSystemIncludeDirs()...)
+					depPaths.depClangFlags = append(depPaths.depClangFlags, mod.ExportedFlags()...)
+				}
 				directSharedLibDeps = append(directSharedLibDeps, ccDep)
 				mod.Properties.AndroidMkSharedLibs = append(mod.Properties.AndroidMkSharedLibs, depName)
 				exportDep = true
@@ -877,6 +892,9 @@
 	// Dedup exported flags from dependencies
 	depPaths.linkDirs = android.FirstUniqueStrings(depPaths.linkDirs)
 	depPaths.depFlags = android.FirstUniqueStrings(depPaths.depFlags)
+	depPaths.depClangFlags = android.FirstUniqueStrings(depPaths.depClangFlags)
+	depPaths.depIncludePaths = android.FirstUniquePaths(depPaths.depIncludePaths)
+	depPaths.depSystemIncludePaths = android.FirstUniquePaths(depPaths.depSystemIncludePaths)
 
 	return depPaths
 }
diff --git a/rust/source_provider.go b/rust/source_provider.go
index e034d2c..da6147a 100644
--- a/rust/source_provider.go
+++ b/rust/source_provider.go
@@ -33,7 +33,7 @@
 var _ SourceProvider = (*baseSourceProvider)(nil)
 
 type SourceProvider interface {
-	generateSource(ctx android.ModuleContext) android.Path
+	generateSource(ctx android.ModuleContext, deps PathDeps) android.Path
 	Srcs() android.Paths
 	sourceProviderProps() []interface{}
 	sourceProviderDeps(ctx DepsContext, deps Deps) Deps
@@ -43,7 +43,7 @@
 	return android.Paths{sp.outputFile}
 }
 
-func (sp *baseSourceProvider) generateSource(ctx android.ModuleContext) android.Path {
+func (sp *baseSourceProvider) generateSource(ctx android.ModuleContext, deps PathDeps) android.Path {
 	panic("baseSourceProviderModule does not implement generateSource()")
 }