cmd/gomobile: fix the error when specifying -target=ios with Go 1.15

Go 1.15 no longer supports darwin/arm. This CL fixes by replacing
'allArchs' variable with a function taking a target OS, and excludes
'arm' when the target OS is iOS.

Updates golang/go#39575

Change-Id: I0623ed4cda2c679d2762fd80a7919f24dd5ce016
Reviewed-on: https://go-review.googlesource.com/c/mobile/+/243477
Run-TryBot: Hajime Hoshi <hajimehoshi@gmail.com>
Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com>
diff --git a/cmd/gomobile/bind_test.go b/cmd/gomobile/bind_test.go
index 5be807a..b0dedb9 100644
--- a/cmd/gomobile/bind_test.go
+++ b/cmd/gomobile/bind_test.go
@@ -216,6 +216,36 @@
 ln -s Versions/Current/Modules {{.Output}}.framework/Modules
 `))
 
+func TestBindIOSAll(t *testing.T) {
+	if !xcodeAvailable() {
+		t.Skip("Xcode is missing")
+	}
+	defer func() {
+		xout = os.Stderr
+		buildN = false
+		buildX = false
+		buildO = ""
+		buildTarget = ""
+		bindPrefix = ""
+	}()
+	buildN = true
+	buildX = true
+	buildO = "Asset.framework"
+	buildTarget = "ios"
+
+	buf := new(bytes.Buffer)
+	xout = buf
+	gopath = filepath.SplitList(goEnv("GOPATH"))[0]
+	if goos == "windows" {
+		os.Setenv("HOMEDRIVE", "C:")
+	}
+	cmdBind.flag.Parse([]string{"golang.org/x/mobile/asset"})
+	if err := runBind(cmdBind); err != nil {
+		t.Log(buf.String())
+		t.Fatal(err)
+	}
+}
+
 func TestBindWithGoModules(t *testing.T) {
 	if runtime.GOOS == "android" {
 		t.Skipf("gomobile and gobind are not available on %s", runtime.GOOS)
diff --git a/cmd/gomobile/build.go b/cmd/gomobile/build.go
index bbb2dfb..4811ab7 100644
--- a/cmd/gomobile/build.go
+++ b/cmd/gomobile/build.go
@@ -358,8 +358,8 @@
 	}
 
 	// verify all archs are supported one while deduping.
-	isSupported := func(arch string) bool {
-		for _, a := range allArchs {
+	isSupported := func(os, arch string) bool {
+		for _, a := range allArchs(os) {
 			if a == arch {
 				return true
 			}
@@ -367,12 +367,17 @@
 		return false
 	}
 
+	targetOS := os
+	if os == "ios" {
+		targetOS = "darwin"
+	}
+
 	seen := map[string]bool{}
 	for _, arch := range archNames {
 		if _, ok := seen[arch]; ok {
 			continue
 		}
-		if !isSupported(arch) {
+		if !isSupported(os, arch) {
 			return "", nil, fmt.Errorf(`unsupported arch: %q`, arch)
 		}
 
@@ -380,12 +385,8 @@
 		archs = append(archs, arch)
 	}
 
-	targetOS := os
-	if os == "ios" {
-		targetOS = "darwin"
-	}
 	if all {
-		return targetOS, allArchs, nil
+		return targetOS, allArchs(os), nil
 	}
 	return targetOS, archs, nil
 }
diff --git a/cmd/gomobile/build_test.go b/cmd/gomobile/build_test.go
index 9d3fdcd..501175c 100644
--- a/cmd/gomobile/build_test.go
+++ b/cmd/gomobile/build_test.go
@@ -115,7 +115,8 @@
 `))
 
 func TestParseBuildTargetFlag(t *testing.T) {
-	archs := strings.Join(allArchs, ",")
+	androidArchs := strings.Join(allArchs("android"), ",")
+	iosArchs := strings.Join(allArchs("ios"), ",")
 
 	tests := []struct {
 		in        string
@@ -123,13 +124,13 @@
 		wantOS    string
 		wantArchs string
 	}{
-		{"android", false, "android", archs},
-		{"android,android/arm", false, "android", archs},
+		{"android", false, "android", androidArchs},
+		{"android,android/arm", false, "android", androidArchs},
 		{"android/arm", false, "android", "arm"},
 
-		{"ios", false, "darwin", archs},
-		{"ios,ios/arm", false, "darwin", archs},
-		{"ios/arm", false, "darwin", "arm"},
+		{"ios", false, "darwin", iosArchs},
+		{"ios,ios/arm64", false, "darwin", iosArchs},
+		{"ios/arm64", false, "darwin", "arm64"},
 		{"ios/amd64", false, "darwin", "amd64"},
 
 		{"", true, "", ""},
diff --git a/cmd/gomobile/env.go b/cmd/gomobile/env.go
index 868c114..c9484ff 100644
--- a/cmd/gomobile/env.go
+++ b/cmd/gomobile/env.go
@@ -22,11 +22,20 @@
 	androidArmNM string
 	darwinArmNM  string
 
-	allArchs = []string{"arm", "arm64", "386", "amd64"}
-
 	bitcodeEnabled bool
 )
 
+func allArchs(targetOS string) []string {
+	switch targetOS {
+	case "ios":
+		return []string{"arm64", "386", "amd64"}
+	case "android":
+		return []string{"arm", "arm64", "386", "amd64"}
+	default:
+		panic(fmt.Sprintf("unexpected target OS: %s", targetOS))
+	}
+}
+
 func buildEnvInit() (cleanup func(), err error) {
 	// Find gomobilepath.
 	gopath := goEnv("GOPATH")
@@ -132,14 +141,11 @@
 
 	darwinArmNM = "nm"
 	darwinEnv = make(map[string][]string)
-	for _, arch := range allArchs {
+	for _, arch := range allArchs("ios") {
 		var env []string
 		var err error
 		var clang, cflags string
 		switch arch {
-		case "arm":
-			env = append(env, "GOARM=7")
-			fallthrough
 		case "arm64":
 			clang, cflags, err = envClang("iphoneos")
 			cflags += " -miphoneos-version-min=" + buildIOSVersion
diff --git a/cmd/gomobile/init.go b/cmd/gomobile/init.go
index 0ada746..00b9a56 100644
--- a/cmd/gomobile/init.go
+++ b/cmd/gomobile/init.go
@@ -167,7 +167,7 @@
 		}
 	}
 
-	for _, arch := range allArchs {
+	for _, arch := range allArchs("android") {
 		t := ndk[arch]
 		abi := t.arch
 		if abi == "arm" {