Skip to content

Instantly share code, notes, and snippets.

@quangDecember
Last active December 16, 2022 17:47
Embed
What would you like to do?
Build XCFramework (universal) framework, create new Aggregate target, add to New Run Script Phase
env > env.txt
instruments -s devices > devices.txt
#! /bin/sh -e
# This script demonstrates archive and create action on frameworks and libraries
# Based on script by @author Boris Bielik
# Release dir path
OUTPUT_DIR_PATH="${PROJECT_DIR}/XCFramework"
function archivePathSimulator {
local DIR=${OUTPUT_DIR_PATH}/archives/"${1}-SIMULATOR"
echo "${DIR}"
}
function archivePathDevice {
local DIR=${OUTPUT_DIR_PATH}/archives/"${1}-DEVICE"
echo "${DIR}"
}
# Archive takes 3 params
#
# 1st == SCHEME
# 2nd == destination
# 3rd == archivePath
function archive {
echo "▸ Starts archiving the scheme: ${1} for destination: ${2};\n▸ Archive path: ${3}.xcarchive"
xcodebuild clean archive \
-project "${PROJECT_NAME}.xcodeproj" \
-scheme ${1} \
-configuration ${CONFIGURATION} \
-destination "${2}" \
-archivePath "${3}" \
SKIP_INSTALL=NO \
OBJROOT="${OBJROOT}/DependentBuilds" \
BUILD_LIBRARY_FOR_DISTRIBUTION=YES | xcpretty
}
# Builds archive for iOS simulator & device
function buildArchive {
SCHEME=${1}
archive $SCHEME "generic/platform=iOS Simulator" $(archivePathSimulator $SCHEME)
archive $SCHEME "generic/platform=iOS" $(archivePathDevice $SCHEME)
}
# Creates xc framework
function createXCFramework {
FRAMEWORK_ARCHIVE_PATH_POSTFIX=".xcarchive/Products/Library/Frameworks"
FRAMEWORK_SIMULATOR_DIR="$(archivePathSimulator $1)${FRAMEWORK_ARCHIVE_PATH_POSTFIX}"
FRAMEWORK_DEVICE_DIR="$(archivePathDevice $1)${FRAMEWORK_ARCHIVE_PATH_POSTFIX}"
xcodebuild -create-xcframework \
-framework ${FRAMEWORK_SIMULATOR_DIR}/${1}.framework \
-framework ${FRAMEWORK_DEVICE_DIR}/${1}.framework \
-output ${OUTPUT_DIR_PATH}/xcframeworks/${1}.xcframework
}
### Static Libraries cant be turned into frameworks
function createXCFrameworkForStaticLibrary {
LIBRARY_ARCHIVE_PATH_POSTFIX=".xcarchive/Products/usr/local/lib"
LIBRARY_SIMULATOR_DIR="$(archivePathSimulator $1)${LIBRARY_ARCHIVE_PATH_POSTFIX}"
LIBRARY_DEVICE_DIR="$(archivePathDevice $1)${LIBRARY_ARCHIVE_PATH_POSTFIX}"
xcodebuild -create-xcframework \
-library ${LIBRARY_SIMULATOR_DIR}/libStaticLibrary.a \
-library ${LIBRARY_DEVICE_DIR}/libStaticLibrary.a \
-output ${OUTPUT_DIR_PATH}/xcframeworks/${1}.xcframework
}
echo "#####################"
echo "▸ Cleaning the dir: ${OUTPUT_DIR_PATH}"
rm -rf $OUTPUT_DIR_PATH
#### Static Library ####
#LIBRARY="${PROJECT_NAME}"
#echo "▸ Archive $LIBRARY"
#buildArchive ${LIBRARY}
#echo "▸ Create $FRAMEWORK.xcframework"
#createXCFrameworkForStaticLibrary ${LIBRARY}
#### Dynamic Framework ####
DYNAMIC_FRAMEWORK="${PROJECT_NAME}"
echo "▸ Archive $DYNAMIC_FRAMEWORK"
buildArchive ${DYNAMIC_FRAMEWORK}
echo "▸ Create $DYNAMIC_FRAMEWORK.xcframework"
createXCFramework ${DYNAMIC_FRAMEWORK}
@tulssinep
Copy link

tulssinep commented Jul 6, 2020

Hey, is this supposed to run as an Xcode Run Script phase? If so, what Xcode version? On 11.3 it gets stuck on Using build description from memory

Sorry I think I ran it from the wrong target. Thank you for the Gist I think it is working correctly

@DineshKachhot
Copy link

It's not working with Xcode 12, can any one help?

@quangDecember
Copy link
Author

It's not working with Xcode 12, can any one help?

Hi @DineshKachhot, there is a missing part to exclude build ARCHs of Apple Silicon Mac. I don't remember the exact syntax. Maybe @dj110r and @21DerickDerick can help

@DineshKachhot
Copy link

I would like add two two steps to do before run this script, change you Build settings like follow,
Skip install - NO
Build libraries for distribution - YES

Though it is already added in the script, in my case it was not working.

@DineshKachhot
Copy link

Now I am getting following error for one of the files from my library,

..../MPUtil.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler

@AbhijitPatilSafexpay
Copy link

AbhijitPatilSafexpay commented Aug 5, 2021

invalid argument 'Project'.
When i am trying to run this build phase script

@ahmetardal
Copy link

Works great, thank you.

Xcode Version 13.4.1 (13F100)

@hitendradeveloper
Copy link

hitendradeveloper commented Dec 15, 2022

This worked perfect for me. XCode 14.1
Make sure

  1. you add aggregate target
  2. add the run script.
  3. Build the newly added target

If you add run script in existing target -- multiple failures will be occured.

  • you can see error like name.xcodeproj does not exists
  • XCode can stuck with Using build description from memory
  • XCode build process can go in recursive/infinite loop

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