cmd/go: first piece of tool rearrangement
1) create go-tool dir in make.bash
2) clean up stale binaries in make.bash
3) add 'tool' command to go
4) convert goyacc->yacc as a first test tool
Since goyacc stands alone, it's a safe trial.

R=rsc
CC=golang-dev
https://golang.org/cl/5576061
diff --git a/src/Make.tool b/src/Make.tool
new file mode 100644
index 0000000..fdbb4dd
--- /dev/null
+++ b/src/Make.tool
@@ -0,0 +1,49 @@
+# Copyright 2009 The Go Authors.  All rights reserved.
+# Use of this source code is governed by a BSD-style
+# license that can be found in the LICENSE file.
+
+ifeq ($(GOOS),windows)
+TARG:=$(TARG).exe
+endif
+
+# Tools always go into $GOROOT/bin/go-tool
+TOOLDIR=$(QUOTED_GOROOT)/bin/go-tool
+
+all: $(TARG)
+
+include $(QUOTED_GOROOT)/src/Make.common
+
+PREREQ+=$(patsubst %,%.make,$(DEPS))
+
+$(TARG): _go_.$O
+	$(LD) $(LDIMPORTS) -o $@ _go_.$O
+
+_go_.$O: $(GOFILES) $(PREREQ)
+	$(GC) $(GCFLAGS) $(GCIMPORTS) -o $@ $(GOFILES)
+
+install: $(TOOLDIR)/$(TARG)
+
+$(TOOLDIR)/$(TARG): $(TARG)
+	mkdir -p $(TOOLDIR) && cp -f $(TARG) $(TOOLDIR)
+
+CLEANFILES+=$(TARG) _test _testmain.go test.out build.out
+
+nuke: clean
+	rm -f $(TOOLDIR)/$(TARG)
+
+# for gotest
+testpackage: _test/main.a
+
+testpackage-clean:
+	rm -f _test/main.a _gotest_.$O
+
+_test/main.a: _gotest_.$O
+	@mkdir -p _test
+	rm -f $@
+	gopack grc $@ _gotest_.$O
+
+_gotest_.$O: $(GOFILES) $(GOTESTFILES)
+	$(GC) $(GCFLAGS) $(GCIMPORTS) -o $@ $(GOFILES) $(GOTESTFILES)
+
+importpath:
+	echo main
diff --git a/src/buildscript/darwin_386.sh b/src/buildscript/darwin_386.sh
index 73897ba4..38feafd 100755
--- a/src/buildscript/darwin_386.sh
+++ b/src/buildscript/darwin_386.sh
@@ -491,7 +491,7 @@
 
 mkdir -p "$WORK"/cmd/go/_obj/
 cd "$GOROOT"/src/cmd/go
-8g -o "$WORK"/cmd/go/_obj/_go_.8 -p cmd/go -I "$WORK" ./bootstrap.go ./build.go ./fix.go ./fmt.go ./get.go ./help.go ./list.go ./main.go ./pkg.go ./run.go ./test.go ./testflag.go ./vcs.go ./version.go ./vet.go
+8g -o "$WORK"/cmd/go/_obj/_go_.8 -p cmd/go -I "$WORK" ./bootstrap.go ./build.go ./fix.go ./fmt.go ./get.go ./help.go ./list.go ./main.go ./pkg.go ./run.go ./test.go ./testflag.go ./tool.go ./vcs.go ./version.go ./vet.go
 gopack grc "$WORK"/cmd/go.a "$WORK"/cmd/go/_obj/_go_.8
 8l -o "$WORK"/cmd/go/_obj/a.out -L "$WORK" "$WORK"/cmd/go.a
 mkdir -p "$GOBIN"/
diff --git a/src/buildscript/darwin_amd64.sh b/src/buildscript/darwin_amd64.sh
index b0cab57..200279d 100755
--- a/src/buildscript/darwin_amd64.sh
+++ b/src/buildscript/darwin_amd64.sh
@@ -490,7 +490,7 @@
 
 mkdir -p "$WORK"/cmd/go/_obj/
 cd "$GOROOT"/src/cmd/go
