diff --git a/common/glob.go b/common/glob.go
index 669d185..d63f87a 100644
--- a/common/glob.go
+++ b/common/glob.go
@@ -66,41 +66,20 @@
 	return false
 }
 
-func expandGlobs(ctx AndroidModuleContext, in []string) []string {
-	if !hasGlob(in) {
-		return in
-	}
-
-	var excludes []string
-	for _, s := range in {
-		if s[0] == '-' {
-			excludes = append(excludes, s[1:])
-		}
-	}
-
-	out := make([]string, 0, len(in))
-	for _, s := range in {
-		if s[0] == '-' {
-			continue
-		} else if glob.IsGlob(s) {
-			out = append(out, Glob(ctx, s, excludes)...)
-		} else {
-			out = append(out, s)
-		}
-	}
-
-	return out
+// The subset of ModuleContext and SingletonContext needed by Glob
+type globContext interface {
+	Build(pctx *blueprint.PackageContext, params blueprint.BuildParams)
+	AddNinjaFileDeps(deps ...string)
 }
 
-func Glob(ctx AndroidModuleContext, globPattern string, excludes []string) []string {
-	fileListFile := filepath.Join(ModuleOutDir(ctx), "glob", globToString(globPattern))
+func Glob(ctx globContext, outDir string, globPattern string, excludes []string) ([]string, error) {
+	fileListFile := filepath.Join(outDir, "glob", globToString(globPattern))
 	depFile := fileListFile + ".d"
 
 	// Get a globbed file list, and write out fileListFile and depFile
 	files, err := glob.GlobWithDepFile(globPattern, fileListFile, depFile, excludes)
 	if err != nil {
-		ctx.ModuleErrorf("glob: %s", err.Error())
-		return []string{globPattern}
+		return nil, err
 	}
 
 	GlobRule(ctx, globPattern, excludes, fileListFile, depFile)
@@ -108,10 +87,10 @@
 	// Make build.ninja depend on the fileListFile
 	ctx.AddNinjaFileDeps(fileListFile)
 
-	return files
+	return files, nil
 }
 
-func GlobRule(ctx AndroidModuleContext, globPattern string, excludes []string,
+func GlobRule(ctx globContext, globPattern string, excludes []string,
 	fileListFile, depFile string) {
 
 	// Create a rule to rebuild fileListFile if a directory in depFile changes.  fileListFile
diff --git a/common/module.go b/common/module.go
index 327aeca..33c586c 100644
--- a/common/module.go
+++ b/common/module.go
@@ -18,6 +18,8 @@
 	"path/filepath"
 	"runtime"
 
+	"android/soong/glob"
+
 	"github.com/google/blueprint"
 )
 
@@ -49,6 +51,9 @@
 	blueprint.ModuleContext
 	androidBaseContext
 
+	ExpandSources(srcFiles []string) []string
+	Glob(globPattern string, excludes []string) []string
+
 	InstallFile(installPath, srcPath string, deps ...string) string
 	InstallFileName(installPath, name, srcPath string, deps ...string) string
 	CheckbuildFile(srcPath string)
@@ -465,7 +470,7 @@
 	return ok
 }
 
-func ExpandSources(ctx AndroidModuleContext, srcFiles []string) []string {
+func (ctx *androidModuleContext) ExpandSources(srcFiles []string) []string {
 	prefix := ModuleSrcDir(ctx)
 	for i, srcFile := range srcFiles {
 		if srcFile[0] == '-' {
@@ -475,8 +480,37 @@
 		}
 	}
 
-	srcFiles = expandGlobs(ctx, srcFiles)
-	return srcFiles
+	if !hasGlob(srcFiles) {
+		return srcFiles
+	}
+
+	var excludes []string
+	for _, s := range srcFiles {
+		if s[0] == '-' {
+			excludes = append(excludes, s[1:])
+		}
+	}
+
+	globbedSrcFiles := make([]string, 0, len(srcFiles))
+	for _, s := range srcFiles {
+		if s[0] == '-' {
+			continue
+		} else if glob.IsGlob(s) {
+			globbedSrcFiles = append(globbedSrcFiles, ctx.Glob(s, excludes)...)
+		} else {
+			globbedSrcFiles = append(globbedSrcFiles, s)
+		}
+	}
+
+	return globbedSrcFiles
+}
+
+func (ctx *androidModuleContext) Glob(globPattern string, excludes []string) []string {
+	ret, err := Glob(ctx, ModuleOutDir(ctx), globPattern, excludes)
+	if err != nil {
+		ctx.ModuleErrorf("glob: %s", err.Error())
+	}
+	return ret
 }
 
 func BuildTargetSingleton() blueprint.Singleton {
