Skip to content

Commit 27ca897

Browse files
Generate xcframework instead of 'old-style' frameworks (#52)
1 parent b18d88f commit 27ca897

File tree

1 file changed

+58
-85
lines changed

1 file changed

+58
-85
lines changed

boost.sh

Lines changed: 58 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -225,16 +225,11 @@ OPTIONS:
225225
Compile using -fvisibility=hidden and -fvisibility-inlines-hidden
226226
227227
--no-framework
228-
Do not create the framework.
228+
Do not create the xcframework.
229229
230230
--universal
231231
Create universal FAT binary.
232232
233-
--framework-header-root
234-
Place headers in a 'boost' root directory in the framework rather than
235-
directly in the 'Headers' directory.
236-
Added for compatibility with projects that expect this structure.
237-
238233
--debug
239234
Build a debug variant.
240235
@@ -429,10 +424,6 @@ parseArgs()
429424
NO_FRAMEWORK=1
430425
;;
431426

432-
--framework-header-root)
433-
HEADER_ROOT=1
434-
;;
435-
436427
-j | --threads)
437428
if [ -n "$2" ]; then
438429
THREADS="-j$2"
@@ -1075,80 +1066,76 @@ buildUniversal()
10751066
}
10761067

10771068
#===============================================================================
1078-
buildFramework()
1069+
1070+
buildXCFramework()
10791071
{
10801072
: "${1:?}"
1081-
FRAMEWORKDIR="$1"
1082-
BUILDDIR="$2/build"
1083-
PREFIXDIR="$2/prefix"
1073+
DISTDIR="$1"
10841074

10851075
FRAMEWORK_NAME=boost
1086-
FRAMEWORK_VERSION=A
10871076

10881077
FRAMEWORK_CURRENT_VERSION="$BOOST_VERSION"
10891078

1090-
FRAMEWORK_BUNDLE="$FRAMEWORKDIR/$FRAMEWORK_NAME.framework"
1091-
echo "Framework: Building $FRAMEWORK_BUNDLE from $BUILDDIR..."
1079+
FRAMEWORK_BUNDLE="$DISTDIR/$FRAMEWORK_NAME.xcframework"
1080+
echo "Framework: Building $FRAMEWORK_BUNDLE..."
10921081

10931082
rm -rf "$FRAMEWORK_BUNDLE"
1094-
if [[ -n $HEADER_ROOT ]]; then
1095-
FRAMEWORK_HEADERS="/Headers/boost/"
1096-
else
1097-
FRAMEWORK_HEADERS="/Headers/"
1098-
fi
1099-
1100-
echo "Framework: Setting up directories..."
1101-
mkdir -p "$FRAMEWORK_BUNDLE/Versions/$FRAMEWORK_VERSION/Resources"
1102-
mkdir -p "$FRAMEWORK_BUNDLE/Versions/$FRAMEWORK_VERSION/$FRAMEWORK_HEADERS"
1103-
mkdir -p "$FRAMEWORK_BUNDLE/Versions/$FRAMEWORK_VERSION/Documentation"
11041083

1105-
echo "Framework: Creating symlinks..."
1106-
ln -s "$FRAMEWORK_VERSION" "$FRAMEWORK_BUNDLE/Versions/Current"
1107-
ln -s "Versions/Current/Headers" "$FRAMEWORK_BUNDLE/Headers"
1108-
ln -s "Versions/Current/Resources" "$FRAMEWORK_BUNDLE/Resources"
1109-
ln -s "Versions/Current/Documentation" "$FRAMEWORK_BUNDLE/Documentation"
1110-
ln -s "Versions/Current/$FRAMEWORK_NAME" "$FRAMEWORK_BUNDLE/$FRAMEWORK_NAME"
1111-
1112-
FRAMEWORK_INSTALL_NAME="$FRAMEWORK_BUNDLE/Versions/$FRAMEWORK_VERSION/$FRAMEWORK_NAME"
1084+
SLICES_COUNT=0
1085+
LIB_ARGS=()
1086+
# We'll take any of the paths we find, headers should be the same for all
1087+
# archs / plaforms.
1088+
HEADERS_PATH=""
1089+
if [[ -n $BUILD_IOS ]]; then
1090+
for LIBPATH in "$IOS_OUTPUT_DIR"/build/*/libboost.a; do
1091+
LIB_ARGS+=('-library' "$LIBPATH")
1092+
SLICES_COUNT=$((SLICES_COUNT + 1))
1093+
done
11131094

1114-
if [[ -n $BOOTSTRAP_LIBS ]]; then
1115-
echo "Lipoing library into $FRAMEWORK_INSTALL_NAME..."
1116-
cd_or_abort "$BUILDDIR"
1117-
if [[ -n $BUILD_IOS ]]; then
1118-
$IOS_DEV_CMD lipo -create ./*/libboost.a -o "$FRAMEWORK_INSTALL_NAME" || abort "Lipo $1 failed"
1095+
INCLUDE_DIR="$IOS_OUTPUT_DIR/prefix/include"
1096+
if [ -d "$INCLUDE_DIR" ]; then
1097+
HEADERS_PATH="$INCLUDE_DIR"
11191098
fi
1120-
if [[ -n $BUILD_TVOS ]]; then
1121-
$TVOS_DEV_CMD lipo -create ./*/libboost.a -o "$FRAMEWORK_INSTALL_NAME" || abort "Lipo $1 failed"
1099+
fi
1100+
if [[ -n $BUILD_TVOS ]]; then
1101+
for LIBPATH in "$TVOS_OUTPUT_DIR"/build/*/libboost.a; do
1102+
LIB_ARGS+=('-library' "$LIBPATH")
1103+
SLICES_COUNT=$((SLICES_COUNT + 1))
1104+
done
1105+
1106+
INCLUDE_DIR="$TVOS_OUTPUT_DIR/prefix/include"
1107+
if [ -d "$INCLUDE_DIR" ]; then
1108+
HEADERS_PATH="$INCLUDE_DIR"
11221109
fi
1123-
if [[ -n $BUILD_MACOS ]]; then
1124-
$MACOS_DEV_CMD lipo -create ./*/libboost.a -o "$FRAMEWORK_INSTALL_NAME" || abort "Lipo $1 failed"
1110+
fi
1111+
if [[ -n $BUILD_MACOS ]]; then
1112+
for LIBPATH in "$MACOS_OUTPUT_DIR"/build/*/libboost.a; do
1113+
LIB_ARGS+=('-library' "$LIBPATH")
1114+
SLICES_COUNT=$((SLICES_COUNT + 1))
1115+
done
1116+
1117+
INCLUDE_DIR="$MACOS_OUTPUT_DIR/prefix/include"
1118+
if [ -d "$INCLUDE_DIR" ]; then
1119+
HEADERS_PATH="$INCLUDE_DIR"
11251120
fi
11261121
fi
11271122

1128-
echo "Framework: Copying includes..."
1129-
cp -r "$PREFIXDIR/include/boost/"* "$FRAMEWORK_BUNDLE/$FRAMEWORK_HEADERS"
1130-
1131-
echo "Framework: Creating plist..."
1132-
cat > "$FRAMEWORK_BUNDLE/Resources/Info.plist" <<EOF
1133-
<?xml version="1.0" encoding="UTF-8"?>
1134-
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
1135-
<plist version="1.0">
1136-
<dict>
1137-
<key>CFBundleExecutable</key>
1138-
<string>${FRAMEWORK_NAME}</string>
1139-
<key>CFBundleIdentifier</key>
1140-
<string>org.boost</string>
1141-
<key>CFBundleInfoDictionaryVersion</key>
1142-
<string>6.0</string>
1143-
<key>CFBundlePackageType</key>
1144-
<string>FMWK</string>
1145-
<key>CFBundleSignature</key>
1146-
<string>????</string>
1147-
<key>CFBundleVersion</key>
1148-
<string>${FRAMEWORK_CURRENT_VERSION}</string>
1149-
</dict>
1150-
</plist>
1151-
EOF
1123+
xcrun xcodebuild -create-xcframework \
1124+
"${LIB_ARGS[@]}" \
1125+
-headers "$HEADERS_PATH" \
1126+
-output "$FRAMEWORK_BUNDLE"
1127+
1128+
1129+
# Fix the 'Headers' directory location in the xcframework, and update the
1130+
# Info.plist accordingly for all slices.
1131+
FRAMEWORK_HEADERS_PATH=$(find "${FRAMEWORK_BUNDLE}" -name 'Headers')
1132+
mv "$FRAMEWORK_HEADERS_PATH" "$FRAMEWORK_BUNDLE"
1133+
1134+
for I in $(seq 0 $((SLICES_COUNT - 1))); do
1135+
plutil -replace "AvailableLibraries.$I.HeadersPath" -string '../Headers' "$FRAMEWORK_BUNDLE/Info.plist"
1136+
done
1137+
1138+
echo "$FRAMEWORK_CURRENT_VERSION" > "$FRAMEWORK_BUNDLE/VERSION"
11521139

11531140
doneSection
11541141
}
@@ -1195,9 +1182,6 @@ MACOS_OUTPUT_DIR="$OUTPUT_DIR/macos/$BUILD_VARIANT"
11951182
IOS_BUILD_DIR="$IOS_OUTPUT_DIR/build"
11961183
TVOS_BUILD_DIR="$TVOS_OUTPUT_DIR/build"
11971184
MACOS_BUILD_DIR="$MACOS_OUTPUT_DIR/build"
1198-
IOS_FRAMEWORK_DIR="$IOS_OUTPUT_DIR/framework"
1199-
TVOS_FRAMEWORK_DIR="$TVOS_OUTPUT_DIR/framework"
1200-
MACOS_FRAMEWORK_DIR="$MACOS_OUTPUT_DIR/framework"
12011185