-6g -o "$WORK"/cmd/go/_obj/_go_.6 -p cmd/go -I "$WORK" ./bootstrap.go ./build.go ./fix.go ./fmt.go ./get.go ./help.go ./list.go ./main.go ./pkg.go ./run.go ./test.go ./testflag.go ./vcs.go ./version.go ./vet.go
+6g -o "$WORK"/cmd/go/_obj/_go_.6 -p cmd/go -I "$WORK" ./bootstrap.go ./build.go ./fix.go ./fmt.go ./get.go ./help.go ./list.go ./main.go ./pkg.go ./run.go ./test.go ./testflag.go ./tool.go ./vcs.go ./version.go ./vet.go
 gopack grc "$WORK"/cmd/go.a "$WORK"/cmd/go/_obj/_go_.6
 6l -o "$WORK"/cmd/go/_obj/a.out -L "$WORK" "$WORK"/cmd/go.a
 mkdir -p "$GOBIN"/
diff --git a/src/buildscript/freebsd_386.sh b/src/buildscript/freebsd_386.sh
index 0c24e12..85e2af8 100755
--- a/src/buildscript/freebsd_386.sh
+++ b/src/buildscript/freebsd_386.sh
@@ -491,7 +491,7 @@
 
 mkdir -p "$WORK"/cmd/go/_obj/
 cd "$GOROOT"/src/cmd/go
-8g -o "$WORK"/cmd/go/_obj/_go_.8 -p cmd/go -I "$WORK" ./bootstrap.go ./build.go ./fix.go ./fmt.go ./get.go ./help.go ./list.go ./main.go ./pkg.go ./run.go ./test.go ./testflag.go ./vcs.go ./version.go ./vet.go
+8g -o "$WORK"/cmd/go/_obj/_go_.8 -p cmd/go -I "$WORK" ./bootstrap.go ./build.go ./fix.go ./fmt.go ./get.go ./help.go ./list.go ./main.go ./pkg.go ./run.go ./test.go ./testflag.go ./tool.go ./vcs.go ./version.go ./vet.go
 gopack grc "$WORK"/cmd/go.a "$WORK"/cmd/go/_obj/_go_.8
 8l -o "$WORK"/cmd/go/_obj/a.out -L "$WORK" "$WORK"/cmd/go.a
 mkdir -p "$GOBIN"/
diff --git a/src/buildscript/freebsd_amd64.sh b/src/buildscript/freebsd_amd64.sh
index 0a645cc..50c44b8 100755
--- a/src/buildscript/freebsd_amd64.sh
+++ b/src/buildscript/freebsd_amd64.sh
@@ -490,7 +490,7 @@
 
 mkdir -p "$WORK"/cmd/go/_obj/
 cd "$GOROOT"/src/cmd/go
-6g -o "$WORK"/cmd/go/_obj/_go_.6 -p cmd/go -I "$WORK" ./bootstrap.go ./build.go ./fix.go ./fmt.go ./get.go ./help.go ./list.go ./main.go ./pkg.go ./run.go ./test.go ./testflag.go ./vcs.go ./version.go ./vet.go
+6g -o "$WORK"/cmd/go/_obj/_go_.6 -p cmd/go -I "$WORK" ./bootstrap.go ./build.go ./fix.go ./fmt.go ./get.go ./help.go ./list.go ./main.go ./pkg.go ./run.go ./test.go ./testflag.go ./tool.go ./vcs.go ./version.go ./vet.go
 gopack grc "$WORK"/cmd/go.a "$WORK"/cmd/go/_obj/_go_.6
 6l -o "$WORK"/cmd/go/_obj/a.out -L "$WORK" "$WORK"/cmd/go.a
 mkdir -p "$GOBIN"/
diff --git a/src/buildscript/linux_386.sh b/src/buildscript/linux_386.sh
index 246f17b..7cdc5eb 100755
--- a/src/buildscript/linux_386.sh
+++ b/src/buildscript/linux_386.sh
@@ -491,7 +491,7 @@
 
 mkdir -p "$WORK"/cmd/go/_obj/
 cd "$GOROOT"/src/cmd/go
