diff --git a/android/paths.go b/android/paths.go index b5b473041..9c8e93a4b 100644 --- a/android/paths.go +++ b/android/paths.go @@ -283,6 +283,23 @@ func (p Paths) Strings() []string { return ret } +// FirstUniqueElements returns all unique elements of a slice, keeping the first copy of each +// modifies the slice contents in place, and returns a subslice of the original slice +func FirstUniquePaths(list Paths) Paths { + k := 0 +outer: + for i := 0; i < len(list); i++ { + for j := 0; j < k; j++ { + if list[i] == list[j] { + continue outer + } + } + list[k] = list[i] + k++ + } + return list[:k] +} + // WritablePaths is a slice of WritablePaths, used for multiple outputs. type WritablePaths []WritablePath diff --git a/cc/cc.go b/cc/cc.go index 4dafc6388..b3ba79819 100644 --- a/cc/cc.go +++ b/cc/cc.go @@ -1138,6 +1138,13 @@ func (c *Module) depsToPaths(ctx android.ModuleContext) PathDeps { // Dedup exported flags from dependencies depPaths.Flags = firstUniqueElements(depPaths.Flags) + depPaths.GeneratedHeaders = android.FirstUniquePaths(depPaths.GeneratedHeaders) + depPaths.ReexportedFlags = firstUniqueElements(depPaths.ReexportedFlags) + depPaths.ReexportedFlagsDeps = android.FirstUniquePaths(depPaths.ReexportedFlagsDeps) + + if c.sabi != nil { + c.sabi.Properties.ReexportedIncludeFlags = firstUniqueElements(c.sabi.Properties.ReexportedIncludeFlags) + } return depPaths }