bind,cmd/gomobile: require Go 1.7

Bump the minimum required version of Go to 1.7.

This removes version specific code and makes sure users have the
latest mobile related fixes to Go applied. Also, this change is
necessary when runtime.KeepAlive is introduced in a later CL.

Change-Id: I8441a28aef7f645379fbd8f00edabe3c3fb219de
Reviewed-on: https://go-review.googlesource.com/35953
Reviewed-by: David Crawshaw <crawshaw@golang.org>
diff --git a/bind/gen.go b/bind/gen.go
index 519d1e3..546c5cf 100644
--- a/bind/gen.go
+++ b/bind/gen.go
@@ -371,21 +371,6 @@
 	return name
 }
 
-func constExactString(o *types.Const) string {
-	// TODO(hyangah): this is a temporary fix for golang.org/issues/14615.
-	// Clean this up when we can require at least go 1.6 or above.
-
-	type exactStringer interface {
-		ExactString() string
-	}
-	v := o.Val()
-	if v, ok := v.(exactStringer); ok {
-		return v.ExactString()
-	}
-	// TODO: warning?
-	return v.String()
-}
-
 func lowerFirst(s string) string {
 	if s == "" {
 		return ""
diff --git a/bind/genjava.go b/bind/genjava.go
index 3080fa1..ee45c20 100644
--- a/bind/genjava.go
+++ b/bind/genjava.go
@@ -983,7 +983,7 @@
 	// TODO(hyangah): should const names use upper cases + "_"?
 	// TODO(hyangah): check invalid names.
 	jType := g.javaType(o.Type())
-	val := constExactString(o)
+	val := o.Val().ExactString()
 	switch b := o.Type().(*types.Basic); b.Kind() {
 	case types.Int64, types.UntypedInt:
 		i, exact := constant.Int64Val(o.Val())
diff --git a/bind/genobjc.go b/bind/genobjc.go
index 32ec399..4485dcf 100644
--- a/bind/genobjc.go
+++ b/bind/genobjc.go
@@ -368,7 +368,7 @@
 		g.Printf("const BOOL %s = %s;\n", cName, v)
 
 	case types.String, types.UntypedString:
-		g.Printf("NSString* const %s = @%s;\n", cName, constExactString(o))
+		g.Printf("NSString* const %s = @%s;\n", cName, o.Val().ExactString())
 
 	case types.Int, types.Int8, types.Int16, types.Int32:
 		g.Printf("const %s %s = %s;\n", objcType, cName, o.Val())
diff --git a/cmd/gomobile/bind_androidapp.go b/cmd/gomobile/bind_androidapp.go
index cb86f00..59ad764 100644
--- a/cmd/gomobile/bind_androidapp.go
+++ b/cmd/gomobile/bind_androidapp.go
@@ -21,12 +21,9 @@
 	if sdkDir := os.Getenv("ANDROID_HOME"); sdkDir == "" {
 		return fmt.Errorf("this command requires ANDROID_HOME environment variable (path to the Android SDK)")
 	}
-	var androidArgs []string
-	if goVersion == go1_6 {
-		// Ideally this would be -buildmode=c-shared.
-		// https://golang.org/issue/13234.
-		androidArgs = []string{"-gcflags=-shared", "-ldflags=-shared"}
-	}
+	// Ideally this would be -buildmode=c-shared.
+	// https://golang.org/issue/13234.
+	androidArgs := []string{"-gcflags=-shared", "-ldflags=-shared"}
 
 	paths := make([]string, len(pkgs))
 	for i, p := range pkgs {
diff --git a/cmd/gomobile/bind_test.go b/cmd/gomobile/bind_test.go
index d2f4d1c..0e3abae 100644
--- a/cmd/gomobile/bind_test.go
+++ b/cmd/gomobile/bind_test.go
@@ -36,7 +36,7 @@
 	buildN = true
 	buildX = true
 	buildO = "asset.aar"
-	buildTarget = "android"
+	buildTarget = "android/arm"
 	ndkRoot = "/NDK"
 
 	tests := []struct {
@@ -107,7 +107,7 @@
 mkdir -p $WORK/gomobile_bind
 mkdir -p $WORK/gomobile_bind
 mkdir -p $WORK/gen/src/Java
-GOOS=android GOARCH=arm CC=/NDK/toolchains/llvm/prebuilt/{{.GOOS}}-{{.NDKARCH}}/bin/clang{{.EXE}} CXX=/NDK/toolchains/llvm/prebuilt/{{.GOOS}}-{{.NDKARCH}}/bin/clang++{{.EXE}} CGO_CFLAGS=-target armv7a-none-linux-androideabi --sysroot /NDK/platforms/android-15/arch-arm -gcc-toolchain /NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/{{.GOOS}}-{{.NDKARCH}} -I$GOMOBILE/include CGO_CPPFLAGS=-target armv7a-none-linux-androideabi --sysroot /NDK/platforms/android-15/arch-arm -gcc-toolchain /NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/{{.GOOS}}-{{.NDKARCH}} -I$GOMOBILE/include CGO_LDFLAGS=-target armv7a-none-linux-androideabi --sysroot /NDK/platforms/android-15/arch-arm -gcc-toolchain /NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/{{.GOOS}}-{{.NDKARCH}} -L/NDK/platforms/android-15/arch-arm/usr/lib -L$GOMOBILE/lib/arm CGO_ENABLED=1 GOARM=7 GOPATH=$WORK/gen:$GOPATH go install -pkgdir=$GOMOBILE/pkg_android_arm -x golang.org/x/mobile/asset
+GOOS=android GOARCH=arm CC=/NDK/toolchains/llvm/prebuilt/{{.GOOS}}-{{.NDKARCH}}/bin/clang{{.EXE}} CXX=/NDK/toolchains/llvm/prebuilt/{{.GOOS}}-{{.NDKARCH}}/bin/clang++{{.EXE}} CGO_CFLAGS=-target armv7a-none-linux-androideabi --sysroot /NDK/platforms/android-15/arch-arm -gcc-toolchain /NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/{{.GOOS}}-{{.NDKARCH}} -I$GOMOBILE/include CGO_CPPFLAGS=-target armv7a-none-linux-androideabi --sysroot /NDK/platforms/android-15/arch-arm -gcc-toolchain /NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/{{.GOOS}}-{{.NDKARCH}} -I$GOMOBILE/include CGO_LDFLAGS=-target armv7a-none-linux-androideabi --sysroot /NDK/platforms/android-15/arch-arm -gcc-toolchain /NDK/toolchains/arm-linux-androideabi-4.9/prebuilt/{{.GOOS}}-{{.NDKARCH}} -L/NDK/platforms/android-15/arch-arm/usr/lib -L$GOMOBILE/lib/arm CGO_ENABLED=1 GOARM=7 GOPATH=$WORK/gen:$GOPATH go install -pkgdir=$GOMOBILE/pkg_android_arm -x -gcflags=-shared -ldflags=-shared golang.org/x/mobile/asset
 rm -r -f "$WORK/fakegopath"
 mkdir -p $WORK/fakegopath/pkg
 cp $GOMOBILE/pkg_android_arm/golang.org/x/mobile/asset.a $WORK/fakegopath/pkg/android_arm/golang.org/x/mobile/asset.a
diff --git a/cmd/gomobile/build.go b/cmd/gomobile/build.go
index c1e9957..423da7f 100644
--- a/cmd/gomobile/build.go
+++ b/cmd/gomobile/build.go
@@ -330,11 +330,7 @@
 	case "ios":
 		supported = []string{"arm", "arm64", "amd64"}
 	case "android":
-		for arch, tc := range ndk {
-			if tc.minGoVer <= goVersion {
-				supported = append(supported, arch)
-			}
-		}
+		supported = []string{"arm", "arm64", "386", "amd64"}
 	}
 
 	isSupported := func(arch string) bool {
diff --git a/cmd/gomobile/build_test.go b/cmd/gomobile/build_test.go
index 569441e..1257c6a 100644
--- a/cmd/gomobile/build_test.go
+++ b/cmd/gomobile/build_test.go
@@ -75,7 +75,7 @@
 	buildN = true
 	buildX = true
 	buildO = "basic.apk"
-	buildTarget = "android"
+	buildTarget = "android/arm"
 	ndkRoot = "/NDK"
 	gopath = filepath.ToSlash(filepath.SplitList(os.Getenv("GOPATH"))[0])
 	if goos == "windows" {
@@ -105,7 +105,7 @@
 `))
 
 func TestParseBuildTargetFlag(t *testing.T) {
-	androidArchs := "arm"
+	androidArchs := "arm,arm64,386,amd64"
 	iosArchs := "arm,arm64,amd64"
 
 	tests := []struct {
diff --git a/cmd/gomobile/env.go b/cmd/gomobile/env.go
index e96848b..bda72ec 100644
--- a/cmd/gomobile/env.go
+++ b/cmd/gomobile/env.go
@@ -116,10 +116,6 @@
 	if ndkRoot != "" {
 		androidEnv = make(map[string][]string)
 		for arch, toolchain := range ndk {
-			if goVersion < toolchain.minGoVer {
-				continue
-			}
-
 			// Emulate the flags in the clang wrapper scripts generated
 			// by make_standalone_toolchain.py
 			s := strings.SplitN(toolchain.toolPrefix, "-", 3)
@@ -313,7 +309,6 @@
 	platform   string
 	gcc        string
 	toolPrefix string
-	minGoVer   goToolVersion
 }
 
 func (tc *ndkToolchain) Path(toolName string) string {
@@ -337,7 +332,7 @@
 
 func (nc ndkConfig) Toolchain(arch string) ndkToolchain {
 	tc, ok := nc[arch]
-	if !ok || tc.minGoVer > goVersion {
+	if !ok {
 		panic(`unsupported architecture: ` + arch)
 	}
 	return tc
@@ -350,7 +345,6 @@
 		platform:   "android-15",
 		gcc:        "arm-linux-androideabi-4.9",
 		toolPrefix: "arm-linux-androideabi",
-		minGoVer:   go1_5,
 	},
 	"arm64": {
 		arch:       "arm64",
@@ -358,7 +352,6 @@
 		platform:   "android-21",
 		gcc:        "aarch64-linux-android-4.9",
 		toolPrefix: "aarch64-linux-android",
-		minGoVer:   go1_6,
 	},
 
 	"386": {
@@ -367,7 +360,6 @@
 		platform:   "android-15",
 		gcc:        "x86-4.9",
 		toolPrefix: "i686-linux-android",
-		minGoVer:   go1_6,
 	},
 	"amd64": {
 		arch:       "x86_64",
@@ -375,7 +367,6 @@
 		platform:   "android-21",
 		gcc:        "x86_64-4.9",
 		toolPrefix: "x86_64-linux-android",
-		minGoVer:   go1_6,
 	},
 }
 
diff --git a/cmd/gomobile/init.go b/cmd/gomobile/init.go
index 120a9bb..4452c37 100644
--- a/cmd/gomobile/init.go
+++ b/cmd/gomobile/init.go
@@ -158,13 +158,11 @@
 
 	// Install standard libraries for cross compilers.
 	start := time.Now()
-	var androidArgs []string
-	if goVersion == go1_6 {
-		// Ideally this would be -buildmode=c-shared.
-		// https://golang.org/issue/13234.
-		androidArgs = []string{"-gcflags=-shared", "-ldflags=-shared"}
-	}
-	for _, env := range androidEnv {
+	// Ideally this would be -buildmode=c-shared.
+	// https://golang.org/issue/13234.
+	androidArgs := []string{"-gcflags=-shared", "-ldflags=-shared"}
+	for _, arch := range archs {
+		env := androidEnv[arch]
 		if err := installStd(env, androidArgs...); err != nil {
 			return err
 		}
diff --git a/cmd/gomobile/init_test.go b/cmd/gomobile/init_test.go
index 43384ce..eb8221e 100644
--- a/cmd/gomobile/init_test.go
+++ b/cmd/gomobile/init_test.go
@@ -106,7 +106,10 @@
 go install -x golang.org/x/mobile/gl
 go install -x golang.org/x/mobile/app
 go install -x golang.org/x/mobile/exp/app/debug{{end}}
-GOOS=android GOARCH=arm CC=$NDK_PATH/toolchains/llvm/prebuilt/{{.GOOS}}-{{.NDKARCH}}/bin/clang{{.EXE}} CXX=$NDK_PATH/toolchains/llvm/prebuilt/{{.GOOS}}-{{.NDKARCH}}/bin/clang++{{.EXE}} CGO_CFLAGS=-target armv7a-none-linux-androideabi --sysroot $NDK_PATH/platforms/android-15/arch-arm -gcc-toolchain $NDK_PATH/toolchains/arm-linux-androideabi-4.9/prebuilt/{{.GOOS}}-{{.NDKARCH}} -I$GOMOBILE/include CGO_CPPFLAGS=-target armv7a-none-linux-androideabi --sysroot $NDK_PATH/platforms/android-15/arch-arm -gcc-toolchain $NDK_PATH/toolchains/arm-linux-androideabi-4.9/prebuilt/{{.GOOS}}-{{.NDKARCH}} -I$GOMOBILE/include CGO_LDFLAGS=-target armv7a-none-linux-androideabi --sysroot $NDK_PATH/platforms/android-15/arch-arm -gcc-toolchain $NDK_PATH/toolchains/arm-linux-androideabi-4.9/prebuilt/{{.GOOS}}-{{.NDKARCH}} -L$NDK_PATH/platforms/android-15/arch-arm/usr/lib -L$GOMOBILE/lib/arm CGO_ENABLED=1 GOARM=7 go install -pkgdir=$GOMOBILE/pkg_android_arm -x std
+GOOS=android GOARCH=arm CC=$NDK_PATH/toolchains/llvm/prebuilt/{{.GOOS}}-{{.NDKARCH}}/bin/clang{{.EXE}} CXX=$NDK_PATH/toolchains/llvm/prebuilt/{{.GOOS}}-{{.NDKARCH}}/bin/clang++{{.EXE}} CGO_CFLAGS=-target armv7a-none-linux-androideabi --sysroot $NDK_PATH/platforms/android-15/arch-arm -gcc-toolchain $NDK_PATH/toolchains/arm-linux-androideabi-4.9/prebuilt/{{.GOOS}}-{{.NDKARCH}} -I$GOMOBILE/include CGO_CPPFLAGS=-target armv7a-none-linux-androideabi --sysroot $NDK_PATH/platforms/android-15/arch-arm -gcc-toolchain $NDK_PATH/toolchains/arm-linux-androideabi-4.9/prebuilt/{{.GOOS}}-{{.NDKARCH}} -I$GOMOBILE/include CGO_LDFLAGS=-target armv7a-none-linux-androideabi --sysroot $NDK_PATH/platforms/android-15/arch-arm -gcc-toolchain $NDK_PATH/toolchains/arm-linux-androideabi-4.9/prebuilt/{{.GOOS}}-{{.NDKARCH}} -L$NDK_PATH/platforms/android-15/arch-arm/usr/lib -L$GOMOBILE/lib/arm CGO_ENABLED=1 GOARM=7 go install -gcflags=-shared -ldflags=-shared -pkgdir=$GOMOBILE/pkg_android_arm -x std
+GOOS=android GOARCH=arm64 CC=$NDK_PATH/toolchains/llvm/prebuilt/{{.GOOS}}-{{.NDKARCH}}/bin/clang{{.EXE}} CXX=$NDK_PATH/toolchains/llvm/prebuilt/{{.GOOS}}-{{.NDKARCH}}/bin/clang++{{.EXE}} CGO_CFLAGS=-target aarch64-none-linux-android --sysroot $NDK_PATH/platforms/android-21/arch-arm64 -gcc-toolchain $NDK_PATH/toolchains/aarch64-linux-android-4.9/prebuilt/{{.GOOS}}-{{.NDKARCH}} -I$GOMOBILE/include CGO_CPPFLAGS=-target aarch64-none-linux-android --sysroot $NDK_PATH/platforms/android-21/arch-arm64 -gcc-toolchain $NDK_PATH/toolchains/aarch64-linux-android-4.9/prebuilt/{{.GOOS}}-{{.NDKARCH}} -I$GOMOBILE/include CGO_LDFLAGS=-target aarch64-none-linux-android --sysroot $NDK_PATH/platforms/android-21/arch-arm64 -gcc-toolchain $NDK_PATH/toolchains/aarch64-linux-android-4.9/prebuilt/{{.GOOS}}-{{.NDKARCH}} -L$NDK_PATH/platforms/android-21/arch-arm64/usr/lib -L$GOMOBILE/lib/arm64 CGO_ENABLED=1 go install -gcflags=-shared -ldflags=-shared -pkgdir=$GOMOBILE/pkg_android_arm64 -x std
+GOOS=android GOARCH=386 CC=$NDK_PATH/toolchains/llvm/prebuilt/{{.GOOS}}-{{.NDKARCH}}/bin/clang{{.EXE}} CXX=$NDK_PATH/toolchains/llvm/prebuilt/{{.GOOS}}-{{.NDKARCH}}/bin/clang++{{.EXE}} CGO_CFLAGS=-target i686-none-linux-android --sysroot $NDK_PATH/platforms/android-15/arch-x86 -gcc-toolchain $NDK_PATH/toolchains/x86-4.9/prebuilt/{{.GOOS}}-{{.NDKARCH}} -I$GOMOBILE/include CGO_CPPFLAGS=-target i686-none-linux-android --sysroot $NDK_PATH/platforms/android-15/arch-x86 -gcc-toolchain $NDK_PATH/toolchains/x86-4.9/prebuilt/{{.GOOS}}-{{.NDKARCH}} -I$GOMOBILE/include CGO_LDFLAGS=-target i686-none-linux-android --sysroot $NDK_PATH/platforms/android-15/arch-x86 -gcc-toolchain $NDK_PATH/toolchains/x86-4.9/prebuilt/{{.GOOS}}-{{.NDKARCH}} -L$NDK_PATH/platforms/android-15/arch-x86/usr/lib -L$GOMOBILE/lib/386 CGO_ENABLED=1 go install -gcflags=-shared -ldflags=-shared -pkgdir=$GOMOBILE/pkg_android_386 -x std
+GOOS=android GOARCH=amd64 CC=$NDK_PATH/toolchains/llvm/prebuilt/{{.GOOS}}-{{.NDKARCH}}/bin/clang{{.EXE}} CXX=$NDK_PATH/toolchains/llvm/prebuilt/{{.GOOS}}-{{.NDKARCH}}/bin/clang++{{.EXE}} CGO_CFLAGS=-target x86_64-none-linux-android --sysroot $NDK_PATH/platforms/android-21/arch-x86_64 -gcc-toolchain $NDK_PATH/toolchains/x86_64-4.9/prebuilt/{{.GOOS}}-{{.NDKARCH}} -I$GOMOBILE/include CGO_CPPFLAGS=-target x86_64-none-linux-android --sysroot $NDK_PATH/platforms/android-21/arch-x86_64 -gcc-toolchain $NDK_PATH/toolchains/x86_64-4.9/prebuilt/{{.GOOS}}-{{.NDKARCH}} -I$GOMOBILE/include CGO_LDFLAGS=-target x86_64-none-linux-android --sysroot $NDK_PATH/platforms/android-21/arch-x86_64 -gcc-toolchain $NDK_PATH/toolchains/x86_64-4.9/prebuilt/{{.GOOS}}-{{.NDKARCH}} -L$NDK_PATH/platforms/android-21/arch-x86_64/usr/lib -L$GOMOBILE/lib/amd64 CGO_ENABLED=1 go install -gcflags=-shared -ldflags=-shared -pkgdir=$GOMOBILE/pkg_android_amd64 -x std
 {{if eq .GOOS "darwin"}}GOOS=darwin GOARCH=arm GOARM=7 CC=clang-iphoneos CXX=clang-iphoneos CGO_CFLAGS=-isysroot=iphoneos -miphoneos-version-min=6.1 -arch armv7 CGO_LDFLAGS=-isysroot=iphoneos -miphoneos-version-min=6.1 -arch armv7 CGO_ENABLED=1 go install -pkgdir=$GOMOBILE/pkg_darwin_arm -x std
 GOOS=darwin GOARCH=arm64 CC=clang-iphoneos CXX=clang-iphoneos CGO_CFLAGS=-isysroot=iphoneos -miphoneos-version-min=6.1 -arch arm64 CGO_LDFLAGS=-isysroot=iphoneos -miphoneos-version-min=6.1 -arch arm64 CGO_ENABLED=1 go install -pkgdir=$GOMOBILE/pkg_darwin_arm64 -x std
 GOOS=darwin GOARCH=amd64 CC=clang-iphonesimulator CXX=clang-iphonesimulator CGO_CFLAGS=-isysroot=iphonesimulator -mios-simulator-version-min=6.1 -arch x86_64 CGO_LDFLAGS=-isysroot=iphonesimulator -mios-simulator-version-min=6.1 -arch x86_64 CGO_ENABLED=1 go install -tags=ios -pkgdir=$GOMOBILE/pkg_darwin_amd64 -x std
diff --git a/cmd/gomobile/main.go b/cmd/gomobile/main.go
index 4e0e184..b855a35 100644
--- a/cmd/gomobile/main.go
+++ b/cmd/gomobile/main.go
@@ -25,7 +25,6 @@
 var (
 	gomobileName = "gomobile"
 	goVersionOut = []byte(nil)
-	goVersion    = go1_5
 )
 
 func printUsage(w io.Writer) {
@@ -85,13 +84,6 @@
 	os.Exit(2)
 }
 
-type goToolVersion int
-
-const (
-	go1_5 goToolVersion = iota
-	go1_6
-)
-
 func determineGoVersion() error {
 	gobin, err := exec.LookPath("go")
 	if err != nil {
@@ -102,12 +94,10 @@
 		return fmt.Errorf("'go version' failed: %v, %s", err, goVersionOut)
 	}
 	switch {
-	case bytes.HasPrefix(goVersionOut, []byte("go version go1.4")):
-		return errors.New("Go 1.5 or newer is required")
-	case bytes.HasPrefix(goVersionOut, []byte("go version go1.5")):
-		goVersion = go1_5
-	default:
-		goVersion = go1_6 // assume developers are working at tip
+	case bytes.HasPrefix(goVersionOut, []byte("go version go1.4")),
+		bytes.HasPrefix(goVersionOut, []byte("go version go1.5")),
+		bytes.HasPrefix(goVersionOut, []byte("go version go1.6")):
+		return errors.New("Go 1.7 or newer is required")
 	}
 	return nil
 }