-8g -o "$WORK"/cmd/go/_obj/_go_.8 -p cmd/go -I "$WORK" ./bootstrap.go ./build.go ./fix.go ./fmt.go ./get.go ./help.go ./list.go ./main.go ./pkg.go ./run.go ./test.go ./testflag.go ./vcs.go ./version.go ./vet.go
+8g -o "$WORK"/cmd/go/_obj/_go_.8 -p cmd/go -I "$WORK" ./bootstrap.go ./build.go ./fix.go ./fmt.go ./get.go ./help.go ./list.go ./main.go ./pkg.go ./run.go ./test.go ./testflag.go ./tool.go ./vcs.go ./version.go ./vet.go
 gopack grc "$WORK"/cmd/go.a "$WORK"/cmd/go/_obj/_go_.8
 8l -o "$WORK"/cmd/go/_obj/a.out -L "$WORK" "$WORK"/cmd/go.a
 mkdir -p "$GOBIN"/
diff --git a/src/buildscript/linux_amd64.sh b/src/buildscript/linux_amd64.sh
index 1c1ff21..9b05918 100755
--- a/src/buildscript/linux_amd64.sh
+++ b/src/buildscript/linux_amd64.sh
@@ -490,7 +490,7 @@
 
 mkdir -p "$WORK"/cmd/go/_obj/
 cd "$GOROOT"/src/cmd/go
-6g -o "$WORK"/cmd/go/_obj/_go_.6 -p cmd/go -I "$WORK" ./bootstrap.go ./build.go ./fix.go ./fmt.go ./get.go ./help.go ./list.go ./main.go ./pkg.go ./run.go ./test.go ./testflag.go ./vcs.go ./version.go ./vet.go
+6g -o "$WORK"/cmd/go/_obj/_go_.6 -p cmd/go -I "$WORK" ./bootstrap.go ./build.go ./fix.go ./fmt.go ./get.go ./help.go ./list.go ./main.go ./pkg.go ./run.go ./test.go ./testflag.go ./tool.go ./vcs.go ./version.go ./vet.go
 gopack grc "$WORK"/cmd/go.a "$WORK"/cmd/go/_obj/_go_.6
 6l -o "$WORK"/cmd/go/_obj/a.out -L "$WORK" "$WORK"/cmd/go.a
 mkdir -p "$GOBIN"/
diff --git a/src/buildscript/linux_arm.sh b/src/buildscript/linux_arm.sh
index d2e1a7a..7113ef3 100755
--- a/src/buildscript/linux_arm.sh
+++ b/src/buildscript/linux_arm.sh
@@ -494,7 +494,7 @@
 
 mkdir -p "$WORK"/cmd/go/_obj/
 cd "$GOROOT"/src/cmd/go
-5g -o "$WORK"/cmd/go/_obj/_go_.5 -p cmd/go -I "$WORK" ./bootstrap.go ./build.go ./fix.go ./fmt.go ./get.go ./help.go ./list.go ./main.go ./pkg.go ./run.go ./test.go ./testflag.go ./vcs.go ./version.go ./vet.go
+5g -o "$WORK"/cmd/go/_obj/_go_.5 -p cmd/go -I "$WORK" ./bootstrap.go ./build.go ./fix.go ./fmt.go ./get.go ./help.go ./list.go ./main.go ./pkg.go ./run.go ./test.go ./testflag.go ./tool.go ./vcs.go ./version.go ./vet.go
 gopack grc "$WORK"/cmd/go.a "$WORK"/cmd/go/_obj/_go_.5
 5l -o "$WORK"/cmd/go/_obj/a.out -L "$WORK" "$WORK"/cmd/go.a
 mkdir -p "$GOBIN"/
diff --git a/src/buildscript/netbsd_386.sh b/src/buildscript/netbsd_386.sh
index fcf8475..6fbe215 100755
--- a/src/buildscript/netbsd_386.sh
+++ b/src/buildscript/netbsd_386.sh
@@ -491,7 +491,7 @@
 
 mkdir -p "$WORK"/cmd/go/_obj/
 cd "$GOROOT"/src/cmd/go
