Skip to content

Instantly share code, notes, and snippets.

@Tokuriku
Forked from cromandini/universal-framework.sh
Last active September 2, 2020 10:59
Show Gist options
  • Star 15 You must be signed in to star a gist
  • Fork 8 You must be signed in to fork a gist
  • Save Tokuriku/96fe6f92e6f2abb87906 to your computer and use it in GitHub Desktop.
Save Tokuriku/96fe6f92e6f2abb87906 to your computer and use it in GitHub Desktop.
Script to put in an Aggregate Target of a Framework in Xcode 6 to create a Universal Framework
#!/bin/sh
UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal
# make sure the output directory exists
mkdir -p "${UNIVERSAL_OUTPUTFOLDER}"
# Step 1. Build Device and Simulator versions
xcodebuild -target "${PROJECT_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
xcodebuild -target "${PROJECT_NAME}" -configuration ${CONFIGURATION} -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
# Step 2. Copy the framework structure (from iphoneos build) to the universal folder
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework" "${UNIVERSAL_OUTPUTFOLDER}/"
# Step 3. Copy Swift modules (from iphonesimulator build) to the copied framework directory
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule/." "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule"
# Step 4. Create universal binary file using lipo and place the combined executable in the copied framework directory
lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework/${PROJECT_NAME}"
# Step 5. Convenience step to copy the framework to the project's directory
cp -R "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework" "${PROJECT_DIR}"
# Step 6. Convenience step to open the project's directory in Finder
open "${PROJECT_DIR}"
@Tokuriku
Copy link
Author

Hi guys,

There have been updates to Xcode and I haven't had time to retest this but..

Step 3 moves the simulator modules to the main framework folder before the lipo. You really don't want to skip this step. That said you will want to use something else than swiftmodule in
'framework/Modules/${PROJECT_NAME}.swiftmodule/'

I don't code in Objective-C so I don't know the right file format to append there but you should find it easily by going to that folder manually and looking at what the extension is for the modules..

Copy link

ghost commented Jun 27, 2019

Hi I have used the same script but still not able to run on simulator. Can any one please help

@juandavidcardona
Copy link

Thanks!!!!

@jaykumarvcx
Copy link

Hi

I am facing same issue, I have created my framework in objective-c and using same scrip above, but after creating my framework and add to my project unable to run on simulatore this error i am getting

Undefined symbols for architecture x86_64:
"OBJC_CLASS$_SomeClass", referenced from:
objc-class-ref in VCXAppDelegate.o
"OBJC_CLASS$_SomeClass", referenced from:
objc-class-ref in VCXConfrenceViewController.o
ld: symbol(s) not found for architecture x86_64

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment