var exeSuffix string
var GOOS, GOARCH, GOROOT string
-var installdir, androiddir, ldlibrarypath string
+var installdir, androiddir string
var libSuffix, libgoname string
func init() {
cc = append(cc, s[start:])
}
- if GOOS == "darwin" {
+ switch GOOS {
+ case "darwin":
// For Darwin/ARM.
// TODO(crawshaw): can we do better?
cc = append(cc, []string{"-framework", "CoreFoundation", "-framework", "Foundation"}...)
+ case "android":
+ cc = append(cc, "-pie", "-fuse-ld=gold")
}
libgodir := GOOS + "_" + GOARCH
switch GOOS {
os.Exit(2)
}
gopathEnv = append(os.Environ(), "GOPATH="+dir)
- ldlibrarypath = "LD_LIBRARY_PATH=" + dir
if GOOS == "windows" {
exeSuffix = ".exe"
}
}
-func adbRun(t *testing.T, adbargs ...string) string {
+func adbRun(t *testing.T, env []string, adbargs ...string) string {
if GOOS != "android" {
t.Fatalf("trying to run adb command when operating system is not android.")
}
args := []string{"adb", "shell"}
+ // Propagate LD_LIBRARY_PATH to the adb shell invocation.
+ for _, e := range env {
+ if strings.Index(e, "LD_LIBRARY_PATH=") != -1 {
+ adbargs = append([]string{e}, adbargs...)
+ break
+ }
+ }
shellcmd := fmt.Sprintf("cd %s; %s", androiddir, strings.Join(adbargs, " "))
args = append(args, shellcmd)
cmd := exec.Command(args[0], args[1:]...)
}
func runwithenv(t *testing.T, env []string, args ...string) string {
- if GOOS == "android" {
- return adbRun(t, args...)
- }
-
cmd := exec.Command(args[0], args[1:]...)
cmd.Env = env
out, err := cmd.CombinedOutput()
}
func run(t *testing.T, args ...string) string {
- if GOOS == "android" {
- return adbRun(t, args...)
- }
-
cmd := exec.Command(args[0], args[1:]...)
out, err := cmd.CombinedOutput()
if err != nil {
return string(out)
}
+func runExe(t *testing.T, env []string, args ...string) string {
+ if GOOS == "android" {
+ return adbRun(t, env, args...)
+ }
+
+ return runwithenv(t, env, args...)
+}
+
func runwithldlibrarypath(t *testing.T, args ...string) string {
- return runwithenv(t, append(gopathEnv, ldlibrarypath), args...)
+ return runExe(t, append(gopathEnv, "LD_LIBRARY_PATH=."), args...)
}
func rungocmd(t *testing.T, args ...string) string {
if GOOS != "android" {
return
}
- adbRun(t, "mkdir", "-p", androiddir)
+ adbRun(t, nil, "mkdir", "-p", androiddir)
}
func cleanupAndroid(t *testing.T) {
if GOOS != "android" {
return
}
- adbRun(t, "rm", "-rf", androiddir)
+ adbRun(t, nil, "rm", "-rf", androiddir)
}
// test0: exported symbols in shared lib are accessible.
defer os.Remove(libgoname)
defer os.Remove(cmd)
- out := run(t, append(bin, "./"+libgoname)...)
+ out := runExe(t, nil, append(bin, "./"+libgoname)...)
if strings.TrimSpace(out) != "PASS" {
t.Error(out)
}
defer os.Remove(libgoname)
defer os.Remove(cmd)
- out := run(t, append(bin, "./"+libgoname)...)
+ out := runExe(t, nil, append(bin, "./"+libgoname)...)
if strings.TrimSpace(out) != "PASS" {
t.Error(out)
}
defer os.Remove(cmd)
defer os.Remove("libgo4.h")
- out := run(t, append(bin, "./"+libname)...)
+ out := runExe(t, nil, append(bin, "./"+libname)...)
if strings.TrimSpace(out) != "PASS" {
t.Error(run(t, append(bin, libname, "verbose")...))
defer os.Remove(cmd)
defer os.Remove("libgo5.h")
- out := run(t, append(bin, "./"+libname)...)
+ out := runExe(t, nil, append(bin, "./"+libname)...)
if strings.TrimSpace(out) != "PASS" {
t.Error(run(t, append(bin, libname, "verbose")...))