Skip to content

Instantly share code, notes, and snippets.

@quangDecember
Last active June 18, 2021 09:55
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save quangDecember/9f7d65964b7df8d71c4a1cfd4f95c0ee to your computer and use it in GitHub Desktop.
Save quangDecember/9f7d65964b7df8d71c4a1cfd4f95c0ee to your computer and use it in GitHub Desktop.
Build Binary framework script for iOS, included fix for Xcode 10.2 headers, originally by DJ110
# Xcode 10.2
# please use within Xcode environment (Build Phases -> Run Script or Scheme -> Post Actions)
xcodebuild -version
UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal
# make sure the output directory exists
mkdir -p "${UNIVERSAL_OUTPUTFOLDER}"
env > env.txt
# Step 1. Build Device and Simulator versions
xcodebuild -project "${PROJECT_NAME}.xcodeproj" -target "${PROJECT_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
xcodebuild -project "${PROJECT_NAME}.xcodeproj" -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}/"
# Fix Me(This is lipo issue XCode 10.2)
# Copy each headers to temporary space
mkdir -p "${PROJECT_DIR}/tmp/Headers/simulator"
mkdir -p "${PROJECT_DIR}/tmp/Headers/device"
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/Headers/${PROJECT_NAME}-Swift.h" "${PROJECT_DIR}/tmp/Headers/simulator/${PROJECT_NAME}-Swift.h"
cp -r "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework/Headers/${PROJECT_NAME}-Swift.h" "${PROJECT_DIR}/tmp/Headers/device/${PROJECT_NAME}-Swift.h"
# Merge
touch "${PROJECT_DIR}/tmp/${PROJECT_NAME}-Swift.h"
echo "#if TARGET_OS_SIMULATOR" >> "${PROJECT_DIR}/tmp/${PROJECT_NAME}-Swift.h"
cat "${PROJECT_DIR}/tmp/Headers/simulator/${PROJECT_NAME}-Swift.h" >> "${PROJECT_DIR}/tmp/${PROJECT_NAME}-Swift.h"
echo "#else" >> "${PROJECT_DIR}/tmp/${PROJECT_NAME}-Swift.h"
cat "${PROJECT_DIR}/tmp/Headers/device/${PROJECT_NAME}-Swift.h" >> "${PROJECT_DIR}/tmp/${PROJECT_NAME}-Swift.h"
echo "#endif" >> "${PROJECT_DIR}/tmp/${PROJECT_NAME}-Swift.h"
# Step 3. Copy Swift modules from iphonesimulator build (if it exists) to the copied framework directory
SIMULATOR_SWIFT_MODULES_DIR="${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule/."
if [ -d "${SIMULATOR_SWIFT_MODULES_DIR}" ]; then
cp -R "${SIMULATOR_SWIFT_MODULES_DIR}" "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule"
fi
# 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}"
# Fix Me! Copy generated header to framework
# This is Apple lipo bug
cp -R "${PROJECT_DIR}/tmp/${PROJECT_NAME}-Swift.h" "${PROJECT_DIR}/${PROJECT_NAME}.framework/Headers/${PROJECT_NAME}-Swift.h"
# Delete temporary files
rm -rf "${PROJECT_DIR}/tmp"
# Step 6. Convenience step to open the project's directory in Finder
open "${PROJECT_DIR}"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment