Navigation Menu

Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

x/mobile: Unable to build xcframework with gomobile and Xcode 14 #53316

Open
darrarski opened this issue Jun 9, 2022 · 12 comments · May be fixed by golang/mobile#84
Open

x/mobile: Unable to build xcframework with gomobile and Xcode 14 #53316

darrarski opened this issue Jun 9, 2022 · 12 comments · May be fixed by golang/mobile#84
Labels
mobile Android, iOS, and x/mobile NeedsInvestigation Someone must examine and confirm this is a valid issue and not a duplicate of an existing one.
Milestone

Comments

@darrarski
Copy link

What version of Go are you using (go version)?

$ go version
go version go1.18.3 darwin/arm64

Does this issue reproduce with the latest release?

Yes

What operating system and processor architecture are you using (go env)?

go env Output
$ go env
GO111MODULE=""
GOARCH="arm64"
GOBIN=""
GOCACHE="/Users/darrarski/Library/Caches/go-build"
GOENV="/Users/darrarski/Library/Application Support/go/env"
GOEXE=""
GOEXPERIMENT=""
GOFLAGS=""
GOHOSTARCH="arm64"
GOHOSTOS="darwin"
GOINSECURE=""
GOMODCACHE="/Users/darrarski/.go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="darwin"
GOPATH="/Users/darrarski/.go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/opt/homebrew/opt/go/libexec"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/opt/homebrew/opt/go/libexec/pkg/tool/darwin_arm64"
GOVCS=""
GOVERSION="go1.18.3"
GCCGO="gccgo"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD="/Users/darrarski/Dev/repo/go.mod"
GOWORK=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -arch arm64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/bh/t75dvhh939lbvnsq6n60mgtr0000gn/T/go-build841782302=/tmp/go-build -gno-record-gcc-switches -fno-common"

What did you do?

I tried to build xcframework for iOS using Xcode 14 (14A5228q) developer tools with the following command:

$ gomobile bind -target ios gitlab.com/elixxir/client/bindings

What did you expect to see?

I expected the command to create xcframework. It works when I switch to Xcode 13.4.1 (13F100) developer tools.

What did you see instead?

When using Xcode 14 (14A5228q) developer tools, the command fails with the following error:

$ gomobile bind -target ios gitlab.com/elixxir/client/bindings
gomobile: ios/arm64: go build -buildmode=c-archive -o /var/folders/bh/t75dvhh939lbvnsq6n60mgtr0000gn/T/gomobile-work-1445876485/bindings-ios-arm64.a ./gobind failed: exit status 2
# runtime/cgo
cgo: C compiler "2022-06-09" not found: exec: "2022-06-09": executable file not found in $PATH
@gopherbot gopherbot added the mobile Android, iOS, and x/mobile label Jun 9, 2022
@gopherbot gopherbot added this to the Unreleased milestone Jun 9, 2022
@cherrymui
Copy link
Member

cherrymui commented Jun 9, 2022

cgo: C compiler "2022-06-09"

I think gomobile picks up the C compiler from running xcrun --find clang, and that command on darwin/arm64 can sometimes contains bogus logging output starting with the date and time. That probably confuses gomobile.

Could you try running that command again, maybe twice?

gomobile should probably be more resilient on that. Maybe it should only use stdout of xcrun, not stderr. cc @hyangah
@golang/ios

@cherrymui cherrymui added the NeedsInvestigation Someone must examine and confirm this is a valid issue and not a duplicate of an existing one. label Jun 9, 2022
@changkun
Copy link
Member

I plan to upgrade to Xcode 14 soon so that it may be possible for me to take a look.

@darrarski
Copy link
Author

I tried to run the command several times yesterday, but the result was always the same. I'm unfamiliar with golang, but the error message "exec: 2022-06-09 not found" seemed suspicious. I thought it could be some kind of parsing issue.

I'm not sure if the problem is caused by parsing the result of xcrun --find clang, which gives the following output:

with Xcode 13.4.1 (13F100):

$ xcrun --find clang
/Applications/Xcode-13.4.1.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang

with Xcode 14 (14A5228q):

$ xcrun --find clang
/Applications/Xcode-14.0.0-Beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang

However, I rerun the command today, and... it works! Still, I believe there is a bug hiding somewhere, as the problem was probably caused by the given date when the command was run (2022-06-09). Thankfully today (2022-06-10) it works fine :-)

@darrarski
Copy link
Author

