Skip to content

Commit 5df0e1b

Browse files
authored
Add xcframework build support (#150)
1 parent acee382 commit 5df0e1b

File tree

2 files changed

+107
-0
lines changed

2 files changed

+107
-0
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@ DerivedData/
99
coverage.txt
1010
TODO.md
1111
.ag_template/
12+
build/

Scripts/build_xcframework.sh

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
#!/bin/bash
2+
3+
# Script modified from https://docs.emergetools.com/docs/analyzing-a-spm-framework-ios
4+
5+
set -e
6+
7+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd -P)"
8+
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
9+
10+
PROJECT_BUILD_DIR="${PROJECT_BUILD_DIR:-"${PROJECT_ROOT}/build"}"
11+
XCODEBUILD_BUILD_DIR="$PROJECT_BUILD_DIR/xcodebuild"
12+
XCODEBUILD_DERIVED_DATA_PATH="$XCODEBUILD_BUILD_DIR/DerivedData"
13+
14+
# Copy and modify modulemap
15+
mkdir -p "$PROJECT_BUILD_DIR"
16+
cat > "$PROJECT_BUILD_DIR/module.modulemap" << 'EOF'
17+
framework module OpenGraph {
18+
umbrella header "OpenGraph-umbrella.h"
19+
export *
20+
module * { export * }
21+
}
22+
EOF
23+
24+
PACKAGE_NAME=$1
25+
if [ -z "$PACKAGE_NAME" ]; then
26+
echo "No package name provided. Using the first scheme found in the Package.swift."
27+
PACKAGE_NAME=$(xcodebuild -list | awk 'schemes && NF>0 { print $1; exit } /Schemes:$/ { schemes = 1 }')
28+
echo "Using: $PACKAGE_NAME"
29+
fi
30+
31+
build_framework() {
32+
local sdk="$1"
33+
local destination="$2"
34+
local scheme="$3"
35+
36+
local XCODEBUILD_ARCHIVE_PATH="./build/$scheme-$sdk.xcarchive"
37+
38+
rm -rf "$XCODEBUILD_ARCHIVE_PATH"
39+
40+
xcodebuild archive \
41+
-scheme $scheme \
42+
-archivePath $XCODEBUILD_ARCHIVE_PATH \
43+
-derivedDataPath "$XCODEBUILD_DERIVED_DATA_PATH" \
44+
-sdk "$sdk" \
45+
-destination "$destination" \
46+
BUILD_LIBRARY_FOR_DISTRIBUTION=YES \
47+
INSTALL_PATH='Library/Frameworks' \
48+
OTHER_SWIFT_FLAGS=-no-verify-emitted-module-interface
49+
50+
if [ "$sdk" = "macosx" ]; then
51+
FRAMEWORK_MODULES_PATH="$XCODEBUILD_ARCHIVE_PATH/Products/Library/Frameworks/$scheme.framework/Versions/Current/Modules"
52+
FRAMEWORK_HEADERS_PATH="$XCODEBUILD_ARCHIVE_PATH/Products/Library/Frameworks/$scheme.framework/Versions/Current/Headers"
53+
mkdir -p "$FRAMEWORK_MODULES_PATH"
54+
mkdir -p "$FRAMEWORK_HEADERS_PATH"
55+
cp -r \
56+
"$XCODEBUILD_DERIVED_DATA_PATH/Build/Intermediates.noindex/ArchiveIntermediates/$scheme/BuildProductsPath/Release/$scheme.swiftmodule" \
57+
"$FRAMEWORK_MODULES_PATH/$scheme.swiftmodule"
58+
# Replace OpenGraphCxx with OpenGraph in swiftinterface files
59+
find "$FRAMEWORK_MODULES_PATH/$scheme.swiftmodule" -name "*.swiftinterface" -exec sed -i '' 's/OpenGraphCxx/OpenGraph/g' {} \;
60+
cp -r \
61+
"$PROJECT_ROOT/Sources/OpenGraphCxx/include/OpenGraph"/* \
62+
"$FRAMEWORK_HEADERS_PATH/" 2>/dev/null || true
63+
cp "$PROJECT_BUILD_DIR/module.modulemap" \
64+
"$FRAMEWORK_MODULES_PATH/module.modulemap" 2>/dev/null || true
65+
rm -rf "$XCODEBUILD_ARCHIVE_PATH/Products/Library/Frameworks/$scheme.framework/Modules"
66+
rm -rf "$XCODEBUILD_ARCHIVE_PATH/Products/Library/Frameworks/$scheme.framework/Headers"
67+
ln -s Versions/Current/Modules "$XCODEBUILD_ARCHIVE_PATH/Products/Library/Frameworks/$scheme.framework/Modules"
68+
ln -s Versions/Current/Headers "$XCODEBUILD_ARCHIVE_PATH/Products/Library/Frameworks/$scheme.framework/Headers"
69+
else
70+
FRAMEWORK_MODULES_PATH="$XCODEBUILD_ARCHIVE_PATH/Products/Library/Frameworks/$scheme.framework/Modules"
71+
FRAMEWORK_HEADERS_PATH="$XCODEBUILD_ARCHIVE_PATH/Products/Library/Frameworks/$scheme.framework/Headers"
72+
mkdir -p "$FRAMEWORK_MODULES_PATH"
73+
mkdir -p "$FRAMEWORK_HEADERS_PATH"
74+
cp -r \
75+
"$XCODEBUILD_DERIVED_DATA_PATH/Build/Intermediates.noindex/ArchiveIntermediates/$scheme/BuildProductsPath/Release-$sdk/$scheme.swiftmodule" \
76+
"$FRAMEWORK_MODULES_PATH/$scheme.swiftmodule"
77+
# Replace OpenGraphCxx with OpenGraph in swiftinterface files
78+
find "$FRAMEWORK_MODULES_PATH/$scheme.swiftmodule" -name "*.swiftinterface" -exec sed -i '' 's/OpenGraphCxx/OpenGraph/g' {} \;
79+
cp -r \
80+
"$PROJECT_ROOT/Sources/OpenGraphCxx/include/OpenGraph"/* \
81+
"$FRAMEWORK_HEADERS_PATH/" 2>/dev/null || true
82+
cp "$PROJECT_BUILD_DIR/module.modulemap" \
83+
"$FRAMEWORK_MODULES_PATH/module.modulemap" 2>/dev/null || true
84+
fi
85+
86+
# Delete private and package swiftinterface
87+
rm -f "$FRAMEWORK_MODULES_PATH/$scheme.swiftmodule/*.package.swiftinterface"
88+
rm -f "$FRAMEWORK_MODULES_PATH/$scheme.swiftmodule/*.private.swiftinterface"
89+
}
90+
91+
build_framework "iphonesimulator" "generic/platform=iOS Simulator" "$PACKAGE_NAME"
92+
build_framework "iphoneos" "generic/platform=iOS" "$PACKAGE_NAME"
93+
build_framework "macosx" "generic/platform=macOS" "$PACKAGE_NAME"
94+
95+
echo "Builds completed successfully."
96+
97+
cd $PROJECT_BUILD_DIR
98+
99+
rm -rf "$PACKAGE_NAME.xcframework"
100+
xcodebuild -create-xcframework \
101+
-framework $PACKAGE_NAME-iphonesimulator.xcarchive/Products/Library/Frameworks/$PACKAGE_NAME.framework \
102+
-framework $PACKAGE_NAME-iphoneos.xcarchive/Products/Library/Frameworks/$PACKAGE_NAME.framework \
103+
-framework $PACKAGE_NAME-macosx.xcarchive/Products/Library/Frameworks/$PACKAGE_NAME.framework \
104+
-output $PACKAGE_NAME.xcframework
105+
106+
cp -r $PACKAGE_NAME-iphonesimulator.xcarchive/dSYMs $PACKAGE_NAME.xcframework/ios-arm64_x86_64-simulator

0 commit comments

Comments
 (0)