From 79dc34413e4ad93cc8c590e9f3cc97538c7f8266 Mon Sep 17 00:00:00 2001 From: Rob Pike Date: Sun, 29 Jan 2012 09:19:05 -0800 Subject: [PATCH] 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 --- src/Make.tool | 49 ++++++++++ src/buildscript/darwin_386.sh | 2 +- src/buildscript/darwin_amd64.sh | 2 +- src/buildscript/freebsd_386.sh | 2 +- src/buildscript/freebsd_amd64.sh | 2 +- src/buildscript/linux_386.sh | 2 +- src/buildscript/linux_amd64.sh | 2 +- src/buildscript/linux_arm.sh | 2 +- src/buildscript/netbsd_386.sh | 2 +- src/buildscript/netbsd_amd64.sh | 2 +- src/buildscript/openbsd_386.sh | 2 +- src/buildscript/openbsd_amd64.sh | 2 +- src/buildscript/plan9_386.sh | 2 +- src/buildscript/windows_386.sh | 2 +- src/buildscript/windows_amd64.sh | 2 +- src/cmd/Makefile | 2 +- src/cmd/go/Makefile | 1 + src/cmd/go/main.go | 1 + src/cmd/go/tool.go | 100 +++++++++++++++++++++ src/cmd/{goyacc => yacc}/Makefile | 10 +-- src/cmd/{goyacc => yacc}/doc.go | 10 ++- src/cmd/{goyacc => yacc}/units.txt | 0 src/cmd/{goyacc => yacc}/units.y | 10 +-- src/cmd/{goyacc/goyacc.go => yacc/yacc.go} | 2 +- src/make.bash | 16 +++- src/pkg/Makefile | 4 +- 26 files changed, 198 insertions(+), 35 deletions(-) create mode 100644 src/Make.tool create mode 100644 src/cmd/go/tool.go rename src/cmd/{goyacc => yacc}/Makefile (74%) rename src/cmd/{goyacc => yacc}/doc.go (82%) rename src/cmd/{goyacc => yacc}/units.txt (100%) rename src/cmd/{goyacc => yacc}/units.y (98%) rename src/cmd/{goyacc/goyacc.go => yacc/yacc.go} (99%) diff --git a/src/Make.tool b/src/Make.tool new file mode 100644 index 0000000000..fdbb4dd047 --- /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 73897ba418..38feafd063 100755 --- a/src/buildscript/darwin_386.sh +++ b/src/buildscript/darwin_386.sh @@ -491,7 +491,7 @@ cp "$WORK"/text/template.a "$GOROOT"/pkg/darwin_386/text/template.a 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 b0cab57404..200279dba9 100755 --- a/src/buildscript/darwin_amd64.sh +++ b/src/buildscript/darwin_amd64.sh @@ -490,7 +490,7 @@ cp "$WORK"/text/template.a "$GOROOT"/pkg/darwin_amd64/text/template.a 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 0c24e12c5a..85e2af8bac 100755 --- a/src/buildscript/freebsd_386.sh +++ b/src/buildscript/freebsd_386.sh @@ -491,7 +491,7 @@ cp "$WORK"/text/template.a "$GOROOT"/pkg/freebsd_386/text/template.a 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 0a645cca20..50c44b882e 100755 --- a/src/buildscript/freebsd_amd64.sh +++ b/src/buildscript/freebsd_amd64.sh @@ -490,7 +490,7 @@ cp "$WORK"/text/template.a "$GOROOT"/pkg/freebsd_amd64/text/template.a 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 246f17b061..7cdc5eb7c8 100755 --- a/src/buildscript/linux_386.sh +++ b/src/buildscript/linux_386.sh @@ -491,7 +491,7 @@ cp "$WORK"/text/template.a "$GOROOT"/pkg/linux_386/text/template.a 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 1c1ff21a90..9b05918252 100755 --- a/src/buildscript/linux_amd64.sh +++ b/src/buildscript/linux_amd64.sh @@ -490,7 +490,7 @@ cp "$WORK"/text/template.a "$GOROOT"/pkg/linux_amd64/text/template.a 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 d2e1a7a100..7113ef376c 100755 --- a/src/buildscript/linux_arm.sh +++ b/src/buildscript/linux_arm.sh @@ -494,7 +494,7 @@ cp "$WORK"/text/template.a "$GOROOT"/pkg/linux_arm/text/template.a 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 fcf847571b..6fbe215a84 100755 --- a/src/buildscript/netbsd_386.sh +++ b/src/buildscript/netbsd_386.sh @@ -491,7 +491,7 @@ cp "$WORK"/text/template.a "$GOROOT"/pkg/netbsd_386/text/template.a 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 8ad1a15436..9b0db555f4 100755 --- a/src/buildscript/netbsd_amd64.sh +++ b/src/buildscript/netbsd_amd64.sh @@ -490,7 +490,7 @@ cp "$WORK"/text/template.a "$GOROOT"/pkg/netbsd_amd64/text/template.a 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 f80e1e0acb..192c436612 100755 --- a/src/buildscript/openbsd_386.sh +++ b/src/buildscript/openbsd_386.sh @@ -491,7 +491,7 @@ cp "$WORK"/text/template.a "$GOROOT"/pkg/openbsd_386/text/template.a 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 257eecc96e..77979c3221 100755 --- a/src/buildscript/openbsd_amd64.sh +++ b/src/buildscript/openbsd_amd64.sh @@ -490,7 +490,7 @@ cp "$WORK"/text/template.a "$GOROOT"/pkg/openbsd_amd64/text/template.a 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 9e3303ed82..bf454e493c 100755 --- a/src/buildscript/plan9_386.sh +++ b/src/buildscript/plan9_386.sh @@ -491,7 +491,7 @@ cp "$WORK"/text/template.a "$GOROOT"/pkg/plan9_386/text/template.a 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 789d5b67ff..dc1f305b31 100755 --- a/src/buildscript/windows_386.sh +++ b/src/buildscript/windows_386.sh @@ -493,7 +493,7 @@ cp "$WORK"/text/template.a "$GOROOT"/pkg/windows_386/text/template.a 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 0026c1e086..11487786f2 100755 --- a/src/buildscript/windows_amd64.sh +++ b/src/buildscript/windows_amd64.sh @@ -492,7 +492,7 @@ cp "$WORK"/text/template.a "$GOROOT"/pkg/windows_amd64/text/template.a 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 ee82b83116..089739d05a 100644 --- a/src/cmd/Makefile +++ b/src/cmd/Makefile @@ -42,7 +42,7 @@ CLEANDIRS=\ 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 295a14498c..3e19d2e3dc 100644 --- a/src/cmd/go/Makefile +++ b/src/cmd/go/Makefile @@ -18,6 +18,7 @@ GOFILES=\ 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 ca3b1188a6..b69c66d3eb 100644 --- a/src/cmd/go/main.go +++ b/src/cmd/go/main.go @@ -75,6 +75,7 @@ var commands = []*Command{ 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 0000000000..24ed78bdab --- /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 a616e85348..6ce9d54fbe 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 5dd6abe693..9874a2ae2e 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 @@ written in C and documented at 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 @@ which holds the yyLexer passed to Parse. 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 98% rename from src/cmd/goyacc/units.y rename to src/cmd/yacc/units.y index 3833486ad0..f10cb7c7dc 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 @@ func main() { 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 e1b99bed2b..c91a72123e 100644 --- a/src/cmd/goyacc/goyacc.go +++ b/src/cmd/yacc/yacc.go @@ -2933,7 +2933,7 @@ func chcopy(q string) string { } 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 34708b5063..aeaa181090 100755 --- a/src/make.bash +++ b/src/make.bash @@ -22,11 +22,21 @@ if ld --version 2>&1 | grep 'gold.* 2\.20' >/dev/null; then 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 4638558803..6ffa527da2 100644 --- a/src/pkg/Makefile +++ b/src/pkg/Makefile @@ -161,7 +161,7 @@ DIRS=\ ../cmd/goinstall\ ../cmd/gotest\ ../cmd/govet\ - ../cmd/goyacc\ + ../cmd/yacc\ ifeq ($(GOOS),linux) DIRS+=\ @@ -194,7 +194,7 @@ NOTEST+=\ ../cmd/cgo\ ../cmd/godoc\ ../cmd/gotest\ - ../cmd/goyacc\ + ../cmd/yacc\ NOBENCH+=\ -- 2.48.1