Quote glob exclude options

Put quotes around the glob exclude options to avoid accidentally
expanding globs during execution.

Change-Id: Ia6fc7fa7dbe1d75e97d6039642e1c89be027689a
diff --git a/common/glob.go b/common/glob.go
index 7bb623d..f4e083a 100644
--- a/common/glob.go
+++ b/common/glob.go
@@ -17,7 +17,6 @@
 import (
 	"fmt"
 	"path/filepath"
-	"strings"
 
 	"github.com/google/blueprint"
 	"github.com/google/blueprint/bootstrap"
@@ -113,10 +112,6 @@
 
 func GlobRule(ctx AndroidModuleContext, globPattern string, excludes []string,
 	fileListFile, depFile string) {
-	var excludeArgs []string
-	for _, e := range excludes {
-		excludeArgs = append(excludeArgs, "-e "+e)
-	}
 
 	// Create a rule to rebuild fileListFile if a directory in depFile changes.  fileListFile
 	// will only be rewritten if it has changed, preventing unnecesary build.ninja regenerations.
@@ -126,7 +121,7 @@
 		Implicits: []string{globCmd},
 		Args: map[string]string{
 			"glob":     globPattern,
-			"excludes": strings.Join(excludeArgs, " "),
+			"excludes": JoinWithPrefixAndQuote(excludes, "-e "),
 		},
 	})
 
diff --git a/common/util.go b/common/util.go
index 190e092..599b3b1 100644
--- a/common/util.go
+++ b/common/util.go
@@ -38,3 +38,30 @@
 	}
 	return string(ret)
 }
+
+func JoinWithPrefixAndQuote(strs []string, prefix string) string {
+	if len(strs) == 0 {
+		return ""
+	}
+
+	if len(strs) == 1 {
+		return prefix + `"` + strs[0] + `"`
+	}
+
+	n := len(" ") * (len(strs) - 1)
+	for _, s := range strs {
+		n += len(prefix) + len(s) + len(`""`)
+	}
+
+	ret := make([]byte, 0, n)
+	for i, s := range strs {
+		if i != 0 {
+			ret = append(ret, ' ')
+		}
+		ret = append(ret, prefix...)
+		ret = append(ret, '"')
+		ret = append(ret, s...)
+		ret = append(ret, '"')
+	}
+	return string(ret)
+}