| // 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" |
| "os" |
| "os/exec" |
| "strings" |
| ) |
| |
| var cmdRun = &Command{ |
| UsageLine: "run [-a] [-n] [-x] gofiles... [arguments...]", |
| Short: "compile and run Go program", |
| Long: ` |
| Run compiles and runs the main package comprising the named Go source files. |
| |
| The -a flag forces reinstallation of packages that are already up-to-date. |
| The -n flag prints the commands but does not run them. |
| The -x flag prints the commands. |
| |
| See also: go build. |
| `, |
| } |
| |
| func init() { |
| cmdRun.Run = runRun // break init loop |
| |
| cmdRun.Flag.BoolVar(&buildA, "a", false, "") |
| cmdRun.Flag.BoolVar(&buildN, "n", false, "") |
| cmdRun.Flag.BoolVar(&buildX, "x", false, "") |
| } |
| |
| func printStderr(args ...interface{}) (int, error) { |
| return fmt.Fprint(os.Stderr, args...) |
| } |
| |
| func runRun(cmd *Command, args []string) { |
| var b builder |
| b.init() |
| b.print = printStderr |
| i := 0 |
| for i < len(args) && strings.HasSuffix(args[i], ".go") { |
| i++ |
| } |
| files, cmdArgs := args[:i], args[i:] |
| p := goFilesPackage(files, "") |
| p.target = "" // must build - not up to date |
| a1 := b.action(modeBuild, modeBuild, p) |
| a := &action{f: (*builder).runProgram, args: cmdArgs, deps: []*action{a1}} |
| b.do(a) |
| } |
| |
| // runProgram is the action for running a binary that has already |
| // been compiled. We ignore exit status. |
| func (b *builder) runProgram(a *action) error { |
| if buildN || buildX { |
| b.showcmd("", "%s %s", a.deps[0].target, strings.Join(a.args, " ")) |
| if buildN { |
| return nil |
| } |
| } |
| |
| runStdin(a.deps[0].target, a.args) |
| return nil |
| } |
| |
| // runStdin is like run, but connects Stdin. |
| func runStdin(cmdargs ...interface{}) { |
| cmdline := stringList(cmdargs...) |
| cmd := exec.Command(cmdline[0], cmdline[1:]...) |
| cmd.Stdin = os.Stdin |
| cmd.Stdout = os.Stdout |
| cmd.Stderr = os.Stderr |
| if err := cmd.Run(); err != nil { |
| errorf("%v", err) |
| } |
| } |