Revert "cmd/gomobile: support macOS and Catalyst"
This reverts commit 76c259c465ba39f84de7e2751a666612ddca556b.
Reason for revert: Regression. Specifying architectures doesn't work. See golang/go#47212
Change-Id: I3200316cf28535cfb48e37636bc3b9d14d13e91e
Reviewed-on: https://go-review.googlesource.com/c/mobile/+/334590
Trust: Hajime Hoshi <hajimehoshi@gmail.com>
Trust: Hyang-Ah Hana Kim <hyangah@gmail.com>
Run-TryBot: Hajime Hoshi <hajimehoshi@gmail.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: Hyang-Ah Hana Kim <hyangah@gmail.com>
diff --git a/cmd/gomobile/bind_iosapp.go b/cmd/gomobile/bind_iosapp.go
index 83d9e3f..846a63f 100644
--- a/cmd/gomobile/bind_iosapp.go
+++ b/cmd/gomobile/bind_iosapp.go
@@ -40,188 +40,146 @@
var name string
var title string
-
if buildO == "" {
name = pkgs[0].Name
title = strings.Title(name)
- buildO = title + ".xcframework"
+ buildO = title + ".framework"
} else {
- if !strings.HasSuffix(buildO, ".xcframework") {
- return fmt.Errorf("static framework name %q missing .xcframework suffix", buildO)
+ if !strings.HasSuffix(buildO, ".framework") {
+ return fmt.Errorf("static framework name %q missing .framework suffix", buildO)
}
base := filepath.Base(buildO)
- name = base[:len(base)-len(".xcframework")]
+ name = base[:len(base)-len(".framework")]
title = strings.Title(name)
}
- if err := removeAll(buildO); err != nil {
- return err
+ fileBases := make([]string, len(pkgs)+1)
+ for i, pkg := range pkgs {
+ fileBases[i] = bindPrefix + strings.Title(pkg.Name)
}
+ fileBases[len(fileBases)-1] = "Universe"
+
+ cmd = exec.Command("xcrun", "lipo", "-create")
modulesUsed, err := areGoModulesUsed()
if err != nil {
return err
}
- // create separate framework for ios,simulator and catalyst
- // every target has at least one arch (arm64 and x86_64)
- var frameworkDirs []string
- for _, target := range iOSTargets {
- frameworkDir := filepath.Join(tmpdir, target, title+".framework")
- frameworkDirs = append(frameworkDirs, frameworkDir)
+ for _, arch := range archs {
+ if err := writeGoMod("darwin", arch); err != nil {
+ return err
+ }
- for index, arch := range iOSTargetArchs(target) {
- fileBases := make([]string, len(pkgs)+1)
- for i, pkg := range pkgs {
- fileBases[i] = bindPrefix + strings.Title(pkg.Name)
- }
- fileBases[len(fileBases)-1] = "Universe"
+ env := darwinEnv[arch]
+ // Add the generated packages to GOPATH for reverse bindings.
+ gopath := fmt.Sprintf("GOPATH=%s%c%s", tmpdir, filepath.ListSeparator, goEnv("GOPATH"))
+ env = append(env, gopath)
- env := darwinEnv[target+"_"+arch]
-
- if err := writeGoMod("darwin", getenv(env, "GOARCH")); err != nil {
+ // Run `go mod tidy` to force to create go.sum.
+ // Without go.sum, `go build` fails as of Go 1.16.
+ if modulesUsed {
+ if err := goModTidyAt(filepath.Join(tmpdir, "src"), env); err != nil {
return err
}
+ }
- // Add the generated packages to GOPATH for reverse bindings.
- gopath := fmt.Sprintf("GOPATH=%s%c%s", tmpdir, filepath.ListSeparator, goEnv("GOPATH"))
- env = append(env, gopath)
+ path, err := goIOSBindArchive(name, env, filepath.Join(tmpdir, "src"))
+ if err != nil {
+ return fmt.Errorf("darwin-%s: %v", arch, err)
+ }
+ cmd.Args = append(cmd.Args, "-arch", archClang(arch), path)
+ }
- // Run `go mod tidy` to force to create go.sum.
- // Without go.sum, `go build` fails as of Go 1.16.
- if modulesUsed {
- if err := goModTidyAt(filepath.Join(tmpdir, "src"), env); err != nil {
- return err
- }
- }
+ // Build static framework output directory.
+ if err := removeAll(buildO); err != nil {
+ return err
+ }
+ headers := buildO + "/Versions/A/Headers"
+ if err := mkdir(headers); err != nil {
+ return err
+ }
+ if err := symlink("A", buildO+"/Versions/Current"); err != nil {
+ return err
+ }
+ if err := symlink("Versions/Current/Headers", buildO+"/Headers"); err != nil {
+ return err
+ }
+ if err := symlink("Versions/Current/"+title, buildO+"/"+title); err != nil {
+ return err
+ }
- path, err := goIOSBindArchive(name, env, filepath.Join(tmpdir, "src"))
- if err != nil {
- return fmt.Errorf("darwin-%s: %v", arch, err)
- }
+ cmd.Args = append(cmd.Args, "-o", buildO+"/Versions/A/"+title)
+ if err := runCmd(cmd); err != nil {
+ return err
+ }
- versionsDir := filepath.Join(frameworkDir, "Versions")
- versionsADir := filepath.Join(versionsDir, "A")
- titlePath := filepath.Join(versionsADir, title)
- if index > 0 {
- // not the first static lib, attach to a fat library and skip create headers
- fatCmd := exec.Command(
- "xcrun",
- "lipo", "-create", "-output", titlePath, titlePath, path,
- )
- if err := runCmd(fatCmd); err != nil {
- return err
- }
- continue
- }
-
- versionsAHeadersDir := filepath.Join(versionsADir, "Headers")
- if err := mkdir(versionsAHeadersDir); err != nil {
- return err
- }
- if err := symlink("A", filepath.Join(versionsDir, "Current")); err != nil {
- return err
- }
- if err := symlink("Versions/Current/Headers", filepath.Join(frameworkDir, "Headers")); err != nil {
- return err
- }
- if err := symlink(filepath.Join("Versions/Current", title), filepath.Join(frameworkDir, title)); err != nil {
- return err
- }
-
- lipoCmd := exec.Command(
- "xcrun",
- "lipo", "-create", "-arch", archClang(arch), path, "-o", titlePath,
- )
- if err := runCmd(lipoCmd); err != nil {
- return err
- }
-
- // Copy header file next to output archive.
- var headerFiles []string
- if len(fileBases) == 1 {
- headerFiles = append(headerFiles, title+".h")
- err := copyFile(
- filepath.Join(versionsAHeadersDir, title+".h"),
- filepath.Join(srcDir, bindPrefix+title+".objc.h"),
- )
- if err != nil {
- return err
- }
- } else {
- for _, fileBase := range fileBases {
- headerFiles = append(headerFiles, fileBase+".objc.h")
- err := copyFile(
- filepath.Join(versionsAHeadersDir, fileBase+".objc.h"),
- filepath.Join(srcDir, fileBase+".objc.h"),
- )
- if err != nil {
- return err
- }
- }
- err := copyFile(
- filepath.Join(versionsAHeadersDir, "ref.h"),
- filepath.Join(srcDir, "ref.h"),
- )
- if err != nil {
- return err
- }
- headerFiles = append(headerFiles, title+".h")
- err = writeFile(filepath.Join(versionsAHeadersDir, title+".h"), func(w io.Writer) error {
- return iosBindHeaderTmpl.Execute(w, map[string]interface{}{
- "pkgs": pkgs, "title": title, "bases": fileBases,
- })
- })
- if err != nil {
- return err
- }
- }
-
- if err := mkdir(filepath.Join(versionsADir, "Resources")); err != nil {
- return err
- }
- if err := symlink("Versions/Current/Resources", filepath.Join(frameworkDir, "Resources")); err != nil {
- return err
- }
- err = writeFile(filepath.Join(frameworkDir, "Resources", "Info.plist"), func(w io.Writer) error {
- _, err := w.Write([]byte(iosBindInfoPlist))
- return err
- })
- if err != nil {
- return err
- }
-
- var mmVals = struct {
- Module string
- Headers []string
- }{
- Module: title,
- Headers: headerFiles,
- }
- err = writeFile(filepath.Join(versionsADir, "Modules", "module.modulemap"), func(w io.Writer) error {
- return iosModuleMapTmpl.Execute(w, mmVals)
- })
- if err != nil {
- return err
- }
- err = symlink(filepath.Join("Versions/Current/Modules"), filepath.Join(frameworkDir, "Modules"))
+ // Copy header file next to output archive.
+ headerFiles := make([]string, len(fileBases))
+ if len(fileBases) == 1 {
+ headerFiles[0] = title + ".h"
+ err := copyFile(
+ headers+"/"+title+".h",
+ srcDir+"/"+bindPrefix+title+".objc.h",
+ )
+ if err != nil {
+ return err
+ }
+ } else {
+ for i, fileBase := range fileBases {
+ headerFiles[i] = fileBase + ".objc.h"
+ err := copyFile(
+ headers+"/"+fileBase+".objc.h",
+ srcDir+"/"+fileBase+".objc.h")
if err != nil {
return err
}
}
+ err := copyFile(
+ headers+"/ref.h",
+ srcDir+"/ref.h")
+ if err != nil {
+ return err
+ }
+ headerFiles = append(headerFiles, title+".h")
+ err = writeFile(headers+"/"+title+".h", func(w io.Writer) error {
+ return iosBindHeaderTmpl.Execute(w, map[string]interface{}{
+ "pkgs": pkgs, "title": title, "bases": fileBases,
+ })
+ })
+ if err != nil {
+ return err
+ }
}
- // Finally combine all frameworks to an XCFramework
- xcframeworkArgs := []string{"-create-xcframework"}
-
- for _, dir := range frameworkDirs {
- xcframeworkArgs = append(xcframeworkArgs, "-framework", dir)
+ resources := buildO + "/Versions/A/Resources"
+ if err := mkdir(resources); err != nil {
+ return err
+ }
+ if err := symlink("Versions/Current/Resources", buildO+"/Resources"); err != nil {
+ return err
+ }
+ if err := writeFile(buildO+"/Resources/Info.plist", func(w io.Writer) error {
+ _, err := w.Write([]byte(iosBindInfoPlist))
+ return err
+ }); err != nil {
+ return err
}
- xcframeworkArgs = append(xcframeworkArgs, "-output", buildO)
- cmd = exec.Command("xcodebuild", xcframeworkArgs...)
- err = runCmd(cmd)
- return err
+ var mmVals = struct {
+ Module string
+ Headers []string
+ }{
+ Module: title,
+ Headers: headerFiles,
+ }
+ err = writeFile(buildO+"/Versions/A/Modules/module.modulemap", func(w io.Writer) error {
+ return iosModuleMapTmpl.Execute(w, mmVals)
+ })
+ if err != nil {
+ return err
+ }
+ return symlink("Versions/Current/Modules", buildO+"/Modules")
}
const iosBindInfoPlist = `<?xml version="1.0" encoding="UTF-8"?>
diff --git a/cmd/gomobile/bind_test.go b/cmd/gomobile/bind_test.go
index fed8142..9a5ffa8 100644
--- a/cmd/gomobile/bind_test.go
+++ b/cmd/gomobile/bind_test.go
@@ -112,7 +112,7 @@
}()
buildN = true
buildX = true
- buildO = "Asset.xcframework"
+ buildO = "Asset.framework"
buildTarget = "ios/arm64"
tests := []struct {
@@ -126,7 +126,7 @@
prefix: "Foo",
},
{
- out: "Abcde.xcframework",
+ out: "Abcde.framework",
},
}
for _, tc := range tests {
@@ -160,7 +160,7 @@
BitcodeEnabled bool
}{
outputData: output,
- Output: buildO[:len(buildO)-len(".xcframework")],
+ Output: buildO[:len(buildO)-len(".framework")],
Prefix: tc.prefix,
BitcodeEnabled: bitcodeEnabled,
}
@@ -195,28 +195,26 @@
var bindIOSTmpl = template.Must(template.New("output").Parse(`GOMOBILE={{.GOPATH}}/pkg/gomobile
WORK=$WORK
GOOS=darwin CGO_ENABLED=1 gobind -lang=go,objc -outdir=$WORK -tags=ios{{if .Prefix}} -prefix={{.Prefix}}{{end}} golang.org/x/mobile/asset
-rm -r -f "{{.Output}}.xcframework"
mkdir -p $WORK/src
PWD=$WORK/src GOOS=darwin GOARCH=arm64 CC=iphoneos-clang CXX=iphoneos-clang++ CGO_CFLAGS=-isysroot=iphoneos -miphoneos-version-min=7.0 {{if .BitcodeEnabled}}-fembed-bitcode {{end}}-arch arm64 CGO_CXXFLAGS=-isysroot=iphoneos -miphoneos-version-min=7.0 {{if .BitcodeEnabled}}-fembed-bitcode {{end}}-arch arm64 CGO_LDFLAGS=-isysroot=iphoneos -miphoneos-version-min=7.0 {{if .BitcodeEnabled}}-fembed-bitcode {{end}}-arch arm64 CGO_ENABLED=1 GOPATH=$WORK:$GOPATH go build -tags ios -x -buildmode=c-archive -o $WORK/{{.Output}}-arm64.a ./gobind
-mkdir -p $WORK/arm64/{{.Output}}.framework/Versions/A/Headers
-ln -s A $WORK/arm64/{{.Output}}.framework/Versions/Current
-ln -s Versions/Current/Headers $WORK/arm64/{{.Output}}.framework/Headers
-ln -s Versions/Current/{{.Output}} $WORK/arm64/{{.Output}}.framework/{{.Output}}
-xcrun lipo -create -arch arm64 $WORK/{{.Output}}-arm64.a -o $WORK/arm64/{{.Output}}.framework/Versions/A/{{.Output}}
-cp $WORK/src/gobind/{{.Prefix}}Asset.objc.h $WORK/arm64/{{.Output}}.framework/Versions/A/Headers/{{.Prefix}}Asset.objc.h
-mkdir -p $WORK/arm64/{{.Output}}.framework/Versions/A/Headers
-cp $WORK/src/gobind/Universe.objc.h $WORK/arm64/{{.Output}}.framework/Versions/A/Headers/Universe.objc.h
-mkdir -p $WORK/arm64/{{.Output}}.framework/Versions/A/Headers
-cp $WORK/src/gobind/ref.h $WORK/arm64/{{.Output}}.framework/Versions/A/Headers/ref.h
-mkdir -p $WORK/arm64/{{.Output}}.framework/Versions/A/Headers
-mkdir -p $WORK/arm64/{{.Output}}.framework/Versions/A/Headers
-mkdir -p $WORK/arm64/{{.Output}}.framework/Versions/A/Resources
-ln -s Versions/Current/Resources $WORK/arm64/{{.Output}}.framework/Resources
-mkdir -p $WORK/arm64/{{.Output}}.framework/Resources
-mkdir -p $WORK/arm64/{{.Output}}.framework/Versions/A/Modules
-ln -s Versions/Current/Modules $WORK/arm64/{{.Output}}.framework/Modules
-xcrun lipo $WORK/arm64/{{.Output}}.framework/Versions/A/{{.Output}} -thin arm64 -output $WORK/arm64/{{.Output}}.framework/Versions/A/{{.Output}}
-xcodebuild -create-xcframework -framework $WORK/arm64/{{.Output}}.framework -framework $WORK/amd64/{{.Output}}.framework -framework $WORK/catalyst/{{.Output}}.framework -output {{.Output}}.xcframework
+rm -r -f "{{.Output}}.framework"
+mkdir -p {{.Output}}.framework/Versions/A/Headers
+ln -s A {{.Output}}.framework/Versions/Current
+ln -s Versions/Current/Headers {{.Output}}.framework/Headers
+ln -s Versions/Current/{{.Output}} {{.Output}}.framework/{{.Output}}
+xcrun lipo -create -arch arm64 $WORK/{{.Output}}-arm64.a -o {{.Output}}.framework/Versions/A/{{.Output}}
+cp $WORK/src/gobind/{{.Prefix}}Asset.objc.h {{.Output}}.framework/Versions/A/Headers/{{.Prefix}}Asset.objc.h
+mkdir -p {{.Output}}.framework/Versions/A/Headers
+cp $WORK/src/gobind/Universe.objc.h {{.Output}}.framework/Versions/A/Headers/Universe.objc.h
+mkdir -p {{.Output}}.framework/Versions/A/Headers
+cp $WORK/src/gobind/ref.h {{.Output}}.framework/Versions/A/Headers/ref.h
+mkdir -p {{.Output}}.framework/Versions/A/Headers
+mkdir -p {{.Output}}.framework/Versions/A/Headers
+mkdir -p {{.Output}}.framework/Versions/A/Resources
+ln -s Versions/Current/Resources {{.Output}}.framework/Resources
+mkdir -p {{.Output}}.framework/Resources
+mkdir -p {{.Output}}.framework/Versions/A/Modules
+ln -s Versions/Current/Modules {{.Output}}.framework/Modules
`))
func TestBindIOSAll(t *testing.T) {
@@ -233,7 +231,7 @@
}()
buildN = true
buildX = true
- buildO = "Asset.xcframework"
+ buildO = "Asset.framework"
buildTarget = "ios"
buf := new(bytes.Buffer)
@@ -293,7 +291,7 @@
case "android":
out = filepath.Join(dir, "cgopkg.aar")
case "ios":
- out = filepath.Join(dir, "Cgopkg.xcframework")
+ out = filepath.Join(dir, "Cgopkg.framework")
}
tests := []struct {
diff --git a/cmd/gomobile/env.go b/cmd/gomobile/env.go
index b342f3e..6dacc63 100644
--- a/cmd/gomobile/env.go
+++ b/cmd/gomobile/env.go
@@ -36,27 +36,6 @@
}
}
-// iOSTargets lists Apple platforms as individual sub-targets.
-// The gomobile "ios" target actually builds for multiple Apple platforms:
-// iOS, iPadOS, MacCatalyst (iOS on macOS), and macOS.
-// TODO: support watchOS and tvOS?
-var iOSTargets = []string{"simulator", "ios", "catalyst", "macos"}
-
-func iOSTargetArchs(target string) []string {
- switch target {
- case "simulator":
- return []string{"arm64", "amd64"}
- case "ios":
- return []string{"arm64"}
- case "catalyst":
- return []string{"arm64", "amd64"}
- case "macos":
- return []string{"arm64", "amd64"}
- default:
- panic(fmt.Sprintf("unexpected iOS target: %s", target))
- }
-}
-
func buildEnvInit() (cleanup func(), err error) {
// Find gomobilepath.
gopath := goEnv("GOPATH")
@@ -162,52 +141,38 @@
darwinArmNM = "nm"
darwinEnv = make(map[string][]string)
- for _, target := range iOSTargets {
- for _, arch := range iOSTargetArchs(target) {
- var env []string
- var err error
- var clang, cflags string
- switch target {
- case "ios":
- clang, cflags, err = envClang("iphoneos")
- cflags += " -miphoneos-version-min=" + buildIOSVersion
- case "simulator":
- clang, cflags, err = envClang("iphonesimulator")
- cflags += " -mios-simulator-version-min=" + buildIOSVersion
- case "catalyst":
- clang, cflags, err = envClang("macosx")
- switch arch {
- case "amd64":
- cflags += " -target x86_64-apple-ios13.0-macabi"
- case "arm64":
- cflags += " -target arm64-apple-ios13.0-macabi"
- }
- case "macos":
- // Note: the SDK is called "macosx", not "macos"
- clang, cflags, err = envClang("macosx")
- default:
- panic(fmt.Errorf("unknown ios target: %q", arch))
- }
-
- if err != nil {
- return err
- }
-
- if bitcodeEnabled {
- cflags += " -fembed-bitcode"
- }
- env = append(env,
- "GOOS=darwin",
- "GOARCH="+arch,
- "CC="+clang,
- "CXX="+clang+"++",
- "CGO_CFLAGS="+cflags+" -arch "+archClang(arch),
- "CGO_CXXFLAGS="+cflags+" -arch "+archClang(arch),
- "CGO_LDFLAGS="+cflags+" -arch "+archClang(arch),
- "CGO_ENABLED=1",
- )
- darwinEnv[target+"_"+arch] = env
+ for _, arch := range allArchs("ios") {
+ var env []string
+ var err error
+ var clang, cflags string
+ switch arch {
+ case "arm64":
+ clang, cflags, err = envClang("iphoneos")
+ cflags += " -miphoneos-version-min=" + buildIOSVersion
+ case "amd64":
+ clang, cflags, err = envClang("iphonesimulator")
+ cflags += " -mios-simulator-version-min=" + buildIOSVersion
+ default:
+ panic(fmt.Errorf("unknown GOARCH: %q", arch))
}
+ if err != nil {
+ return err
+ }
+
+ if bitcodeEnabled {
+ cflags += " -fembed-bitcode"
+ }
+ env = append(env,
+ "GOOS=darwin",
+ "GOARCH="+arch,
+ "CC="+clang,
+ "CXX="+clang+"++",
+ "CGO_CFLAGS="+cflags+" -arch "+archClang(arch),
+ "CGO_CXXFLAGS="+cflags+" -arch "+archClang(arch),
+ "CGO_LDFLAGS="+cflags+" -arch "+archClang(arch),
+ "CGO_ENABLED=1",
+ )
+ darwinEnv[arch] = env
}
return nil