-8g -o "$WORK"/cmd/go/_obj/_go_.8 -p cmd/go -I "$WORK" ./bootstrap.go ./build.go ./fix.go ./fmt.go ./get.go ./help.go ./list.go ./main.go ./pkg.go ./run.go ./test.go ./testflag.go ./vcs.go ./version.go ./vet.go
+8g -o "$WORK"/cmd/go/_obj/_go_.8 -p cmd/go -I "$WORK" ./bootstrap.go ./build.go ./fix.go ./fmt.go ./get.go ./help.go ./list.go ./main.go ./pkg.go ./run.go ./test.go ./testflag.go ./tool.go ./vcs.go ./version.go ./vet.go
 gopack grc "$WORK"/cmd/go.a "$WORK"/cmd/go/_obj/_go_.8
 8l -o "$WORK"/cmd/go/_obj/a.out -L "$WORK" "$WORK"/cmd/go.a
 mkdir -p "$GOBIN"/
diff --git a/src/buildscript/netbsd_amd64.sh b/src/buildscript/netbsd_amd64.sh
index 8ad1a15..9b0db555 100755
--- a/src/buildscript/netbsd_amd64.sh
+++ b/src/buildscript/netbsd_amd64.sh
@@ -490,7 +490,7 @@
 
 mkdir -p "$WORK"/cmd/go/_obj/
 cd "$GOROOT"/src/cmd/go
-6g -o "$WORK"/cmd/go/_obj/_go_.6 -p cmd/go -I "$WORK" ./bootstrap.go ./build.go ./fix.go ./fmt.go ./get.go ./help.go ./list.go ./main.go ./pkg.go ./run.go ./test.go ./testflag.go ./vcs.go ./version.go ./vet.go
+6g -o "$WORK"/cmd/go/_obj/_go_.6 -p cmd/go -I "$WORK" ./bootstrap.go ./build.go ./fix.go ./fmt.go ./get.go ./help.go ./list.go ./main.go ./pkg.go ./run.go ./test.go ./testflag.go ./tool.go ./vcs.go ./version.go ./vet.go
 gopack grc "$WORK"/cmd/go.a "$WORK"/cmd/go/_obj/_go_.6
 6l -o "$WORK"/cmd/go/_obj/a.out -L "$WORK" "$WORK"/cmd/go.a
 mkdir -p "$GOBIN"/
diff --git a/src/buildscript/openbsd_386.sh b/src/buildscript/openbsd_386.sh
index f80e1e0..192c436 100755
--- a/src/buildscript/openbsd_386.sh
+++ b/src/buildscript/openbsd_386.sh
@@ -491,7 +491,7 @@
 
 mkdir -p "$WORK"/cmd/go/_obj/
 cd "$GOROOT"/src/cmd/go
-8g -o "$WORK"/cmd/go/_obj/_go_.8 -p cmd/go -I "$WORK" ./bootstrap.go ./build.go ./fix.go ./fmt.go ./get.go ./help.go ./list.go ./main.go ./pkg.go ./run.go ./test.go ./testflag.go ./vcs.go ./version.go ./vet.go
+8g -o "$WORK"/cmd/go/_obj/_go_.8 -p cmd/go -I "$WORK" ./bootstrap.go ./build.go ./fix.go ./fmt.go ./get.go ./help.go ./list.go ./main.go ./pkg.go ./run.go ./test.go ./testflag.go ./tool.go ./vcs.go ./version.go ./vet.go
 gopack grc "$WORK"/cmd/go.a "$WORK"/cmd/go/_obj/_go_.8
 8l -o "$WORK"/cmd/go/_obj/a.out -L "$WORK" "$WORK"/cmd/go.a
 mkdir -p "$GOBIN"/
diff --git a/src/buildscript/openbsd_amd64.sh b/src/buildscript/openbsd_amd64.sh
index 257eecc..77979c3 100755
--- a/src/buildscript/openbsd_amd64.sh
+++ b/src/buildscript/openbsd_amd64.sh
@@ -490,7 +490,7 @@
 
 mkdir -p "$WORK"/cmd/go/_obj/
 cd "$GOROOT"/src/cmd/go