I plan to upgrade to Xcode 14 soon so that it may be possible for me to take a look.

I'm afraid you'll need to go back in time to reproduce ;-)

@cherrymui
Copy link
Member

cherrymui commented Jun 10, 2022

On my mac M1 machine, it sometimes print messages like

2022-06-07 22:25:25.471 xcodebuild[8405:27734] Requested but did not find extension point with identifier Xcode.IDEKit.ExtensionSentinelHostApplications for extension Xcode.DebuggerFoundation.AppExtensionHosts.watchOS of plug-in com.apple.dt.IDEWatchSupportCore
2022-06-07 22:25:25.471 xcodebuild[8405:27734] Requested but did not find extension point with identifier Xcode.IDEKit.ExtensionPointIdentifierToBundleIdentifier for extension Xcode.DebuggerFoundation.AppExtensionToBundleIdentifierMap.watchOS of plug-in com.apple.dt.IDEWatchSupportCore

It doesn't always print that. In my experience it is more likely to print if it is the first time to use such commands in a while. And the second and subsequent runs just behave normally, without the extra output.

Maybe it will print if you restart the machine and run that command immediately.

@jakubgs
Copy link

jakubgs commented Sep 7, 2022

I have also experienced this issue with the following messages:

 % xcrun --find clang
2022-09-07 14:27:45.757 xcodebuild[6265:9851879] Requested but did not find extension point with identifier Xcode.IDEKit.ExtensionSentinelHostApplications for extension Xcode.DebuggerFoundation.AppExtensionHosts.watchOS of plug-in com.apple.dt.IDEWatchSupportCore
2022-09-07 14:27:45.757 xcodebuild[6265:9851879] Requested but did not find extension point with identifier Xcode.IDEKit.ExtensionPointIdentifierToBundleIdentifier for extension Xcode.DebuggerFoundation.AppExtensionToBundleIdentifierMap.watchOS of plug-in com.apple.dt.IDEWatchSupportCore
2022-09-07 14:27:45.813 xcodebuild[6265:9851879] XType: com.apple.fonts is not accessible.
2022-09-07 14:27:45.813 xcodebuild[6265:9851879] XType: XTFontStaticRegistry is enabled.
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang

These warnings appear to be included in stdout instead of stderr, and hence they affect how the path is parsed.

I have currently no idea how to fix those warnings.

A proper fix would probably involve parsing and matching all lines with a regex.

@jakubgs
Copy link

jakubgs commented Sep 7, 2022

The issue appears to be coming from envClang() function:

