Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

xcframework does not contain internal frameworks

I am trying to create an .xcframework file for a few third party libraries I'm using. Following the instructions from https://appspector.com/blog/xcframeworks, I

  1. Create platform-specific framework files:
# Archive for device
xcodebuild archive -scheme TestFramework -destination="iOS" -archivePath /tmp/xcf/ios.xcarchive -derivedDataPath /tmp/iphoneos -sdk iphoneos SKIP_INSTALL=NO BUILD_LIBRARIES_FOR_DISTRIBUTION=YES

# Archive for simulator
xcodebuild archive -scheme TestFramework -destination="iOS Simulator" -archivePath /tmp/xcf/iossimulator.xcarchive -derivedDataPath /tmp/iphoneos -sdk iphonesimulator SKIP_INSTALL=NO BUILD_LIBRARIES_FOR_DISTRIBUTION=YES

At this point, I've gotten two frameworks with .swiftmodule files; everything looks good. The frameworks do not come with .swiftinterface files, but I think that is alright as these are objc projects. Then, I

  1. Combine the individual frameworks to form a single xcframework file:
# Build xcframework with two archives
xcodebuild -create-xcframework -framework /tmp/xcf/ios.xcarchive/Products/Library/Frameworks/TestFramework.framework -framework /tmp/xcf/iossimulator.xcarchive/Products/Library/Frameworks/TestFramework.framework -output /tmp/xcf/TestFramework.xcframework

Here, xcodebuild doesn't fail, but it emits a curious error:

No 'swiftinterface' files found within '/Users/user/git/ReactiveObjC/output/xcf/ios.xcarchive/Products/Products/Library/TestFramework.framework/Modules/TestFramework.swiftmodule'.

Crucially, the .xcframework package does not contain the individual frameworks or folders specified in the Info.plist file. Obviously, when I try to link to the xcframework in this state, I get a bunch of "missing symbols" linker errors.

Why is this? What must I do to get xcodebuild to create the xcframework completely?

NB: Manually creating the folders seems to work for now, but this feels wrong and is brittle – Apple can change the way xcodebuild works anytime.

like image 833
casvaart Avatar asked Nov 11 '19 17:11

casvaart


People also ask

What is an XCFramework?

What is XCFramework? Apple defines XCFrameworks as a distributable binary package created by Xcode that contains variants of a framework or library so that it can be used on multiple platforms (iOS, macOS, tvOS, and watchOS), including Simulator builds.

What is Swiftinterface file?

swiftinterface , which is the compiler's representation of the public interfaces of a framework. This includes API declarations and inlineable code. The module file is used by the compiler for performing necessary tasks such as type checking and code generation when compiling client code using a framework.


Video Answer


1 Answers

Turns out that adding BUILD_LIBRARY_FOR_DISTRIBUTION = YES to the end of the xcodebuild command was not enough / not working to produce a framework with the required swiftinterface files. I had to go in the settings for the actual project and manually set BUILD_LIBRARY_FOR_DISTRIBUTION to YES, like this answer suggests. After I got the frameworks with the swiftinterface files, I was then able to create the xcframework file using xcodebuild without any problems.

like image 104
casvaart Avatar answered Dec 24 '22 17:12

casvaart