-6g -o "$WORK"/cmd/go/_obj/_go_.6 -p cmd/go -I "$WORK" ./bootstrap.go ./build.go ./fix.go ./fmt.go ./get.go ./help.go ./list.go ./main.go ./pkg.go ./run.go ./test.go ./testflag.go ./vcs.go ./version.go ./vet.go
+6g -o "$WORK"/cmd/go/_obj/_go_.6 -p cmd/go -I "$WORK" ./bootstrap.go ./build.go ./fix.go ./fmt.go ./get.go ./help.go ./list.go ./main.go ./pkg.go ./run.go ./test.go ./testflag.go ./tool.go ./vcs.go ./version.go ./vet.go
 gopack grc "$WORK"/cmd/go.a "$WORK"/cmd/go/_obj/_go_.6
 6l -o "$WORK"/cmd/go/_obj/a.out -L "$WORK" "$WORK"/cmd/go.a
 mkdir -p "$GOBIN"/
diff --git a/src/buildscript/plan9_386.sh b/src/buildscript/plan9_386.sh
index 9e3303e..bf454e4 100755
--- a/src/buildscript/plan9_386.sh
+++ b/src/buildscript/plan9_386.sh
@@ -491,7 +491,7 @@
 
 mkdir -p "$WORK"/cmd/go/_obj/
 cd "$GOROOT"/src/cmd/go
-8g -o "$WORK"/cmd/go/_obj/_go_.8 -p cmd/go -I "$WORK" ./bootstrap.go ./build.go ./fix.go ./fmt.go ./get.go ./help.go ./list.go ./main.go ./pkg.go ./run.go ./test.go ./testflag.go ./vcs.go ./version.go ./vet.go
+8g -o "$WORK"/cmd/go/_obj/_go_.8 -p cmd/go -I "$WORK" ./bootstrap.go ./build.go ./fix.go ./fmt.go ./get.go ./help.go ./list.go ./main.go ./pkg.go ./run.go ./test.go ./testflag.go ./tool.go ./vcs.go ./version.go ./vet.go
 gopack grc "$WORK"/cmd/go.a "$WORK"/cmd/go/_obj/_go_.8
 8l -o "$WORK"/cmd/go/_obj/a.out -L "$WORK" "$WORK"/cmd/go.a
 mkdir -p "$GOBIN"/
diff --git a/src/buildscript/windows_386.sh b/src/buildscript/windows_386.sh
index 789d5b6..dc1f305 100755
--- a/src/buildscript/windows_386.sh
+++ b/src/buildscript/windows_386.sh
@@ -493,7 +493,7 @@
 
 mkdir -p "$WORK"/cmd/go/_obj/
 cd "$GOROOT"/src/cmd/go
-8g -o "$WORK"/cmd/go/_obj/_go_.8 -p cmd/go -I "$WORK" ./bootstrap.go ./build.go ./fix.go ./fmt.go ./get.go ./help.go ./list.go ./main.go ./pkg.go ./run.go ./test.go ./testflag.go ./vcs.go ./version.go ./vet.go
+8g -o "$WORK"/cmd/go/_obj/_go_.8 -p cmd/go -I "$WORK" ./bootstrap.go ./build.go ./fix.go ./fmt.go ./get.go ./help.go ./list.go ./main.go ./pkg.go ./run.go ./test.go ./testflag.go ./tool.go ./vcs.go ./version.go ./vet.go
 gopack grc "$WORK"/cmd/go.a "$WORK"/cmd/go/_obj/_go_.8
 8l -o "$WORK"/cmd/go/_obj/a.out.exe -L "$WORK" "$WORK"/cmd/go.a
 mkdir -p "$GOBIN"/
diff --git a/src/buildscript/windows_amd64.sh b/src/buildscript/windows_amd64.sh
index 0026c1e..1148778 100755
--- a/src/buildscript/windows_amd64.sh
+++ b/src/buildscript/windows_amd64.sh
@@ -492,7 +492,7 @@
 
 mkdir -p "$WORK"/cmd/go/_obj/
 cd "$GOROOT"/src/cmd/go