12021186
MACOS_ARCH_FLAGS=()
12031187
for ARCH in "${MACOS_ARCHS[@]}"; do
@@ -1249,9 +1233,6 @@ printVar "XCODE_ROOT"
12491233
printVar "IOS_BUILD_DIR"
12501234
printVar "TVOS_BUILD_DIR"
12511235
printVar "MACOS_BUILD_DIR"
1252-
printVar "TVOS_FRAMEWORK_DIR"
1253-
printVar "IOS_FRAMEWORK_DIR"
1254-
printVar "MACOS_FRAMEWORK_DIR"
12551236
printVar "THREADS"
12561237
printVar "BUILD_VARIANT"
12571238
echo
@@ -1301,17 +1282,9 @@ if [[ -n $UNIVERSAL ]]; then
13011282
fi
13021283

13031284
if [[ -z $NO_FRAMEWORK ]]; then
1304-
if [[ -n $BUILD_IOS ]]; then
1305-
buildFramework "$IOS_FRAMEWORK_DIR" "$IOS_OUTPUT_DIR"
1306-
fi
1307-
1308-
if [[ -n $BUILD_TVOS ]]; then
1309-
buildFramework "$TVOS_FRAMEWORK_DIR" "$TVOS_OUTPUT_DIR"
1310-
fi
1311-
1312-
if [[ -n $BUILD_MACOS ]]; then
1313-
buildFramework "$MACOS_FRAMEWORK_DIR" "$MACOS_OUTPUT_DIR"
1314-
fi
1285+
DIST_DIR="$CURRENT_DIR/dist"
1286+
mkdir -p "$DIST_DIR"
1287+
buildXCFramework "$DIST_DIR"
13151288
fi
13161289

13171290
echo "Completed successfully"

0 commit comments

Comments
 (0)