diff --git a/packages/mlc/react-native-ai-mlc.podspec b/packages/mlc/react-native-ai-mlc.podspec index 31e8cf64..6fb9242e 100644 --- a/packages/mlc/react-native-ai-mlc.podspec +++ b/packages/mlc/react-native-ai-mlc.podspec @@ -47,17 +47,28 @@ Pod::Spec.new do |s| # User target configuration to ensure static libraries are force loaded s.user_target_xcconfig = { - 'OTHER_LDFLAGS' => [ + 'OTHER_LDFLAGS[sdk=iphoneos*]' => [ '$(inherited)', '-ObjC', - "-force_load \"#{package_path}/prebuilt/ios/lib/libmodel_iphone.a\"", - "-force_load \"#{package_path}/prebuilt/ios/lib/libmlc_llm.a\"", - "-force_load \"#{package_path}/prebuilt/ios/lib/libtvm_runtime.a\"", - "-force_load \"#{package_path}/prebuilt/ios/lib/libtvm_ffi_static.a\"", - "-force_load \"#{package_path}/prebuilt/ios/lib/libsentencepiece.a\"", - "-force_load \"#{package_path}/prebuilt/ios/lib/libtokenizers_cpp.a\"", - "-force_load \"#{package_path}/prebuilt/ios/lib/libtokenizers_c.a\"" - ].join(' ') + "-force_load \"#{package_path}/prebuilt/ios/lib_iphone/libmodel_iphone.a\"", + "-force_load \"#{package_path}/prebuilt/ios/lib_iphone/libmlc_llm.a\"", + "-force_load \"#{package_path}/prebuilt/ios/lib_iphone/libtvm_runtime.a\"", + "-force_load \"#{package_path}/prebuilt/ios/lib_iphone/libtvm_ffi_static.a\"", + "-force_load \"#{package_path}/prebuilt/ios/lib_iphone/libsentencepiece.a\"", + "-force_load \"#{package_path}/prebuilt/ios/lib_iphone/libtokenizers_cpp.a\"", + "-force_load \"#{package_path}/prebuilt/ios/lib_iphone/libtokenizers_c.a\"" + ].join(' '), + 'OTHER_LDFLAGS[sdk=iphonesimulator*]' => [ + '$(inherited)', + '-ObjC', + "-force_load \"#{package_path}/prebuilt/ios/lib_iphonesim/libmodel_iphone.a\"", + "-force_load \"#{package_path}/prebuilt/ios/lib_iphonesim/libmlc_llm.a\"", + "-force_load \"#{package_path}/prebuilt/ios/lib_iphonesim/libtvm_runtime.a\"", + "-force_load \"#{package_path}/prebuilt/ios/lib_iphonesim/libtvm_ffi_static.a\"", + "-force_load \"#{package_path}/prebuilt/ios/lib_iphonesim/libsentencepiece.a\"", + "-force_load \"#{package_path}/prebuilt/ios/lib_iphonesim/libtokenizers_cpp.a\"", + "-force_load \"#{package_path}/prebuilt/ios/lib_iphonesim/libtokenizers_c.a\"" + ].join(' '), } # Framework dependencies diff --git a/packages/mlc/scripts/build-runtime.sh b/packages/mlc/scripts/build-runtime.sh index fc09a1d0..b3212c81 100755 --- a/packages/mlc/scripts/build-runtime.sh +++ b/packages/mlc/scripts/build-runtime.sh @@ -72,7 +72,7 @@ fi # Get script directory SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" PACKAGE_DIR="$(dirname "$SCRIPT_DIR")" -BUILD_DIR="$PACKAGE_DIR/build" +BUILD_DIR="$SCRIPT_DIR/build" CONFIG_FILE="$PACKAGE_DIR/mlc-package-config-$PLATFORM.json" OUTPUT_DIR="$PACKAGE_DIR/prebuilt/$PLATFORM" @@ -246,7 +246,7 @@ if [ ! -f "$MLC_LLM_SOURCE_DIR/3rdparty/tvm/CMakeLists.txt" ] || [ ! -f "$MLC_LL fi # Check if mlc_llm is available -if ! python3 -m mlc_llm --help > /dev/null 2>&1; then +if ! python -m mlc_llm --help > /dev/null 2>&1; then echo -e "${RED}Error: mlc_llm not found${NC}" echo "" echo "Please install MLC:" @@ -254,34 +254,44 @@ if ! python3 -m mlc_llm --help > /dev/null 2>&1; then exit 1 fi -# Check for conflicting build artifacts from other platforms -if [ -f "$BUILD_DIR/CMakeCache.txt" ]; then - # Check if this is an Xcode/iOS build when building for Android - if [ "$PLATFORM" = "android" ] && grep -q "Xcode" "$BUILD_DIR/CMakeCache.txt" 2>/dev/null; then - echo -e "${YELLOW}Warning: Detected Xcode/iOS build artifacts in $BUILD_DIR${NC}" - echo "This can cause CMake cache conflicts for Android builds." - echo "Cleaning build directory..." - rm -rf "$BUILD_DIR" - echo -e "${GREEN}Build directory cleaned${NC}" - fi - # Check if this is an Android build when building for iOS - if [ "$PLATFORM" = "ios" ] && grep -q "Android" "$BUILD_DIR/CMakeCache.txt" 2>/dev/null; then - echo -e "${YELLOW}Warning: Detected Android build artifacts in $BUILD_DIR${NC}" - echo "This can cause CMake cache conflicts for iOS builds." - echo "Cleaning build directory..." - rm -rf "$BUILD_DIR" - echo -e "${GREEN}Build directory cleaned${NC}" - fi -fi - # Create output directory mkdir -p "$OUTPUT_DIR" # Run MLC package command -echo "Building runtime..." -python3 -m mlc_llm package \ - --package-config "$CONFIG_FILE" \ - --output "$OUTPUT_DIR" +if [ "$PLATFORM" = "ios" ]; then + for is_simulator in false true; do + echo "Preparing libs (is_simulator=$is_simulator)..." + PREPARE_LIBS_PATH="$MLC_LLM_SOURCE_DIR/ios/prepare_libs.sh" + if [ -f "$PREPARE_LIBS_PATH" ]; then + sed -i '' "s/^is_simulator=.*/is_simulator=\"$is_simulator\"/" "$PREPARE_LIBS_PATH" + fi + + if [ -d "$BUILD_DIR" ]; then + echo "Cleaning build directory $BUILD_DIR..." + rm -rf "$BUILD_DIR" + fi + + echo "Building runtime (is_simulator=$is_simulator)..." + python3 -m mlc_llm package \ + --package-config "$CONFIG_FILE" \ + --output "$OUTPUT_DIR" + + if [ -d "$OUTPUT_DIR/lib" ]; then + if [ "$is_simulator" = "true" ]; then + lib_suffix="iphonesim" + else + lib_suffix="iphone" + fi + rm -rf "$OUTPUT_DIR/lib_$lib_suffix" + mv "$OUTPUT_DIR/lib" "$OUTPUT_DIR/lib_$lib_suffix" + fi + done +else + echo "Building runtime..." + python3 -m mlc_llm package \ + --package-config "$CONFIG_FILE" \ + --output "$OUTPUT_DIR" +fi # Copy necessary headers for iOS if [ "$PLATFORM" = "ios" ]; then