-6g -o "$WORK"/cmd/go/_obj/_go_.6 -p cmd/go -I "$WORK" ./bootstrap.go ./build.go ./fix.go ./fmt.go ./get.go ./help.go ./list.go ./main.go ./pkg.go ./run.go ./test.go ./testflag.go ./vcs.go ./version.go ./vet.go
+6g -o "$WORK"/cmd/go/_obj/_go_.6 -p cmd/go -I "$WORK" ./bootstrap.go ./build.go ./fix.go ./fmt.go ./get.go ./help.go ./list.go ./main.go ./pkg.go ./run.go ./test.go ./testflag.go ./tool.go ./vcs.go ./version.go ./vet.go
 gopack grc "$WORK"/cmd/go.a "$WORK"/cmd/go/_obj/_go_.6
 6l -o "$WORK"/cmd/go/_obj/a.out.exe -L "$WORK" "$WORK"/cmd/go.a
 mkdir -p "$GOBIN"/
diff --git a/src/cmd/Makefile b/src/cmd/Makefile
index ee82b83..089739d 100644
--- a/src/cmd/Makefile
+++ b/src/cmd/Makefile
@@ -42,7 +42,7 @@
 	gofmt\
 	goinstall\
 	gotest\
-	goyacc\
+	yacc\
 
 install: $(patsubst %,%.install,$(DIRS))
 clean: $(patsubst %,%.clean,$(CLEANDIRS))
diff --git a/src/cmd/go/Makefile b/src/cmd/go/Makefile
index 295a144..3e19d2e 100644
--- a/src/cmd/go/Makefile
+++ b/src/cmd/go/Makefile
@@ -18,6 +18,7 @@
 	run.go\
 	test.go\
 	testflag.go\
+	tool.go\
 	version.go\
 	vet.go\
 	vcs.go\
diff --git a/src/cmd/go/main.go b/src/cmd/go/main.go
index ca3b118..b69c66d 100644
--- a/src/cmd/go/main.go
+++ b/src/cmd/go/main.go
@@ -75,6 +75,7 @@
 	cmdList,
 	cmdRun,
 	cmdTest,
+	cmdTool,
 	cmdVersion,
 	cmdVet,
 
diff --git a/src/cmd/go/tool.go b/src/cmd/go/tool.go
new file mode 100644
index 0000000..24ed78b
--- /dev/null
+++ b/src/cmd/go/tool.go
@@ -0,0 +1,100 @@
+// Copyright 2011 The Go Authors.  All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import (
+	"fmt"
+	"go/build"
+	"os"
+	"os/exec"
+	"sort"
+	"strings"
+)
+
+var cmdTool = &Command{
+	Run:       runTool,
+	UsageLine: "tool command [args...]",
+	Short:     "run specified go tool",
+	Long: `
+Tool runs the go tool command identified by the arguments.
+With no arguments it prints the list of known tools.
+
+For more about each tool command, see 'go tool command -h'.
+`,
+}
+
+var (
+	toolGoos       = build.DefaultContext.GOOS
+	toolIsWindows  = toolGoos == "windows"
+	toolBinToolDir = build.Path[0].BinDir() + "/go-tool"
+)
+
+const toolWindowsExtension = ".exe"
+
+func runTool(cmd *Command, args []string) {
+	if len(args) == 0 {
+		listTools()
+		return
+	}
+	tool := args[0]
+	// The tool name must be lower-case letters and numbers.
+	for _, c := range tool {
+		switch {
+		case 'a' <= c && c <= 'z', '0' <= c && c <= '9':
+		default:
+			fmt.Fprintf(os.Stderr, "go tool: bad tool name %q\n", tool)
+			exitStatus = 2
+			return
+		}
+	}
+	toolPath := toolBinToolDir + "/" + tool
+	if toolIsWindows {
+		toolPath += toolWindowsExtension
+	}
+	// Give a nice message if there is no tool with that name.
+	if _, err := os.Stat(toolPath); err != nil {
+		fmt.Fprintf(os.Stderr, "go tool: no such tool %q\n", tool)
+		exitStatus = 3
+		return
+	}
+	toolCmd := &exec.Cmd{
+		Path:   toolPath,
+		Args:   args,
+		Stdout: os.Stdout,
+		Stderr: os.Stderr,
+	}
+	err := toolCmd.Run()
+	if err != nil {
+		fmt.Fprintf(os.Stderr, "go tool %s failed: %s\n", tool, err)
+		exitStatus = 1
+		return
+	}
+}
+
+// listTools prints a list of the available tools in the go-tools directory.
+func listTools() {
+	toolDir, err := os.Open(toolBinToolDir)
+	if err != nil {
+		fmt.Fprintf(os.Stderr, "go tool: no tool directory: %s\n", err)
+		exitStatus = 2
+		return
+	}
+	names, err := toolDir.Readdirnames(-1)
+	if err != nil {
+		fmt.Fprintf(os.Stderr, "go tool: can't read directory: %s\n", err)
+		exitStatus = 2
+		return
+	}
+	sort.StringSlice(names).Sort()
+	for _, name := range names {
+		// Unify presentation by going to lower case.
+		name = strings.ToLower(name)
+		// If it's windows, don't show the .exe suffix.
+		if toolIsWindows && strings.HasSuffix(name, toolWindowsExtension) {
+			name = name[:len(name)-len(toolWindowsExtension)]
+		}
+		fmt.Println(name)
+	}
+}
diff --git a/src/cmd/goyacc/Makefile b/src/cmd/yacc/Makefile
similarity index 74%
rename from src/cmd/goyacc/Makefile
rename to src/cmd/yacc/Makefile
index a616e85..6ce9d54 100644
--- a/src/cmd/goyacc/Makefile
+++ b/src/cmd/yacc/Makefile
@@ -4,14 +4,14 @@
 
 include ../../Make.inc
 