func envClang(sdkName string) (clang, cflags string, err error) {
	if buildN {
		return sdkName + "-clang", "-isysroot " + sdkName, nil
	}
	cmd := exec.Command("xcrun", "--sdk", sdkName, "--find", "clang")
	out, err := cmd.CombinedOutput()
	if err != nil {
		return "", "", fmt.Errorf("xcrun --find: %v\n%s", err, out)
	}
	clang = strings.TrimSpace(string(out))

https://github.com/golang/mobile/blob/8578da9835fd365e78a6e63048c103b27a53a82c/cmd/gomobile/env.go#L434-L443

Which does indeed seem to call xcrun --find clang and accepts the output from cmd.CombinedOutput() indiscriminately.

@jakubgs
Copy link

jakubgs commented Sep 7, 2022

Based on my tests this appears to only happen on the first try:

Last login: Wed Sep  7 09:14:57 2022 from 12.34.56.67
 % xcrun --find clang
2022-09-07 14:50:13.907 xcodebuild[69942:386823822] Requested but did not find extension point with identifier Xcode.IDEKit.ExtensionSentinelHostApplications for extension Xcode.DebuggerFoundation.AppExtensionHosts.watchOS of plug-in com.apple.dt.IDEWatchSupportCore
2022-09-07 14:50:13.908 xcodebuild[69942:386823822] Requested but did not find extension point with identifier Xcode.IDEKit.ExtensionPointIdentifierToBundleIdentifier for extension Xcode.DebuggerFoundation.AppExtensionToBundleIdentifierMap.watchOS of plug-in com.apple.dt.IDEWatchSupportCore
2022-09-07 14:50:14.041 xcodebuild[69942:386823822] XType: com.apple.fonts is not accessible.
2022-09-07 14:50:14.041 xcodebuild[69942:386823822] XType: XTFontStaticRegistry is enabled.
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang

 % xcrun --find clang
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang

 % xcrun --find clang
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang

 % xcrun --find clang
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang

After host reboot it resets and those log messages show up again.

@jakubgs
Copy link

jakubgs commented Sep 7, 2022

According to this discussion: https://developer.apple.com/forums/thread/703233
The fix is:

Remove CommandLineTools

sudo rm -rf /Library/Developer/CommandLineTools

Reinstall CommandLineTools

xcode-select --install

Select CommandLineTools

sudo xcode-select -s /Library/Developer/CommandLineTools

But I tried reinstalling Command Line Tools or installing newer than 13.3.1 - in my case 13.4 - and the message is still there.

Honestly some input validation could be added to envClang.

jakubgs added a commit to status-im/mobile that referenced this issue Sep 8, 2022
Currently some installations of Xcode and Command Line Tools cause
warnings about missing extensions which break parsing of paths returned
from `xcrun` that `gomobile` depends on resulting in errors like this:
```
cgo: C compiler "2022-09-07" not found: exec: "2022-09-07": executable file not found in $PATH
```
This is caused by these warnings returned on `stdout` by `xcrun`:
```
 > xcrun --find clang
2022-09-07 14:50:13.907 xcodebuild[69942:386823822] Requested but did not find extension point with identifier Xcode.IDEKit.ExtensionSentinelHostApplications for extension Xcode.DebuggerFoundation.AppExtensionHosts.watchOS of plug-in com.apple.dt.IDEWatchSupportCore
2022-09-07 14:50:13.908 xcodebuild[69942:386823822] Requested but did not find extension point with identifier Xcode.IDEKit.ExtensionPointIdentifierToBundleIdentifier for extension Xcode.DebuggerFoundation.AppExtensionToBundleIdentifierMap.watchOS of plug-in com.apple.dt.IDEWatchSupportCore
2022-09-07 14:50:14.041 xcodebuild[69942:386823822] XType: com.apple.fonts is not accessible.
2022-09-07 14:50:14.041 xcodebuild[69942:386823822] XType: XTFontStaticRegistry is enabled.
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang
```
Resulting in `gomobile` interpreting the date `2022-09-07` as Clang compiler.

Resolves: golang/go#53316

Signed-off-by: Jakub Sokołowski <jakub@status.im>
@darrarski
Copy link
Author

darrarski commented Sep 12, 2022

Small update from my side:

Not sure what changed, but now I'm able to run gomobile bind with the following configuration:

  • go version go1.17.13 darwin/arm64
  • Xcode 14.0 Build version 14A309

No more "cgo: C compiler" errors occurs when running gomobile bind. It binds successfully, however, the produced xcframework is not usable. When trying to build iOS or macOS application that uses the framework, I get this error:

Undefined symbols for architecture arm64:
  "_objc_msgSend$initWithObject:", referenced from:
      -[RefTracker assignRefnumAndIncRefcount:] in Bindings(000007.o)
  "_objc_msgSend$setObject:forKeyedSubscript:", referenced from:
      -[RefTracker assignRefnumAndIncRefcount:] in Bindings(000007.o)
  "_objc_msgSend$intValue", referenced from:
  ...

I truncated it because it just lists all functions and methods that gomobile exposes from go to Objective-C.

When creating the same xcframework with Xcode 13.4.1, everything works fine, without any issues.


UPDATE: Because the above problem is probably not related to the original one (with gomobile bing failed to run). I created a new issue for it: #55028


UPDATE: There was something messed up with my local environment. I reinstalled golang and can't reproduce the issue anymore. Sorry for the confusion.

I can now use gomobile bind without any issues on the following setup:

  • Xcode 14 (14A309)
  • go version 1.17.3 (as well as 1.19.1)
  • latest gomobile

Not sure what resolved the original issue I reported here, but I think we can now close it.

@jakubgs
Copy link

jakubgs commented Sep 12, 2022

@darrarski please do not close this, this is a valid issue I'm fixing in:

@darrarski
Copy link
Author

@darrarski please do not close this, this is a valid issue I'm fixing in:

Oh, OK, sorry for that. Will keep an eye on the progress, but like I said - it works now for me with latest Xcode and gomobile. Thanks a lot for all your precious time and effort!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
mobile Android, iOS, and x/mobile NeedsInvestigation Someone must examine and confirm this is a valid issue and not a duplicate of an existing one.
Projects
None yet
Development

Successfully merging a pull request may close this issue.

6 participants