diff options
author | Hyang-Ah Hana Kim <hakim@google.com> | 2015-01-15 16:47:41 -0500 |
---|---|---|
committer | Hyang-Ah Hana Kim <hyangah@gmail.com> | 2015-01-16 22:02:52 +0000 |
commit | d5d4e82fb28f506701791f622ec0b03b984e41a5 (patch) | |
tree | 9064ba8b86183a4ff2b861b8981962413de4bb36 /misc/android | |
parent | 36f456c789da341df496f161672df618b7410d58 (diff) | |
download | go-git-d5d4e82fb28f506701791f622ec0b03b984e41a5.tar.gz |
misc/android: choose the right subdirectory for bin under GOPATH.
This change includes the cleanup of temporary files created during
the binary execution as well.
Change-Id: Ic01a0a537d1daafcaa3acda1ec344aff5dcddfc2
Reviewed-on: https://go-review.googlesource.com/2903
Reviewed-by: David Crawshaw <crawshaw@golang.org>
Diffstat (limited to 'misc/android')
-rw-r--r-- | misc/android/README | 4 | ||||
-rw-r--r-- | misc/android/go_android_exec.go | 82 |
2 files changed, 61 insertions, 25 deletions
diff --git a/misc/android/README b/misc/android/README index 5f24fafc7c..7b17d879e8 100644 --- a/misc/android/README +++ b/misc/android/README @@ -2,9 +2,9 @@ Android ======= For details on developing Go for Android, see the documentation in the -go.mobile subrepository: +mobile subrepository: - https://code.google.com/p/go/source/browse/README?repo=mobile + https://github.com/golang/mobile To run the standard library tests, see androidtest.bash. Run it as diff --git a/misc/android/go_android_exec.go b/misc/android/go_android_exec.go index e32a805a8c..a67e990c34 100644 --- a/misc/android/go_android_exec.go +++ b/misc/android/go_android_exec.go @@ -9,6 +9,7 @@ package main import ( "bytes" "fmt" + "go/build" "io" "log" "os" @@ -32,33 +33,36 @@ func run(args ...string) string { return buf.String() } +const ( + // Directory structure on the target device androidtest.bash assumes. + deviceGoroot = "/data/local/tmp/goroot" + deviceGopath = "/data/local/tmp/gopath" +) + func main() { log.SetFlags(0) log.SetPrefix("go_android_exec: ") - // Determine thepackage by examining the current working + // Prepare a temporary directory that will be cleaned up at the end. + deviceGotmp := fmt.Sprintf("/data/local/tmp/%s-%d", + filepath.Base(os.Args[1]), os.Getpid()) + run("shell", "mkdir", "-p", deviceGotmp) + + // Determine the package by examining the current working // directory, which will look something like - // "$GOROOT/src/mime/multipart". We extract everything - // after the $GOROOT to run on the same relative directory - // on the target device. - // - // TODO(crawshaw): Pick useful subdir when we are not - // inside a GOROOT, e.g. we are in a GOPATH. - cwd, err := os.Getwd() - if err != nil { - log.Fatal(err) + // "$GOROOT/src/mime/multipart" or "$GOPATH/src/golang.org/x/mobile". + // We extract everything after the $GOROOT or $GOPATH to run on the + // same relative directory on the target device. + subdir, inGoRoot := subdir() + deviceCwd := filepath.Join(deviceGoroot, subdir) + if !inGoRoot { + deviceCwd = filepath.Join(deviceGopath, subdir) } - subdir, err := filepath.Rel(runtime.GOROOT(), cwd) - if err != nil { - log.Fatal(err) - } - subdir = filepath.ToSlash(subdir) // Binary names can conflict. // E.g. template.test from the {html,text}/template packages. binName := filepath.Base(os.Args[1]) - deviceGoroot := "/data/local/tmp/goroot" - deviceBin := fmt.Sprintf("%s/%s-%d", deviceGoroot, binName, os.Getpid()) + deviceBin := fmt.Sprintf("%s/%s-%d", deviceGotmp, binName, os.Getpid()) // The push of the binary happens in parallel with other tests. // Unfortunately, a simultaneous call to adb shell hold open @@ -71,19 +75,22 @@ func main() { // The adb shell command will return an exit code of 0 regardless // of the command run. E.g. - // $ adb shell false - // $ echo $? - // 0 + // $ adb shell false + // $ echo $? + // 0 // https://code.google.com/p/android/issues/detail?id=3254 // So we append the exitcode to the output and parse it from there. const exitstr = "exitcode=" - cmd := `export TMPDIR="/data/local/tmp"` + + cmd := `export TMPDIR="` + deviceGotmp + `"` + `; export GOROOT="` + deviceGoroot + `"` + - `; cd "$GOROOT/` + subdir + `"` + + `; export GOPATH="` + deviceGopath + `"` + + `; cd "` + deviceCwd + `"` + "; '" + deviceBin + "' " + strings.Join(os.Args[2:], " ") + "; echo -n " + exitstr + "$?" output := run("shell", cmd) - run("shell", "rm '"+deviceBin+"'") // cleanup + + run("shell", "rm", "-rf", deviceGotmp) // Clean up. + output = output[strings.LastIndex(output, "\n")+1:] if !strings.HasPrefix(output, exitstr) { log.Fatalf("no exit code: %q", output) @@ -94,3 +101,32 @@ func main() { } os.Exit(code) } + +// subdir determines the package based on the current working directory, +// and returns the path to the package source relative to $GOROOT (or $GOPATH). +func subdir() (pkgpath string, underGoRoot bool) { + cwd, err := os.Getwd() + if err != nil { + log.Fatal(err) + } + if root := runtime.GOROOT(); strings.HasPrefix(cwd, root) { + subdir, err := filepath.Rel(root, cwd) + if err != nil { + log.Fatal(err) + } + return subdir, true + } + + for _, p := range filepath.SplitList(build.Default.GOPATH) { + if !strings.HasPrefix(cwd, p) { + continue + } + subdir, err := filepath.Rel(p, cwd) + if err == nil { + return subdir, false + } + } + log.Fatalf("the current path %q is not in either GOROOT(%q) or GOPATH(%q)", + cwd, runtime.GOROOT(), build.Default.GOPATH) + return "", false +} |