-TARG=goyacc
+TARG=yacc
 GOFILES=\
-	goyacc.go\
+	yacc.go\
 
-include ../../Make.cmd
+include ../../Make.tool
 
-units: goyacc units.y
-	./goyacc -p units_ units.y
+units: yacc units.y
+	./yacc -p units_ units.y
 	$(GC) $(GCFLAGS) $(GCIMPORTS) y.go
 	$(LD) -o units y.$O
 
diff --git a/src/cmd/goyacc/doc.go b/src/cmd/yacc/doc.go
similarity index 82%
rename from src/cmd/goyacc/doc.go
rename to src/cmd/yacc/doc.go
index 5dd6abe..9874a2a 100644
--- a/src/cmd/goyacc/doc.go
+++ b/src/cmd/yacc/doc.go
@@ -4,7 +4,8 @@
 
 /*
 
-Goyacc is a version of yacc for Go.
+Yacc is a version of yacc for Go. It is run with the command
+	go tool yacc args...
 It is written in Go and generates parsers written in Go.
 
 It is largely transliterated from the Inferno version written in Limbo
@@ -13,7 +14,8 @@
 
 	http://plan9.bell-labs.com/magic/man2html/1/yacc
 
-Yacc adepts will have no trouble adapting to this form of the tool.
+Adepts of the original yacc will have no trouble adapting to this
+form of the tool.
 
 The file units.y in this directory is a yacc grammar for a version of
 the Unix tool units, also written in Go and largely transliterated
@@ -37,9 +39,9 @@
 
 Multiple grammars compiled into a single program should be placed in
 distinct packages.  If that is impossible, the "-p prefix" flag to
-goyacc sets the prefix, by default yy, that begins the names of
+yacc sets the prefix, by default yy, that begins the names of
 symbols, including types, the parser, and the lexer, generated and
-referenced by goyacc's generated code.  Setting it to distinct values
+referenced by yacc's generated code.  Setting it to distinct values
 allows multiple grammars to be placed in a single package.
 
 */
diff --git a/src/cmd/goyacc/units.txt b/src/cmd/yacc/units.txt
similarity index 100%
rename from src/cmd/goyacc/units.txt
rename to src/cmd/yacc/units.txt
diff --git a/src/cmd/goyacc/units.y b/src/cmd/yacc/units.y
similarity index 97%
rename from src/cmd/goyacc/units.y
rename to src/cmd/yacc/units.y
index 3833486..f10cb7c 100644
--- a/src/cmd/goyacc/units.y
+++ b/src/cmd/yacc/units.y
@@ -7,17 +7,17 @@
 // See http://plan9.bell-labs.com/plan9/license.html
 
 // Generate parser with prefix "units_":
