From 588b2b2fb0ba37c7868ab0544d66dd6d1d00f027 Mon Sep 17 00:00:00 2001 From: Hajime Hoshi Date: Sun, 19 Jul 2020 13:20:01 +0900 Subject: [PATCH] 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 Reviewed-by: Hyang-Ah Hana Kim --- cmd/gomobile/bind_test.go | 30 ++++++++++++++++++++++++++++++ cmd/gomobile/build.go | 17 +++++++++-------- cmd/gomobile/build_test.go | 13 +++++++------ cmd/gomobile/env.go | 18 ++++++++++++------ cmd/gomobile/init.go | 2 +- 5 files changed, 59 insertions(+), 21 deletions(-) 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 @@ mkdir -p {{.Output}}.framework/Versions/A/Modules 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 @@ func parseBuildTarget(buildTarget string) (os string, archs []string, _ error) { } // 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 @@ func parseBuildTarget(buildTarget string) (os string, archs []string, _ error) { 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 @@ func parseBuildTarget(buildTarget string) (os string, archs []string, _ error) { 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 @@ GOOS=android GOARCH=arm CC=$NDK_PATH/toolchains/llvm/prebuilt/{{.NDKARCH}}/bin/a `)) 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 @@ func TestParseBuildTargetFlag(t *testing.T) { 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 @@ var ( 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 @@ func envInit() (err error) { 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 @@ func installOpenAL(gomobilepath string) error { } } - for _, arch := range allArchs { + for _, arch := range allArchs("android") { t := ndk[arch] abi := t.arch if abi == "arm" {