diff options
author | Ondřej Surý <ondrej@sury.org> | 2011-04-26 09:55:32 +0200 |
---|---|---|
committer | Ondřej Surý <ondrej@sury.org> | 2011-04-26 09:55:32 +0200 |
commit | 7b15ed9ef455b6b66c6b376898a88aef5d6a9970 (patch) | |
tree | 3ef530baa80cdf29436ba981f5783be6b4d2202b /src/cmd/goinstall/parse.go | |
parent | 50104cc32a498f7517a51c8dc93106c51c7a54b4 (diff) | |
download | golang-7b15ed9ef455b6b66c6b376898a88aef5d6a9970.tar.gz |
Imported Upstream version 2011.04.13upstream/2011.04.13
Diffstat (limited to 'src/cmd/goinstall/parse.go')
-rw-r--r-- | src/cmd/goinstall/parse.go | 69 |
1 files changed, 64 insertions, 5 deletions
diff --git a/src/cmd/goinstall/parse.go b/src/cmd/goinstall/parse.go index 014b8fcb2..0e617903c 100644 --- a/src/cmd/goinstall/parse.go +++ b/src/cmd/goinstall/parse.go @@ -14,6 +14,7 @@ import ( "path/filepath" "strconv" "strings" + "runtime" ) @@ -21,6 +22,7 @@ type dirInfo struct { goFiles []string // .go files within dir (including cgoFiles) cgoFiles []string // .go files that import "C" cFiles []string // .c files within dir + sFiles []string // .s files within dir imports []string // All packages imported by goFiles pkgName string // Name of package within dir } @@ -37,7 +39,7 @@ type dirInfo struct { // The imports map keys are package paths imported by listed Go files, // and the values are the Go files importing the respective package paths. func scanDir(dir string, allowMain bool) (info *dirInfo, err os.Error) { - f, err := os.Open(dir, os.O_RDONLY, 0) + f, err := os.Open(dir) if err != nil { return nil, err } @@ -50,6 +52,7 @@ func scanDir(dir string, allowMain bool) (info *dirInfo, err os.Error) { goFiles := make([]string, 0, len(dirs)) cgoFiles := make([]string, 0, len(dirs)) cFiles := make([]string, 0, len(dirs)) + sFiles := make([]string, 0, len(dirs)) importsm := make(map[string]bool) pkgName := "" for i := range dirs { @@ -57,13 +60,25 @@ func scanDir(dir string, allowMain bool) (info *dirInfo, err os.Error) { if strings.HasPrefix(d.Name, "_") || strings.Index(d.Name, ".cgo") != -1 { continue } - if strings.HasSuffix(d.Name, ".c") { - cFiles = append(cFiles, d.Name) + if !goodOSArch(d.Name) { continue } - if !strings.HasSuffix(d.Name, ".go") || strings.HasSuffix(d.Name, "_test.go") { + + switch filepath.Ext(d.Name) { + case ".go": + if strings.HasSuffix(d.Name, "_test.go") { + continue + } + case ".c": + cFiles = append(cFiles, d.Name) + continue + case ".s": + sFiles = append(sFiles, d.Name) + continue + default: continue } + filename := filepath.Join(dir, d.Name) pf, err := parser.ParseFile(fset, filename, nil, parser.ImportsOnly) if err != nil { @@ -106,5 +121,49 @@ func scanDir(dir string, allowMain bool) (info *dirInfo, err os.Error) { imports[i] = p i++ } - return &dirInfo{goFiles, cgoFiles, cFiles, imports, pkgName}, nil + return &dirInfo{goFiles, cgoFiles, cFiles, sFiles, imports, pkgName}, nil +} + +// goodOSArch returns false if the filename contains a $GOOS or $GOARCH +// suffix which does not match the current system. +// The recognized filename formats are: +// +// name_$(GOOS).* +// name_$(GOARCH).* +// name_$(GOOS)_$(GOARCH).* +// +func goodOSArch(filename string) bool { + if dot := strings.Index(filename, "."); dot != -1 { + filename = filename[:dot] + } + l := strings.Split(filename, "_", -1) + n := len(l) + if n == 0 { + return true + } + if good, known := goodOS[l[n-1]]; known { + return good + } + if good, known := goodArch[l[n-1]]; known { + if !good || n < 2 { + return false + } + good, known = goodOS[l[n-2]] + return good || !known + } + return true +} + +var goodOS = make(map[string]bool) +var goodArch = make(map[string]bool) + +func init() { + goodOS = make(map[string]bool) + goodArch = make(map[string]bool) + for _, v := range strings.Fields(goosList) { + goodOS[v] = v == runtime.GOOS + } + for _, v := range strings.Fields(goarchList) { + goodArch[v] = v == runtime.GOARCH + } } |