aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrad Fitzpatrick <bradfitz@golang.org>2012-02-07 18:13:11 -0800
committerBrad Fitzpatrick <bradfitz@golang.org>2012-02-07 18:13:11 -0800
commitf23a6dba5e7a477b15bb10c5f630df01b5f0ea88 (patch)
tree9b4e1e7d5aa2928891cca3e04e6673ce510c016d
parentbb7b1a11d57066078fe841d1b324770faaf1ad45 (diff)
downloadgo-f23a6dba5e7a477b15bb10c5f630df01b5f0ea88.tar.gz
go-f23a6dba5e7a477b15bb10c5f630df01b5f0ea88.zip
cmd/api: compare multiple contexts
R=golang-dev, rsc CC=golang-dev https://golang.org/cl/5626045
-rw-r--r--src/cmd/api/goapi.go85
1 files changed, 71 insertions, 14 deletions
diff --git a/src/cmd/api/goapi.go b/src/cmd/api/goapi.go
index c8fc9cfae7..ef1b8c5d93 100644
--- a/src/cmd/api/goapi.go
+++ b/src/cmd/api/goapi.go
@@ -34,6 +34,27 @@ var (
verbose = flag.Bool("v", false, "Verbose debugging")
)
+var contexts = []*build.Context{
+ {GOOS: "linux", GOARCH: "386", CgoEnabled: true},
+ {GOOS: "linux", GOARCH: "386"},
+ {GOOS: "linux", GOARCH: "amd64", CgoEnabled: true},
+ {GOOS: "linux", GOARCH: "amd64"},
+ {GOOS: "darwin", GOARCH: "386", CgoEnabled: true},
+ {GOOS: "darwin", GOARCH: "386"},
+ {GOOS: "darwin", GOARCH: "amd64", CgoEnabled: true},
+ {GOOS: "darwin", GOARCH: "amd64"},
+ {GOOS: "windows", GOARCH: "amd64"},
+ {GOOS: "windows", GOARCH: "386"},
+}
+
+func contextName(c *build.Context) string {
+ s := c.GOOS + "-" + c.GOARCH
+ if c.CgoEnabled {
+ return s + "-cgo"
+ }
+ return s
+}
+
func main() {
flag.Parse()
@@ -48,28 +69,54 @@ func main() {
pkgs = strings.Fields(string(stds))
}
- w := NewWalker()
tree, _, err := build.FindTree("os") // some known package
if err != nil {
log.Fatalf("failed to find tree: %v", err)
}
- w.tree = tree
- for _, pkg := range pkgs {
- w.wantedPkg[pkg] = true
+ var featureCtx = make(map[string]map[string]bool) // feature -> context name -> true
+ for _, context := range contexts {
+ w := NewWalker()
+ w.context = context
+ w.tree = tree
+
+ for _, pkg := range pkgs {
+ w.wantedPkg[pkg] = true
+ }
+
+ for _, pkg := range pkgs {
+ if strings.HasPrefix(pkg, "cmd/") ||
+ strings.HasPrefix(pkg, "exp/") ||
+ strings.HasPrefix(pkg, "old/") {
+ continue
+ }
+ if !tree.HasSrc(pkg) {
+ log.Fatalf("no source in tree for package %q", pkg)
+ }
+ w.WalkPackage(pkg)
+ }
+ ctxName := contextName(context)
+ for _, f := range w.Features() {
+ if featureCtx[f] == nil {
+ featureCtx[f] = make(map[string]bool)
+ }
+ featureCtx[f][ctxName] = true
+ }
}
- for _, pkg := range pkgs {
- if strings.HasPrefix(pkg, "cmd/") ||
- strings.HasPrefix(pkg, "exp/") ||
- strings.HasPrefix(pkg, "old/") {
+ var features []string
+ for f, cmap := range featureCtx {
+ if len(cmap) == len(contexts) {
+ features = append(features, f)
continue
}
- if !tree.HasSrc(pkg) {
- log.Fatalf("no source in tree for package %q", pkg)
+ comma := strings.Index(f, ",")
+ for cname := range cmap {
+ f2 := fmt.Sprintf("%s (%s)%s", f[:comma], cname, f[comma:])
+ features = append(features, f2)
}
- w.WalkPackage(pkg)
}
+ sort.Strings(features)
bw := bufio.NewWriter(os.Stdout)
defer bw.Flush()
@@ -81,7 +128,7 @@ func main() {
}
v1 := strings.Split(string(bs), "\n")
sort.Strings(v1)
- v2 := w.Features()
+ v2 := features
take := func(sl *[]string) string {
s := (*sl)[0]
*sl = (*sl)[1:]
@@ -99,7 +146,7 @@ func main() {
}
}
} else {
- for _, f := range w.Features() {
+ for _, f := range features {
fmt.Fprintf(bw, "%s\n", f)
}
}
@@ -112,6 +159,7 @@ type pkgSymbol struct {
}
type Walker struct {
+ context *build.Context
tree *build.Tree
fset *token.FileSet
scope []string
@@ -221,8 +269,17 @@ func (w *Walker) WalkPackage(name string) {
}()
dir := filepath.Join(w.tree.SrcDir(), filepath.FromSlash(name))
- info, err := build.ScanDir(dir)
+ var info *build.DirInfo
+ var err error
+ if ctx := w.context; ctx != nil {
+ info, err = ctx.ScanDir(dir)
+ } else {
+ info, err = build.ScanDir(dir)
+ }
if err != nil {
+ if strings.Contains(err.Error(), "no Go source files") {
+ return
+ }
log.Fatalf("pkg %q, dir %q: ScanDir: %v", name, dir, err)
}