aboutsummaryrefslogtreecommitdiff
path: root/playground
diff options
context:
space:
mode:
authorRobert Daniel Kortschak <dan.kortschak@adelaide.edu.au>2014-07-08 10:44:34 +1000
committerAndrew Gerrand <adg@golang.org>2014-07-08 10:44:34 +1000
commit34a8e961919bb8b70a1ce19d85fd1b059f570d6b (patch)
treebef8e594e5f6b6cdc9a0e92860203b422fe6e198 /playground
parent3abe688aea0bcfc7e434bb7e2244257c3bbdfb95 (diff)
downloadgolang-x-tools-34a8e961919bb8b70a1ce19d85fd1b059f570d6b.tar.gz
go.tools/playground/socket: add Native Client wrapper handling
LGTM=adg R=adg, dave, rsc, minux CC=golang-codereviews https://golang.org/cl/77240043
Diffstat (limited to 'playground')
-rw-r--r--playground/socket/socket.go47
1 files changed, 46 insertions, 1 deletions
diff --git a/playground/socket/socket.go b/playground/socket/socket.go
index 4d84cf096..89dc53278 100644
--- a/playground/socket/socket.go
+++ b/playground/socket/socket.go
@@ -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)