-//	goyacc -p "units_"
+//	go tool yacc -p "units_"
 
 %{
 
 // units.y
-// example of a goyacc program
+// example of a Go yacc program
 // usage is
-//	goyacc -p "units_" units.y (produces y.go)
+//	go tool yacc -p "units_" units.y (produces y.go)
 //	6g y.go
 //	6l y.6
-//	./6.out $GOROOT/src/cmd/goyacc/units
+//	./6.out $GOROOT/src/cmd/yacc/units
 //	you have: c
 //	you want: furlongs/fortnight
 //		* 1.8026178e+12
@@ -288,7 +288,7 @@
 
 	flag.Parse()
 
-	file = os.Getenv("GOROOT") + "/src/cmd/goyacc/units.txt"
+	file = os.Getenv("GOROOT") + "/src/cmd/yacc/units.txt"
 	if flag.NArg() > 0 {
 		file = flag.Arg(0)
 	}
diff --git a/src/cmd/goyacc/goyacc.go b/src/cmd/yacc/yacc.go
similarity index 99%
rename from src/cmd/goyacc/goyacc.go
rename to src/cmd/yacc/yacc.go
index e1b99be..c91a721 100644
--- a/src/cmd/goyacc/goyacc.go
+++ b/src/cmd/yacc/yacc.go
@@ -2933,7 +2933,7 @@
 }
 
 func usage() {
-	fmt.Fprintf(stderr, "usage: goyacc [-o output] [-v parsetable] input\n")
+	fmt.Fprintf(stderr, "usage: yacc [-o output] [-v parsetable] input\n")
 	exit(1)
 }
 
diff --git a/src/make.bash b/src/make.bash
index 34708b5..aeaa181 100755
--- a/src/make.bash
+++ b/src/make.bash
@@ -22,11 +22,21 @@
 fi
 
 # Create target directories
-if [ "$GOBIN" = "$GOROOT/bin" ]; then
-	mkdir -p "$GOROOT/bin"
-fi
+mkdir -p "$GOROOT/bin/go-tool"
 mkdir -p "$GOROOT/pkg"
 
+# Remove old, pre-go-tool binaries.
+rm -f "$GOROOT"/bin/[568][acgl]
+rm -f "$GOROOT"/bin/{6cov,6nm,cgo,ebnflint,goapi,gofix,goinstall,gomake,gopack,gopprof,gotest,gotype,govet,goyacc,hgpatch,quietgcc}
+
+# If GOBIN is set and it has a Go compiler, it must also be cleaned.
+if [ -n "GOBIN" ]; then
+	if [ -x "$GOBIN"/5g -o -x "$GOBIN"/6g -o -x "$GOBIN"/8g ]; then
+		rm -f "$GOBIN"/[568][acgl]
+		rm -f "$GOBIN"/{6cov,6nm,cgo,ebnflint,goapi,gofix,goinstall,gomake,gopack,gopprof,gotest,gotype,govet,goyacc,hgpatch,quietgcc}
+	fi
+fi
+
 GOROOT_FINAL=${GOROOT_FINAL:-$GOROOT}
 
 MAKEFLAGS=${MAKEFLAGS:-"-j4"}
diff --git a/src/pkg/Makefile b/src/pkg/Makefile
index 4638558..6ffa527 100644
--- a/src/pkg/Makefile
+++ b/src/pkg/Makefile
@@ -161,7 +161,7 @@
 	../cmd/goinstall\
 	../cmd/gotest\
 	../cmd/govet\
-	../cmd/goyacc\
+	../cmd/yacc\
 
 ifeq ($(GOOS),linux)
 DIRS+=\
@@ -194,7 +194,7 @@
 	../cmd/cgo\
 	../cmd/godoc\
 	../cmd/gotest\
-	../cmd/goyacc\
+	../cmd/yacc\
 
 NOBENCH+=\