diff options
Diffstat (limited to 'port/iOS/build.sh')
-rwxr-xr-x | port/iOS/build.sh | 164 |
1 files changed, 114 insertions, 50 deletions
diff --git a/port/iOS/build.sh b/port/iOS/build.sh index 39df1e3d0..200a5d3c1 100755 --- a/port/iOS/build.sh +++ b/port/iOS/build.sh @@ -31,9 +31,8 @@ TOOLCHAIN=$XCODE_ROOT_DIR/Toolchains/XcodeDefault.xctoolchain CMAKE_C_COMPILER=$(xcrun -find cc) CMAKE_CXX_COMPILER=$(xcrun -find c++) -BUILD_ARCHS_DEVICE="arm64e arm64 armv7s armv7" -BUILD_ARCHS_SIMULATOR="x86_64 i386" -BUILD_ARCHS_ALL=($BUILD_ARCHS_DEVICE $BUILD_ARCHS_SIMULATOR) +BUILD_ARCHS_DEVICE="arm64e arm64" +BUILD_ARCHS_SIMULATOR="arm64-simulator x86_64-simulator" CPP_DEV_TARGET_LIST=(miphoneos-version-min mios-simulator-version-min) CPP_DEV_TARGET= @@ -46,61 +45,83 @@ function join { local IFS="$1"; shift; echo "$*"; } build_arch() { - IOS_SDK_DEVICE=iPhoneOS - CPP_DEV_TARGET=${CPP_DEV_TARGET_LIST[0]} - - if [[ "$BUILD_ARCHS_SIMULATOR" =~ "$1" ]] - then + ARCH=$1 + if [[ "$ARCH" == *"-simulator" ]]; then echo '[!] Target SDK set to SIMULATOR.' - IOS_SDK_DEVICE=iPhoneSimulator - CPP_DEV_TARGET=${CPP_DEV_TARGET_LIST[1]} + IOS_SDK_DEVICE="iphonesimulator" # Use lowercase matching xcrun naming + BUILD_ARCH="${ARCH%-simulator}" # Remove "-simulator" from architecture name + OUTPUT_FOLDER="$BUILD_DIR/ios-$ARCH" + MIN_VERSION_FLAG="-mios-simulator-version-min=$IOS_SDK_TARGET" else echo '[!] Target SDK set to DEVICE.' + IOS_SDK_DEVICE="iphoneos" # For device builds + BUILD_ARCH="$ARCH" + OUTPUT_FOLDER="$BUILD_DIR/ios-$ARCH" + MIN_VERSION_FLAG="-miphoneos-version-min=$IOS_SDK_TARGET" fi unset DEVROOT SDKROOT CFLAGS LDFLAGS CPPFLAGS CXXFLAGS CMAKE_CLI_INPUT - - export CC="$(xcrun -sdk iphoneos -find clang)" + + # Use xcrun with the correct SDK to find clang + export CC="$(xcrun -sdk $IOS_SDK_DEVICE -find clang)" export CPP="$CC -E" - export DEVROOT=$XCODE_ROOT_DIR/Platforms/$IOS_SDK_DEVICE.platform/Developer - export SDKROOT=$DEVROOT/SDKs/$IOS_SDK_DEVICE$IOS_SDK_VERSION.sdk - export CFLAGS="-arch $1 -pipe -no-cpp-precomp -isysroot $SDKROOT -I$SDKROOT/usr/include/ -miphoneos-version-min=$IOS_SDK_TARGET" + + # Derive correct platform directory names + # Note: iPhoneOS.platform and iPhoneSimulator.platform are used by Xcode internally. + if [[ "$IOS_SDK_DEVICE" == "iphonesimulator" ]]; then + PLATFORM_NAME="iPhoneSimulator" + else + PLATFORM_NAME="iPhoneOS" + fi + + export DEVROOT="$XCODE_ROOT_DIR/Platforms/$PLATFORM_NAME.platform/Developer" + export SDKROOT="$DEVROOT/SDKs/$PLATFORM_NAME$IOS_SDK_VERSION.sdk" + + # Set flags. For simulator builds, we use -mios-simulator-version-min; for device, -miphoneos-version-min. + export CFLAGS="-arch $BUILD_ARCH -pipe -no-cpp-precomp -isysroot $SDKROOT -I$SDKROOT/usr/include/ $MIN_VERSION_FLAG" if [[ "$BUILD_TYPE" =~ "Debug" ]]; then - export CFLAGS="$CFLAGS -Og" + export CFLAGS="$CFLAGS -Og" else - export CFLAGS="$CFLAGS -O3" + export CFLAGS="$CFLAGS -O3" fi - export LDFLAGS="-arch $1 -isysroot $SDKROOT -L$SDKROOT/usr/lib/" + export LDFLAGS="-arch $BUILD_ARCH -isysroot $SDKROOT -L$SDKROOT/usr/lib/" export CPPFLAGS="$CFLAGS" export CXXFLAGS="$CFLAGS -std=$CPP_STD" - rm CMakeCache.txt - - CMAKE_CLI_INPUT="-DCMAKE_C_COMPILER=$CMAKE_C_COMPILER -DCMAKE_CXX_COMPILER=$CMAKE_CXX_COMPILER -DCMAKE_TOOLCHAIN_FILE=./port/iOS/IPHONEOS_$(echo $1 | tr '[:lower:]' '[:upper:]')_TOOLCHAIN.cmake -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DBUILD_SHARED_LIBS=$BUILD_SHARED_LIBS -DASSIMP_BUILD_ZLIB=ON" - + rm -f CMakeCache.txt + + # Construct the CMake toolchain file path + # Make sure these toolchain files differentiate between device and simulator builds properly. + TOOLCHAIN_FILE="./port/iOS/${PLATFORM_NAME}_$(echo "$BUILD_ARCH" | tr '[:lower:]' '[:upper:]')_TOOLCHAIN.cmake" + + CMAKE_CLI_INPUT="-DCMAKE_C_COMPILER=$CMAKE_C_COMPILER -DCMAKE_CXX_COMPILER=$CMAKE_CXX_COMPILER \ + -DCMAKE_TOOLCHAIN_FILE=$TOOLCHAIN_FILE \ + -DCMAKE_BUILD_TYPE=$BUILD_TYPE \ + -DBUILD_SHARED_LIBS=$BUILD_SHARED_LIBS \ + -DASSIMP_BUILD_ZLIB=ON" + echo "[!] Running CMake with -G 'Unix Makefiles' $CMAKE_CLI_INPUT" - cmake -G 'Unix Makefiles' ${CMAKE_CLI_INPUT} - echo "[!] Building $1 library" - + echo "[!] Building $ARCH library" xcrun -run make clean - xcrun -run make assimp -j 8 -l - + xcrun -run make assimp -j 8 -l + + mkdir -p $OUTPUT_FOLDER + if [[ "$BUILD_SHARED_LIBS" =~ "ON" ]]; then - echo "[!] Moving built dynamic libraries into: $BUILD_DIR/$1/" - mv ./lib/*.dylib $BUILD_DIR/$1/ + echo "[!] Moving built dynamic libraries into: $OUTPUT_FOLDER" + mv ./lib/*.dylib $OUTPUT_FOLDER/ fi - - echo "[!] Moving built static libraries into: $BUILD_DIR/$1/" - mv ./lib/*.a $BUILD_DIR/$1/ + + echo "[!] Moving built static libraries into: $OUTPUT_FOLDER" + mv ./lib/*.a $OUTPUT_FOLDER/ } echo "[!] $0 - assimp iOS build script" CPP_STD_LIB=${CPP_STD_LIB_LIST[0]} CPP_STD=${CPP_STD_LIST[0]} -DEPLOY_ARCHS=${BUILD_ARCHS_ALL[*]} DEPLOY_FAT=1 DEPLOY_XCFramework=1 @@ -158,14 +179,15 @@ done cd ../../ rm -rf $BUILD_DIR -for ARCH_TARGET in $DEPLOY_ARCHS; do - echo "Creating folder: $BUILD_DIR/$ARCH_TARGET" - mkdir -p $BUILD_DIR/$ARCH_TARGET - echo "Building for arc: $ARCH_TARGET" - build_arch $ARCH_TARGET - #rm ./lib/libassimp.a +for ARCH in $BUILD_ARCHS_DEVICE; do + echo "Building for DEVICE arch: $ARCH" + build_arch $ARCH done +for ARCH in $BUILD_ARCHS_SIMULATOR; do + echo "Building for SIMULATOR arch: $ARCH" + build_arch $ARCH +done make_fat_static_or_shared_binary() { @@ -209,21 +231,63 @@ if [[ "$DEPLOY_FAT" -eq 1 ]]; then echo "[!] Done! The fat binaries can be found at $BUILD_DIR" fi -make_xcframework() -{ +make_xcframework() { LIB_NAME=$1 - FRAMEWORK_PATH=$BUILD_DIR/$LIB_NAME.xcframework + FRAMEWORK_PATH="$BUILD_DIR/$LIB_NAME.xcframework" + + # Paths to device and simulator libraries + DEVICE_LIB_PATH="$BUILD_DIR/ios-arm64/libassimp.a" + ARM64_SIM_LIB_PATH="$BUILD_DIR/ios-arm64-simulator/libassimp.a" + X86_64_SIM_LIB_PATH="$BUILD_DIR/ios-x86_64-simulator/libassimp.a" + UNIVERSAL_SIM_LIB_PATH="$BUILD_DIR/ios-simulator/libassimp.a" + + # Ensure we have a clean location for the universal simulator lib + mkdir -p "$BUILD_DIR/ios-simulator" + + # Combine simulator libraries if both arm64 and x86_64 simulator slices are present + if [[ -f "$ARM64_SIM_LIB_PATH" && -f "$X86_64_SIM_LIB_PATH" ]]; then + echo "[+] Combining arm64 and x86_64 simulator libs into a universal simulator library..." + lipo -create "$ARM64_SIM_LIB_PATH" "$X86_64_SIM_LIB_PATH" -output "$UNIVERSAL_SIM_LIB_PATH" || { + echo "[ERROR] lipo failed to combine simulator libraries." + exit 1 + } + SIM_LIB_PATH="$UNIVERSAL_SIM_LIB_PATH" + elif [[ -f "$ARM64_SIM_LIB_PATH" ]]; then + echo "[!] Only arm64 simulator library found. Using it as is." + SIM_LIB_PATH="$ARM64_SIM_LIB_PATH" + elif [[ -f "$X86_64_SIM_LIB_PATH" ]]; then + echo "[!] Only x86_64 simulator library found. Using it as is." + SIM_LIB_PATH="$X86_64_SIM_LIB_PATH" + else + SIM_LIB_PATH="" + fi - ARGS = "" - for ARCH_TARGET in $DEPLOY_ARCHS; do - if [[ "$BUILD_SHARED_LIBS" =~ "ON" ]]; then - ARGS="$ARGS -library $BUILD_DIR/$ARCH_TARGET/$LIB_NAME.dylib -headers ./include " - else - ARGS="$ARGS -library $BUILD_DIR/$ARCH_TARGET/$LIB_NAME.a -headers ./include " - fi - done + ARGS="" + # Device library + if [[ -f "$DEVICE_LIB_PATH" ]]; then + echo "[DEBUG] Adding library $DEVICE_LIB_PATH for device arm64" + ARGS="$ARGS -library $DEVICE_LIB_PATH -headers ./include" + else + echo "[WARNING] Device library not found: $DEVICE_LIB_PATH" + fi + + # Simulator library (could be universal or a single-arch one) + if [[ -n "$SIM_LIB_PATH" && -f "$SIM_LIB_PATH" ]]; then + echo "[DEBUG] Adding library $SIM_LIB_PATH for simulator" + ARGS="$ARGS -library $SIM_LIB_PATH -headers ./include" + fi + + if [[ -z "$ARGS" ]]; then + echo "[ERROR] No valid libraries found to create XCFramework." + exit 1 + fi + + # Create XCFramework + echo "[+] Creating XCFramework ..." xcodebuild -create-xcframework $ARGS -output $FRAMEWORK_PATH + + echo "[!] Done! The XCFramework can be found at $FRAMEWORK_PATH" } if [[ "$DEPLOY_XCFramework" -eq 1 ]]; then |