diff options
| author | Elias Naur <mail@eliasnaur.com> | 2019-02-24 15:18:02 +0100 |
|---|---|---|
| committer | Brad Fitzpatrick <bradfitz@golang.org> | 2019-02-26 18:00:48 +0000 |
| commit | e3d99a3f8608e308eedc201b83eeb2f0e0d9dc81 (patch) | |
| tree | 17530050f0fcf0b10a80ec80199ffea97cde4404 /misc/android | |
| parent | 3ef7e3d44f3dfaceab83b779c8bcd1cebe834de2 (diff) | |
| download | go-e3d99a3f8608e308eedc201b83eeb2f0e0d9dc81.tar.xz | |
misc/android,cmd/dist: move $GOROOT copying to the exec wrapper
To run the standard library tests on Android, the androidtest.bash
script copies GOROOT to the device. Move that logic to the android
exec wrapper, thereby making androidtest.bash obsolete.
Apart from making Android less special, the sharded builder
infrastructure should now be able to run (emulated) Android builders
and trybots without special treatment.
Updates #23824
Change-Id: I41591fea9a15b38c6dcf84046ea57f1e9165eaa5
Reviewed-on: https://go-review.googlesource.com/c/163619
Run-TryBot: Elias Naur <mail@eliasnaur.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Diffstat (limited to 'misc/android')
| -rw-r--r-- | misc/android/README | 16 | ||||
| -rw-r--r-- | misc/android/cleaner.go | 41 | ||||
| -rw-r--r-- | misc/android/go_android_exec.go | 46 |
3 files changed, 54 insertions, 49 deletions
diff --git a/misc/android/README b/misc/android/README index f01ca2cc2b..38e7cf41e3 100644 --- a/misc/android/README +++ b/misc/android/README @@ -6,18 +6,18 @@ mobile subrepository: https://github.com/golang/mobile -To run the standard library tests, see androidtest.bash. Run it as +To run the standard library tests, enable Cgo and use an appropriate +C compiler from the Android NDK. For example, - CC_FOR_TARGET=$STANDALONE_NDK_PATH/bin/clang GOARCH=arm64 ./androidtest.bash - -To create a standalone android NDK tool chain, follow the instructions on - - https://developer.android.com/ndk/guides/standalone_toolchain + CGO_ENABLED=1 \ + GOOS=android \ + GOARCH=arm64 \ + CC=$NDK/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android21-clang \ + ./all.bash To run tests on the Android device, add the bin directory to PATH so the go tool can find the go_android_$GOARCH_exec wrapper generated by -androidtest.bash. Then, use the same GOARCH as when androidtest.bash ran -and set GOOS to android. For example, to run the go1 benchmarks +make.bash. For example, to run the go1 benchmarks export PATH=$GOROOT/bin:$PATH cd $GOROOT/test/bench/go1/ diff --git a/misc/android/cleaner.go b/misc/android/cleaner.go deleted file mode 100644 index edbbdcd0ef..0000000000 --- a/misc/android/cleaner.go +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2015 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. - -// +build ignore - -// Cleaner removes anything from /data/local/tmp/goroot not on a builtin list. -// Used by androidtest.bash. -package main - -import ( - "log" - "os" - "path/filepath" - "strings" -) - -func main() { - const goroot = "/data/local/tmp/goroot" - expect := make(map[string]bool) - for _, f := range strings.Split(files, "\n") { - expect[filepath.Join(goroot, f)] = true - } - - err := filepath.Walk(goroot, func(path string, info os.FileInfo, err error) error { - if expect[path] { - return nil - } - log.Printf("removing %s", path) - if err := os.RemoveAll(path); err != nil { - return err - } - if info.IsDir() { - return filepath.SkipDir - } - return nil - }) - if err != nil { - log.Fatal(err) - } -} diff --git a/misc/android/go_android_exec.go b/misc/android/go_android_exec.go index e36edacc76..1a8ae7070e 100644 --- a/misc/android/go_android_exec.go +++ b/misc/android/go_android_exec.go @@ -13,6 +13,7 @@ import ( "fmt" "go/build" "io" + "io/ioutil" "log" "os" "os/exec" @@ -78,6 +79,8 @@ func main() { deviceCwd := filepath.Join(deviceGoroot, subdir) if !inGoRoot { deviceCwd = filepath.Join(deviceGopath, subdir) + } else { + adbSyncGoroot() } // Binary names can conflict. @@ -164,3 +167,46 @@ func subdir() (pkgpath string, underGoRoot bool) { cwd, runtime.GOROOT(), build.Default.GOPATH) return "", false } + +// adbSyncGoroot ensures that files necessary for testing the Go standard +// packages are present on the attached device. +func adbSyncGoroot() { + // Also known by cmd/dist. The bootstrap command deletes the file. + statPath := filepath.Join(os.TempDir(), "go_android_exec-adb-sync-status") + stat, err := os.OpenFile(statPath, os.O_CREATE|os.O_RDWR, 0666) + if err != nil { + log.Fatal(err) + } + defer stat.Close() + // Serialize check and syncing. + if err := syscall.Flock(int(stat.Fd()), syscall.LOCK_EX); err != nil { + log.Fatal(err) + } + s, err := ioutil.ReadAll(stat) + if err != nil { + log.Fatal(err) + } + if string(s) == "done" { + return + } + devRoot := "/data/local/tmp/goroot" + run("shell", "rm", "-rf", devRoot) + run("shell", "mkdir", "-p", devRoot+"/pkg") + goroot := runtime.GOROOT() + goCmd := filepath.Join(goroot, "bin", "go") + runtimea, err := exec.Command(goCmd, "list", "-f", "{{.Target}}", "runtime").Output() + if err != nil { + log.Fatal(err) + } + pkgdir := filepath.Dir(string(runtimea)) + if pkgdir == "" { + log.Fatal("could not find android pkg dir") + } + for _, dir := range []string{"src", "test", "lib"} { + run("push", filepath.Join(goroot, dir), filepath.Join(devRoot)) + } + run("push", filepath.Join(pkgdir), filepath.Join(devRoot, "pkg/")) + if _, err := stat.Write([]byte("done")); err != nil { + log.Fatal(err) + } +} |
