Add support for per-target exported includes.

Test: Added unit test
Change-Id: I8ab58ddc73c15d5ec0f515e43407542bd4e8081a
diff --git a/cc/bp2build.go b/cc/bp2build.go
index 79304a5..efa2752 100644
--- a/cc/bp2build.go
+++ b/cc/bp2build.go
@@ -262,6 +262,7 @@
 			archIncludeDirs = append(archIncludeDirs, flagExporterProperties.Export_include_dirs...)
 
 			// To avoid duplicate includes when base includes + arch includes are combined
+			// FIXME: This doesn't take conflicts between arch and os includes into account
 			archIncludeDirs = bazel.SubtractStrings(archIncludeDirs, includeDirs)
 
 			if len(archIncludeDirs) > 0 {
@@ -275,6 +276,7 @@
 			archHeaders = bazel.UniqueBazelLabelList(archHeaders)
 
 			// To avoid duplicate headers when base headers + arch headers are combined
+			// FIXME: This doesn't take conflicts between arch and os includes into account
 			archHeaders = bazel.SubtractBazelLabelList(archHeaders, headers)
 
 			if len(archHeaders.Includes) > 0 || len(archHeaders.Excludes) > 0 {
@@ -283,5 +285,34 @@
 		}
 	}
 
+	for os, props := range module.GetTargetProperties(&FlagExporterProperties{}) {
+		if flagExporterProperties, ok := props.(*FlagExporterProperties); ok {
+			osIncludeDirs := flagExporterProperties.Export_system_include_dirs
+			osIncludeDirs = append(osIncludeDirs, flagExporterProperties.Export_include_dirs...)
+
+			// To avoid duplicate includes when base includes + os includes are combined
+			// FIXME: This doesn't take conflicts between arch and os includes into account
+			osIncludeDirs = bazel.SubtractStrings(osIncludeDirs, includeDirs)
+
+			if len(osIncludeDirs) > 0 {
+				includeDirsAttribute.SetValueForOS(os.Name, osIncludeDirs)
+			}
+
+			var osHeaders bazel.LabelList
+			for _, osIncludeDir := range osIncludeDirs {
+				osHeaders.Append(bp2BuildListHeadersInDir(ctx, osIncludeDir))
+			}
+			osHeaders = bazel.UniqueBazelLabelList(osHeaders)
+
+			// To avoid duplicate headers when base headers + os headers are combined
+			// FIXME: This doesn't take conflicts between arch and os includes into account
+			osHeaders = bazel.SubtractBazelLabelList(osHeaders, headers)
+
+			if len(osHeaders.Includes) > 0 || len(osHeaders.Excludes) > 0 {
+				headersAttribute.SetValueForOS(os.Name, osHeaders)
+			}
+		}
+	}
+
 	return includeDirsAttribute, headersAttribute
 }