go.tools/playground/socket: add Native Client wrapper handling

LGTM=adg
R=adg, dave, rsc, minux
CC=golang-codereviews
https://golang.org/cl/77240043
This commit is contained in:
Robert Daniel Kortschak 2014-07-08 10:44:34 +10:00 committed by Andrew Gerrand
parent 3abe688aea
commit 34a8e96191

View File

@ -268,7 +268,14 @@ func (p *process) start(body string, opt *Options) error {
}
// run x
cmd = p.cmd("", bin)
if isNacl() {
cmd, err = p.naclCmd(bin)
if err != nil {
return err
}
} else {
cmd = p.cmd("", bin)
}
if opt != nil && opt.Race {
cmd.Env = append(cmd.Env, "GOMAXPROCS=2")
}
@ -317,6 +324,44 @@ func (p *process) cmd(dir string, args ...string) *exec.Cmd {
return cmd
}
func isNacl() bool {
for _, v := range append(Environ(), os.Environ()...) {
if v == "GOOS=nacl" {
return true
}
}
return false
}
// naclCmd returns an *exec.Cmd that executes bin under native client.
func (p *process) naclCmd(bin string) (*exec.Cmd, error) {
pwd, err := os.Getwd()
if err != nil {
return nil, err
}
var ldr string
env := []string{
"NACLENV_GOOS=" + runtime.GOOS,
"NACLENV_GOROOT=/go",
"NACLENV_NACLPWD=" + strings.Replace(pwd, runtime.GOROOT(), "/go", 1),
}
switch runtime.GOARCH {
case "amd64":
env = append(env, "NACLENV_GOARCH=amd64")
ldr = "sel_ldr_x86_64"
case "386":
env = append(env, "NACLENV_GOARCH=386")
ldr = "sel_ldr_x86_32"
default:
return nil, errors.New("native client does not support GOARCH=" + runtime.GOARCH)
}
cmd := p.cmd("", ldr, "-l", "/dev/null", "-S", "-e", bin)
cmd.Env = append(cmd.Env, env...)
return cmd, nil
}
func packageName(body string) (string, error) {
f, err := parser.ParseFile(token.NewFileSet(), "prog.go",
strings.NewReader(body), parser.PackageClauseOnly)