Improve handling of generated include dirs
am: 57b9e1da75

Change-Id: I1ae18368680d6d73d1c9094354769d5923777b15
diff --git a/android/paths.go b/android/paths.go
index 1a37a34..85c861d 100644
--- a/android/paths.go
+++ b/android/paths.go
@@ -512,8 +512,12 @@
 }
 
 func FilterPathList(list []Path, filter []Path) (remainder []Path, filtered []Path) {
+	return FilterPathListPredicate(list, func(p Path) bool { return inPathList(p, filter) })
+}
+
+func FilterPathListPredicate(list []Path, predicate func(Path) bool) (remainder []Path, filtered []Path) {
 	for _, l := range list {
-		if inPathList(l, filter) {
+		if predicate(l) {
 			filtered = append(filtered, l)
 		} else {
 			remainder = append(remainder, l)
diff --git a/cc/library.go b/cc/library.go
index 5c8371b..85533a9 100644
--- a/cc/library.go
+++ b/cc/library.go
@@ -1497,14 +1497,20 @@
 	for _, variant := range member.Variants() {
 		ccModule := variant.(*Module)
 
+		// Separate out the generated include dirs (which are arch specific) from the
+		// include dirs (which may not be).
+		exportedIncludeDirs, exportedGeneratedIncludeDirs := android.FilterPathListPredicate(
+			ccModule.ExportedIncludeDirs(), isGeneratedHeaderDirectory)
+
 		info.archVariantProperties = append(info.archVariantProperties, nativeLibInfoProperties{
-			name:                      memberName,
-			archType:                  ccModule.Target().Arch.ArchType.String(),
-			ExportedIncludeDirs:       ccModule.ExportedIncludeDirs(),
-			ExportedSystemIncludeDirs: ccModule.ExportedSystemIncludeDirs(),
-			ExportedFlags:             ccModule.ExportedFlags(),
-			exportedGeneratedHeaders:  ccModule.ExportedGeneratedHeaders(),
-			outputFile:                ccModule.OutputFile().Path(),
+			name:                         memberName,
+			archType:                     ccModule.Target().Arch.ArchType.String(),
+			ExportedIncludeDirs:          exportedIncludeDirs,
+			ExportedGeneratedIncludeDirs: exportedGeneratedIncludeDirs,
+			ExportedSystemIncludeDirs:    ccModule.ExportedSystemIncludeDirs(),
+			ExportedFlags:                ccModule.ExportedFlags(),
+			exportedGeneratedHeaders:     ccModule.ExportedGeneratedHeaders(),
+			outputFile:                   ccModule.OutputFile().Path(),
 		})
 	}
 
@@ -1518,6 +1524,11 @@
 	return info
 }
 
+func isGeneratedHeaderDirectory(p android.Path) bool {
+	_, gen := p.(android.WritablePath)
+	return gen
+}
+
 // Extract common properties from a slice of property structures of the same type.
 //
 // All the property structures must be of the same type.
@@ -1580,16 +1591,11 @@
 func buildSharedNativeLibSnapshot(sdkModuleContext android.ModuleContext, info *nativeLibInfo, builder android.SnapshotBuilder, member android.SdkMember) {
 	// a function for emitting include dirs
 	addExportedDirCopyCommandsForNativeLibs := func(lib nativeLibInfoProperties) {
+		// Do not include ExportedGeneratedIncludeDirs in the list of directories whose
+		// contents are copied as they are copied from exportedGeneratedHeaders below.
 		includeDirs := lib.ExportedIncludeDirs
 		includeDirs = append(includeDirs, lib.ExportedSystemIncludeDirs...)
-		if len(includeDirs) == 0 {
-			return
-		}
 		for _, dir := range includeDirs {
-			if _, gen := dir.(android.WritablePath); gen {
-				// generated headers are copied via exportedGeneratedHeaders. See below.
-				continue
-			}
 			// lib.ArchType is "" for common properties.
 			targetDir := filepath.Join(lib.archType, nativeIncludeDir)
 
@@ -1676,13 +1682,14 @@
 	var result []string
 	var includeDirs []android.Path
 	if !systemInclude {
-		includeDirs = lib.ExportedIncludeDirs
+		// Include the generated include dirs in the exported include dirs.
+		includeDirs = append(lib.ExportedIncludeDirs, lib.ExportedGeneratedIncludeDirs...)
 	} else {
 		includeDirs = lib.ExportedSystemIncludeDirs
 	}
 	for _, dir := range includeDirs {
 		var path string
-		if _, gen := dir.(android.WritablePath); gen {
+		if isGeneratedHeaderDirectory(dir) {
 			path = filepath.Join(nativeGeneratedIncludeDir, lib.name)
 		} else {
 			path = filepath.Join(nativeIncludeDir, dir.String())
@@ -1707,9 +1714,10 @@
 	// This is "" for common properties.
 	archType string
 
-	ExportedIncludeDirs       android.Paths
-	ExportedSystemIncludeDirs android.Paths
-	ExportedFlags             []string
+	ExportedIncludeDirs          android.Paths
+	ExportedGeneratedIncludeDirs android.Paths
+	ExportedSystemIncludeDirs    android.Paths
+	ExportedFlags                []string
 
 	// exportedGeneratedHeaders is not exported as if set it is always arch specific.
 	exportedGeneratedHeaders android.Paths
diff --git a/sdk/cc_sdk_test.go b/sdk/cc_sdk_test.go
index 4a5cf5e..53109ec 100644
--- a/sdk/cc_sdk_test.go
+++ b/sdk/cc_sdk_test.go
@@ -288,20 +288,15 @@
 cc_prebuilt_library_shared {
     name: "mysdk_mynativelib@current",
     sdk_member_name: "mynativelib",
+    export_include_dirs: ["include/include"],
     arch: {
         arm64: {
             srcs: ["arm64/lib/mynativelib.so"],
-            export_include_dirs: [
-                "arm64/include/include",
-                "arm64/include_gen/mynativelib",
-            ],
+            export_include_dirs: ["arm64/include_gen/mynativelib"],
         },
         arm: {
             srcs: ["arm/lib/mynativelib.so"],
-            export_include_dirs: [
-                "arm/include/include",
-                "arm/include_gen/mynativelib",
-            ],
+            export_include_dirs: ["arm/include_gen/mynativelib"],
         },
     },
     stl: "none",
@@ -311,20 +306,15 @@
 cc_prebuilt_library_shared {
     name: "mynativelib",
     prefer: false,
+    export_include_dirs: ["include/include"],
     arch: {
         arm64: {
             srcs: ["arm64/lib/mynativelib.so"],
-            export_include_dirs: [
-                "arm64/include/include",
-                "arm64/include_gen/mynativelib",
-            ],
+            export_include_dirs: ["arm64/include_gen/mynativelib"],
         },
         arm: {
             srcs: ["arm/lib/mynativelib.so"],
-            export_include_dirs: [
-                "arm/include/include",
-                "arm/include_gen/mynativelib",
-            ],
+            export_include_dirs: ["arm/include_gen/mynativelib"],
         },
     },
     stl: "none",
@@ -337,13 +327,12 @@
 }
 `),
 		checkAllCopyRules(`
+include/Test.h -> include/include/Test.h
 .intermediates/mynativelib/android_arm64_armv8-a_core_shared/mynativelib.so -> arm64/lib/mynativelib.so
-include/Test.h -> arm64/include/include/Test.h
 .intermediates/mynativelib/android_arm64_armv8-a_core_shared/gen/aidl/aidl/foo/bar/Test.h -> arm64/include_gen/mynativelib/aidl/foo/bar/Test.h
 .intermediates/mynativelib/android_arm64_armv8-a_core_shared/gen/aidl/aidl/foo/bar/BnTest.h -> arm64/include_gen/mynativelib/aidl/foo/bar/BnTest.h
 .intermediates/mynativelib/android_arm64_armv8-a_core_shared/gen/aidl/aidl/foo/bar/BpTest.h -> arm64/include_gen/mynativelib/aidl/foo/bar/BpTest.h
 .intermediates/mynativelib/android_arm_armv7-a-neon_core_shared/mynativelib.so -> arm/lib/mynativelib.so
-include/Test.h -> arm/include/include/Test.h
 .intermediates/mynativelib/android_arm_armv7-a-neon_core_shared/gen/aidl/aidl/foo/bar/Test.h -> arm/include_gen/mynativelib/aidl/foo/bar/Test.h
 .intermediates/mynativelib/android_arm_armv7-a-neon_core_shared/gen/aidl/aidl/foo/bar/BnTest.h -> arm/include_gen/mynativelib/aidl/foo/bar/BnTest.h
 .intermediates/mynativelib/android_arm_armv7-a-neon_core_shared/gen/aidl/aidl/foo/bar/BpTest.h -> arm/include_gen/mynativelib/aidl/foo/bar/BpTest.h
@@ -389,20 +378,15 @@
     sdk_member_name: "mynativelib",
     device_supported: false,
     host_supported: true,
+    export_include_dirs: ["include/include"],
     arch: {
         x86_64: {
             srcs: ["x86_64/lib/mynativelib.so"],
-            export_include_dirs: [
-                "x86_64/include/include",
-                "x86_64/include_gen/mynativelib",
-            ],
+            export_include_dirs: ["x86_64/include_gen/mynativelib"],
         },
         x86: {
             srcs: ["x86/lib/mynativelib.so"],
-            export_include_dirs: [
-                "x86/include/include",
-                "x86/include_gen/mynativelib",
-            ],
+            export_include_dirs: ["x86/include_gen/mynativelib"],
         },
     },
     stl: "none",
@@ -414,20 +398,15 @@
     prefer: false,
     device_supported: false,
     host_supported: true,
+    export_include_dirs: ["include/include"],
     arch: {
         x86_64: {
             srcs: ["x86_64/lib/mynativelib.so"],
-            export_include_dirs: [
-                "x86_64/include/include",
-                "x86_64/include_gen/mynativelib",
-            ],
+            export_include_dirs: ["x86_64/include_gen/mynativelib"],
         },
         x86: {
             srcs: ["x86/lib/mynativelib.so"],
-            export_include_dirs: [
-                "x86/include/include",
-                "x86/include_gen/mynativelib",
-            ],
+            export_include_dirs: ["x86/include_gen/mynativelib"],
         },
     },
     stl: "none",
@@ -442,13 +421,12 @@
 }
 `),
 		checkAllCopyRules(`
+include/Test.h -> include/include/Test.h
 .intermediates/mynativelib/linux_glibc_x86_64_shared/mynativelib.so -> x86_64/lib/mynativelib.so
-include/Test.h -> x86_64/include/include/Test.h
 .intermediates/mynativelib/linux_glibc_x86_64_shared/gen/aidl/aidl/foo/bar/Test.h -> x86_64/include_gen/mynativelib/aidl/foo/bar/Test.h
 .intermediates/mynativelib/linux_glibc_x86_64_shared/gen/aidl/aidl/foo/bar/BnTest.h -> x86_64/include_gen/mynativelib/aidl/foo/bar/BnTest.h
 .intermediates/mynativelib/linux_glibc_x86_64_shared/gen/aidl/aidl/foo/bar/BpTest.h -> x86_64/include_gen/mynativelib/aidl/foo/bar/BpTest.h
 .intermediates/mynativelib/linux_glibc_x86_shared/mynativelib.so -> x86/lib/mynativelib.so
-include/Test.h -> x86/include/include/Test.h
 .intermediates/mynativelib/linux_glibc_x86_shared/gen/aidl/aidl/foo/bar/Test.h -> x86/include_gen/mynativelib/aidl/foo/bar/Test.h
 .intermediates/mynativelib/linux_glibc_x86_shared/gen/aidl/aidl/foo/bar/BnTest.h -> x86/include_gen/mynativelib/aidl/foo/bar/BnTest.h
 .intermediates/mynativelib/linux_glibc_x86_shared/gen/aidl/aidl/foo/bar/BpTest.h -> x86/include_gen/mynativelib/aidl/foo/bar/BpTest.h
@@ -485,20 +463,15 @@
 cc_prebuilt_library_static {
     name: "mysdk_mynativelib@current",
     sdk_member_name: "mynativelib",
+    export_include_dirs: ["include/include"],
     arch: {
         arm64: {
             srcs: ["arm64/lib/mynativelib.a"],
-            export_include_dirs: [
-                "arm64/include/include",
-                "arm64/include_gen/mynativelib",
-            ],
+            export_include_dirs: ["arm64/include_gen/mynativelib"],
         },
         arm: {
             srcs: ["arm/lib/mynativelib.a"],
-            export_include_dirs: [
-                "arm/include/include",
-                "arm/include_gen/mynativelib",
-            ],
+            export_include_dirs: ["arm/include_gen/mynativelib"],
         },
     },
     stl: "none",
@@ -508,20 +481,15 @@
 cc_prebuilt_library_static {
     name: "mynativelib",
     prefer: false,
+    export_include_dirs: ["include/include"],
     arch: {
         arm64: {
             srcs: ["arm64/lib/mynativelib.a"],
-            export_include_dirs: [
-                "arm64/include/include",
-                "arm64/include_gen/mynativelib",
-            ],
+            export_include_dirs: ["arm64/include_gen/mynativelib"],
         },
         arm: {
             srcs: ["arm/lib/mynativelib.a"],
-            export_include_dirs: [
-                "arm/include/include",
-                "arm/include_gen/mynativelib",
-            ],
+            export_include_dirs: ["arm/include_gen/mynativelib"],
         },
     },
     stl: "none",
@@ -534,13 +502,12 @@
 }
 `),
 		checkAllCopyRules(`
+include/Test.h -> include/include/Test.h
 .intermediates/mynativelib/android_arm64_armv8-a_core_static/mynativelib.a -> arm64/lib/mynativelib.a
-include/Test.h -> arm64/include/include/Test.h
 .intermediates/mynativelib/android_arm64_armv8-a_core_static/gen/aidl/aidl/foo/bar/Test.h -> arm64/include_gen/mynativelib/aidl/foo/bar/Test.h
 .intermediates/mynativelib/android_arm64_armv8-a_core_static/gen/aidl/aidl/foo/bar/BnTest.h -> arm64/include_gen/mynativelib/aidl/foo/bar/BnTest.h
 .intermediates/mynativelib/android_arm64_armv8-a_core_static/gen/aidl/aidl/foo/bar/BpTest.h -> arm64/include_gen/mynativelib/aidl/foo/bar/BpTest.h
 .intermediates/mynativelib/android_arm_armv7-a-neon_core_static/mynativelib.a -> arm/lib/mynativelib.a
-include/Test.h -> arm/include/include/Test.h
 .intermediates/mynativelib/android_arm_armv7-a-neon_core_static/gen/aidl/aidl/foo/bar/Test.h -> arm/include_gen/mynativelib/aidl/foo/bar/Test.h
 .intermediates/mynativelib/android_arm_armv7-a-neon_core_static/gen/aidl/aidl/foo/bar/BnTest.h -> arm/include_gen/mynativelib/aidl/foo/bar/BnTest.h
 .intermediates/mynativelib/android_arm_armv7-a-neon_core_static/gen/aidl/aidl/foo/bar/BpTest.h -> arm/include_gen/mynativelib/aidl/foo/bar/BpTest.h
@@ -586,20 +553,15 @@
     sdk_member_name: "mynativelib",
     device_supported: false,
     host_supported: true,
+    export_include_dirs: ["include/include"],
     arch: {
         x86_64: {
             srcs: ["x86_64/lib/mynativelib.a"],
-            export_include_dirs: [
-                "x86_64/include/include",
-                "x86_64/include_gen/mynativelib",
-            ],
+            export_include_dirs: ["x86_64/include_gen/mynativelib"],
         },
         x86: {
             srcs: ["x86/lib/mynativelib.a"],
-            export_include_dirs: [
-                "x86/include/include",
-                "x86/include_gen/mynativelib",
-            ],
+            export_include_dirs: ["x86/include_gen/mynativelib"],
         },
     },
     stl: "none",
@@ -611,20 +573,15 @@
     prefer: false,
     device_supported: false,
     host_supported: true,
+    export_include_dirs: ["include/include"],
     arch: {
         x86_64: {
             srcs: ["x86_64/lib/mynativelib.a"],
-            export_include_dirs: [
-                "x86_64/include/include",
-                "x86_64/include_gen/mynativelib",
-            ],
+            export_include_dirs: ["x86_64/include_gen/mynativelib"],
         },
         x86: {
             srcs: ["x86/lib/mynativelib.a"],
-            export_include_dirs: [
-                "x86/include/include",
-                "x86/include_gen/mynativelib",
-            ],
+            export_include_dirs: ["x86/include_gen/mynativelib"],
         },
     },
     stl: "none",
@@ -639,13 +596,12 @@
 }
 `),
 		checkAllCopyRules(`
+include/Test.h -> include/include/Test.h
 .intermediates/mynativelib/linux_glibc_x86_64_static/mynativelib.a -> x86_64/lib/mynativelib.a
-include/Test.h -> x86_64/include/include/Test.h
 .intermediates/mynativelib/linux_glibc_x86_64_static/gen/aidl/aidl/foo/bar/Test.h -> x86_64/include_gen/mynativelib/aidl/foo/bar/Test.h
 .intermediates/mynativelib/linux_glibc_x86_64_static/gen/aidl/aidl/foo/bar/BnTest.h -> x86_64/include_gen/mynativelib/aidl/foo/bar/BnTest.h
 .intermediates/mynativelib/linux_glibc_x86_64_static/gen/aidl/aidl/foo/bar/BpTest.h -> x86_64/include_gen/mynativelib/aidl/foo/bar/BpTest.h
 .intermediates/mynativelib/linux_glibc_x86_static/mynativelib.a -> x86/lib/mynativelib.a
-include/Test.h -> x86/include/include/Test.h
 .intermediates/mynativelib/linux_glibc_x86_static/gen/aidl/aidl/foo/bar/Test.h -> x86/include_gen/mynativelib/aidl/foo/bar/Test.h
 .intermediates/mynativelib/linux_glibc_x86_static/gen/aidl/aidl/foo/bar/BnTest.h -> x86/include_gen/mynativelib/aidl/foo/bar/BnTest.h
 .intermediates/mynativelib/linux_glibc_x86_static/gen/aidl/aidl/foo/bar/BpTest.h -> x86/include_gen/mynativelib/aidl/foo/bar/BpTest.h