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" {