Team Ai
Datasetpublic

echodict/llama.cpp

version https://git-lfs.github.com/spec/v1 oid sha256:cfc44b7ba25614df70e6b65e3341cae0310163bd32fd31a6b928a542df433faf size 30786

sourceHugging Faceupdated 6mo agoView on Hugging Face
0likes479downloads
validate-ios.sh821 linesDownload Raw Back to apple
1#!/usr/bin/env bash2# validate-ios.sh - Validate iOS Application with embedded llama.xcframework using SwiftUI3 4# Authentication options (optional) (can be set via environment variables)5# To use: export APPLE_ID=your.email@example.com6#         export APPLE_PASSWORD=your-app-specific-password7#         ./validate-ios.sh8APPLE_ID=${APPLE_ID:-""}9APPLE_PASSWORD=${APPLE_PASSWORD:-""}10 11# Ensure the script exits on error12set -e13 14# Function to print usage instructions15print_usage() {16  echo "Usage: ./validate-ios.sh [OPTIONS]"17  echo ""18  echo "Options:"19  echo "  --help                 Show this help message"20  echo "  --apple-id EMAIL       Apple ID email for validation"21  echo "  --apple-password PWD   App-specific password for Apple ID"22  echo ""23  echo "Environment variables:"24  echo "  APPLE_ID               Apple ID email for validation"25  echo "  APPLE_PASSWORD         App-specific password for Apple ID"26  echo ""27  echo "Notes:"28  echo "  - Command line options take precedence over environment variables"29  echo "  - Authentication is optional. If not provided, alternative validation will be performed"30  echo "  - For APPLE_PASSWORD, use an app-specific password generated at https://appleid.apple.com/account/manage"31}32 33# Parse command line arguments34while [[ $# -gt 0 ]]; do35  case $1 in36    --help)37      print_usage38      exit 039      ;;40    --apple-id)41      APPLE_ID="$2"42      shift 243      ;;44    --apple-password)45      APPLE_PASSWORD="$2"46      shift 247      ;;48    *)49      echo "Unknown option: $1"50      print_usage51      exit 152      ;;53  esac54done55 56# Function to clean up in case of error57cleanup() {58  # Don't clean up temp files on error to help with debugging59  echo "===== iOS Validation Process Failed ====="60  exit 161}62 63# Set up trap to call cleanup function on error64trap cleanup ERR65 66set -e  # Exit on any error67 68ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )/../.." && pwd )"69BUILD_DIR="${ROOT_DIR}/validation-builds/ios"70 71# Configuration72APP_NAME="iOSLlamaTest"73BUNDLE_ID="org.ggml.iOSLlamaTest"74XCFRAMEWORK_PATH="${ROOT_DIR}/build-apple/llama.xcframework"75TEMP_DIR="${BUILD_DIR}/temp"76ARCHIVE_PATH="${BUILD_DIR}/${APP_NAME}.xcarchive"77IPA_PATH="${BUILD_DIR}/${APP_NAME}.ipa"78VALIDATION_DIR="${BUILD_DIR}/validation"79 80# Create necessary directories81mkdir -p "${BUILD_DIR}"82mkdir -p "${TEMP_DIR}"83mkdir -p "${VALIDATION_DIR}"84 85echo "===== iOS Validation Process Started ====="86 87# 1. Create a simple test app project88echo "Creating test iOS app project..."89mkdir -p "${TEMP_DIR}/${APP_NAME}/${APP_NAME}"90cat > "${TEMP_DIR}/${APP_NAME}/${APP_NAME}/Info.plist" << EOF91<?xml version="1.0" encoding="UTF-8"?>92<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">93<plist version="1.0">94<dict>95    <key>CFBundleDevelopmentRegion</key>96    <string>en</string>97    <key>CFBundleExecutable</key>98    <string>${APP_NAME}</string>99    <key>CFBundleIdentifier</key>100    <string>${BUNDLE_ID}</string>101    <key>CFBundleInfoDictionaryVersion</key>102    <string>6.0</string>103    <key>CFBundleName</key>104    <string>${APP_NAME}</string>105    <key>CFBundlePackageType</key>106    <string>APPL</string>107    <key>CFBundleShortVersionString</key>108    <string>1.0</string>109    <key>CFBundleVersion</key>110    <string>1</string>111    <key>LSRequiresIPhoneOS</key>112    <true/>113    <key>UILaunchScreen</key>114    <dict/>115    <key>UIRequiredDeviceCapabilities</key>116    <array>117        <string>armv7</string>118    </array>119    <key>UISupportedInterfaceOrientations</key>120    <array>121        <string>UIInterfaceOrientationPortrait</string>122    </array>123</dict>124</plist>125EOF126 127# Create SwiftUI app files128mkdir -p "${TEMP_DIR}/${APP_NAME}/${APP_NAME}/Sources"129 130# Create App.swift131cat > "${TEMP_DIR}/${APP_NAME}/${APP_NAME}/Sources/App.swift" << EOF132import SwiftUI133import llama134 135@main136struct LlamaTestApp: App {137    var body: some Scene {138        WindowGroup {139            ContentView()140        }141    }142}143EOF144 145# Create ContentView.swift146cat > "${TEMP_DIR}/${APP_NAME}/${APP_NAME}/Sources/ContentView.swift" << EOF147import SwiftUI148import llama149 150struct ContentView: View {151    // Test that we can initialize a llama context params struct152    let params = llama_context_default_params()153 154    var body: some View {155        VStack(spacing: 20) {156            Text("Llama Framework Test")157                .font(.largeTitle)158                .padding()159 160            Text("llama_context_default_params() created successfully")161                .font(.headline)162                .multilineTextAlignment(.center)163                .padding()164 165            // Display some param values to confirm the framework is working166            Text("n_ctx: \(params.n_ctx)")167                .font(.body)168 169            Text("n_batch: \(params.n_batch)")170                .font(.body)171 172            Spacer()173        }174        .padding()175    }176}177 178struct ContentView_Previews: PreviewProvider {179    static var previews: some View {180        ContentView()181    }182}183EOF184 185# Create project.pbxproj, fixing the framework search paths issues186mkdir -p "${TEMP_DIR}/${APP_NAME}/${APP_NAME}.xcodeproj"187cat > "${TEMP_DIR}/${APP_NAME}/${APP_NAME}.xcodeproj/project.pbxproj" << 'EOF'188// !$*UTF8*$!189{190    archiveVersion = 1;191    classes = {192    };193    objectVersion = 54;194    objects = {195 196/* Begin PBXBuildFile section */197        11111111111111111111111 /* App.swift in Sources */ = {isa = PBXBuildFile; fileRef = 22222222222222222222222; };198        33333333333333333333333 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 44444444444444444444444; };199        55555555555555555555555 /* llama.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 66666666666666666666666; };200        77777777777777777777777 /* llama.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 66666666666666666666666; };201/* End PBXBuildFile section */202 203/* Begin PBXCopyFilesBuildPhase section */204        88888888888888888888888 /* Embed Frameworks */ = {205            isa = PBXCopyFilesBuildPhase;206            buildActionMask = 2147483647;207            dstPath = "";208            dstSubfolderSpec = 10;209            files = (210                77777777777777777777777 /* llama.xcframework in Embed Frameworks */,211            );212            name = "Embed Frameworks";213            runOnlyForDeploymentPostprocessing = 0;214        };215/* End PBXCopyFilesBuildPhase section */216 217/* Begin PBXFileReference section */218EOF219 220# Continue with the project.pbxproj file, using the APP_NAME variable appropriately221cat >> "${TEMP_DIR}/${APP_NAME}/${APP_NAME}.xcodeproj/project.pbxproj" << EOF222        99999999999999999999999 /* ${APP_NAME}.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "${APP_NAME}.app"; sourceTree = BUILT_PRODUCTS_DIR; };223        22222222222222222222222 /* App.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = App.swift; sourceTree = "<group>"; };224        44444444444444444444444 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };225        AAAAAAAAAAAAAAAAAAAAAAA /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };226        66666666666666666666666 /* llama.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; path = llama.xcframework; sourceTree = "<group>"; };227/* End PBXFileReference section */228EOF229 230# Add the rest of the project file with fixed framework search paths231cat >> "${TEMP_DIR}/${APP_NAME}/${APP_NAME}.xcodeproj/project.pbxproj" << 'EOF'232/* Begin PBXFrameworksBuildPhase section */233        BBBBBBBBBBBBBBBBBBBBBBBB /* Frameworks */ = {234            isa = PBXFrameworksBuildPhase;235            buildActionMask = 2147483647;236            files = (237                55555555555555555555555 /* llama.xcframework in Frameworks */,238            );239            runOnlyForDeploymentPostprocessing = 0;240        };241/* End PBXFrameworksBuildPhase section */242 243/* Begin PBXGroup section */244EOF245 246# Continue with the project.pbxproj file, using the APP_NAME variable appropriately247cat >> "${TEMP_DIR}/${APP_NAME}/${APP_NAME}.xcodeproj/project.pbxproj" << EOF248        CCCCCCCCCCCCCCCCCCCCCCCC /* Products */ = {249            isa = PBXGroup;250            children = (251                99999999999999999999999 /* ${APP_NAME}.app */,252            );253            name = Products;254            sourceTree = "<group>";255        };256EOF257 258cat >> "${TEMP_DIR}/${APP_NAME}/${APP_NAME}.xcodeproj/project.pbxproj" << 'EOF'259        DDDDDDDDDDDDDDDDDDDDDDDD /* Frameworks */ = {260            isa = PBXGroup;261            children = (262                66666666666666666666666 /* llama.xcframework */,263            );264            name = Frameworks;265            sourceTree = "<group>";266        };267        EEEEEEEEEEEEEEEEEEEEEEEE = {268            isa = PBXGroup;269            children = (270                FFFFFFFFFFFFFFFFFFFFFFFF /* iOSLlamaTest */,271                CCCCCCCCCCCCCCCCCCCCCCCC /* Products */,272                DDDDDDDDDDDDDDDDDDDDDDDD /* Frameworks */,273            );274            sourceTree = "<group>";275        };276        FFFFFFFFFFFFFFFFFFFFFFFF /* iOSLlamaTest */ = {277            isa = PBXGroup;278            children = (279                1111111111111111111111AA /* Sources */,280                AAAAAAAAAAAAAAAAAAAAAAA /* Info.plist */,281            );282            path = "iOSLlamaTest";283            sourceTree = "<group>";284        };285        1111111111111111111111AA /* Sources */ = {286            isa = PBXGroup;287            children = (288                22222222222222222222222 /* App.swift */,289                44444444444444444444444 /* ContentView.swift */,290            );291            path = Sources;292            sourceTree = "<group>";293        };294/* End PBXGroup section */295EOF296 297# Continue with the project.pbxproj file, using the APP_NAME variable appropriately298cat >> "${TEMP_DIR}/${APP_NAME}/${APP_NAME}.xcodeproj/project.pbxproj" << EOF299/* Begin PBXNativeTarget section */300        3333333333333333333333AA /* ${APP_NAME} */ = {301            isa = PBXNativeTarget;302            buildConfigurationList = 4444444444444444444444AA /* Build configuration list for PBXNativeTarget "${APP_NAME}" */;303            buildPhases = (304                5555555555555555555555AA /* Sources */,305                BBBBBBBBBBBBBBBBBBBBBBBB /* Frameworks */,306                6666666666666666666666AA /* Resources */,307                88888888888888888888888 /* Embed Frameworks */,308            );309            buildRules = (310            );311            dependencies = (312            );313            name = "${APP_NAME}";314            productName = "${APP_NAME}";315            productReference = 99999999999999999999999 /* ${APP_NAME}.app */;316            productType = "com.apple.product-type.application";317        };318/* End PBXNativeTarget section */319 320/* Begin PBXProject section */321        7777777777777777777777AA /* Project object */ = {322            isa = PBXProject;323            attributes = {324                LastSwiftUpdateCheck = 1240;325                LastUpgradeCheck = 1240;326                TargetAttributes = {327                    3333333333333333333333AA = {328                        CreatedOnToolsVersion = 12.4;329                    };330                };331            };332            buildConfigurationList = 8888888888888888888888AA /* Build configuration list for PBXProject "${APP_NAME}" */;333            compatibilityVersion = "Xcode 12.0";334            developmentRegion = en;335            hasScannedForEncodings = 0;336            knownRegions = (337                en,338                Base,339            );340            mainGroup = EEEEEEEEEEEEEEEEEEEEEEEE;341            productRefGroup = CCCCCCCCCCCCCCCCCCCCCCCC /* Products */;342            projectDirPath = "";343            projectRoot = "";344            targets = (345                3333333333333333333333AA /* ${APP_NAME} */,346            );347        };348/* End PBXProject section */349EOF350 351# Add the rest of the file with correct FRAMEWORK_SEARCH_PATHS352cat >> "${TEMP_DIR}/${APP_NAME}/${APP_NAME}.xcodeproj/project.pbxproj" << 'EOF'353/* Begin PBXResourcesBuildPhase section */354        6666666666666666666666AA /* Resources */ = {355            isa = PBXResourcesBuildPhase;356            buildActionMask = 2147483647;357            files = (358            );359            runOnlyForDeploymentPostprocessing = 0;360        };361/* End PBXResourcesBuildPhase section */362 363/* Begin PBXSourcesBuildPhase section */364        5555555555555555555555AA /* Sources */ = {365            isa = PBXSourcesBuildPhase;366            buildActionMask = 2147483647;367            files = (368                33333333333333333333333 /* ContentView.swift in Sources */,369                11111111111111111111111 /* App.swift in Sources */,370            );371            runOnlyForDeploymentPostprocessing = 0;372        };373/* End PBXSourcesBuildPhase section */374 375/* Begin XCBuildConfiguration section */376        9999999999999999999999AA /* Debug */ = {377            isa = XCBuildConfiguration;378            buildSettings = {379                ALWAYS_SEARCH_USER_PATHS = NO;380                CLANG_ANALYZER_NONNULL = YES;381                CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;382                CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";383                CLANG_CXX_LIBRARY = "libc++";384                CLANG_ENABLE_MODULES = YES;385                CLANG_ENABLE_OBJC_ARC = YES;386                CLANG_ENABLE_OBJC_WEAK = YES;387                CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;388                CLANG_WARN_BOOL_CONVERSION = YES;389                CLANG_WARN_COMMA = YES;390                CLANG_WARN_CONSTANT_CONVERSION = YES;391                CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;392                CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;393                CLANG_WARN_DOCUMENTATION_COMMENTS = YES;394                CLANG_WARN_EMPTY_BODY = YES;395                CLANG_WARN_ENUM_CONVERSION = YES;396                CLANG_WARN_INFINITE_RECURSION = YES;397                CLANG_WARN_INT_CONVERSION = YES;398                CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;399                CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;400                CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;401                CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;402                CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;403                CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;404                CLANG_WARN_STRICT_PROTOTYPES = YES;405                CLANG_WARN_SUSPICIOUS_MOVE = YES;406                CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;407                CLANG_WARN_UNREACHABLE_CODE = YES;408                CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;409                COPY_PHASE_STRIP = NO;410                DEBUG_INFORMATION_FORMAT = dwarf;411                ENABLE_STRICT_OBJC_MSGSEND = YES;412                ENABLE_TESTABILITY = YES;413                GCC_C_LANGUAGE_STANDARD = gnu11;414                GCC_DYNAMIC_NO_PIC = NO;415                GCC_NO_COMMON_BLOCKS = YES;416                GCC_OPTIMIZATION_LEVEL = 0;417                GCC_PREPROCESSOR_DEFINITIONS = (418                    "DEBUG=1",419                    "$(inherited)",420                );421                GCC_WARN_64_TO_32_BIT_CONVERSION = YES;422                GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;423                GCC_WARN_UNDECLARED_SELECTOR = YES;424                GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;425                GCC_WARN_UNUSED_FUNCTION = YES;426                GCC_WARN_UNUSED_VARIABLE = YES;427                IPHONEOS_DEPLOYMENT_TARGET = 16.4;428                MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;429                MTL_FAST_MATH = YES;430                ONLY_ACTIVE_ARCH = YES;431                SDKROOT = iphoneos;432                SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;433                SWIFT_OPTIMIZATION_LEVEL = "-Onone";434            };435            name = Debug;436        };437        AAAAAAAAAAAAAAAAAAAAABBB /* Release */ = {438            isa = XCBuildConfiguration;439            buildSettings = {440                ALWAYS_SEARCH_USER_PATHS = NO;441                CLANG_ANALYZER_NONNULL = YES;442                CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;443                CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";444                CLANG_CXX_LIBRARY = "libc++";445                CLANG_ENABLE_MODULES = YES;446                CLANG_ENABLE_OBJC_ARC = YES;447                CLANG_ENABLE_OBJC_WEAK = YES;448                CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;449                CLANG_WARN_BOOL_CONVERSION = YES;450                CLANG_WARN_COMMA = YES;451                CLANG_WARN_CONSTANT_CONVERSION = YES;452                CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;453                CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;454                CLANG_WARN_DOCUMENTATION_COMMENTS = YES;455                CLANG_WARN_EMPTY_BODY = YES;456                CLANG_WARN_ENUM_CONVERSION = YES;457                CLANG_WARN_INFINITE_RECURSION = YES;458                CLANG_WARN_INT_CONVERSION = YES;459                CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;460                CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;461                CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;462                CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;463                CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;464                CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;465                CLANG_WARN_STRICT_PROTOTYPES = YES;466                CLANG_WARN_SUSPICIOUS_MOVE = YES;467                CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;468                CLANG_WARN_UNREACHABLE_CODE = YES;469                CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;470                COPY_PHASE_STRIP = NO;471                DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";472                ENABLE_NS_ASSERTIONS = NO;473                ENABLE_STRICT_OBJC_MSGSEND = YES;474                GCC_C_LANGUAGE_STANDARD = gnu11;475                GCC_NO_COMMON_BLOCKS = YES;476                GCC_WARN_64_TO_32_BIT_CONVERSION = YES;477                GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;478                GCC_WARN_UNDECLARED_SELECTOR = YES;479                GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;480                GCC_WARN_UNUSED_FUNCTION = YES;481                GCC_WARN_UNUSED_VARIABLE = YES;482                IPHONEOS_DEPLOYMENT_TARGET = 16.4;483                MTL_ENABLE_DEBUG_INFO = NO;484                MTL_FAST_MATH = YES;485                SDKROOT = iphoneos;486                SWIFT_COMPILATION_MODE = wholemodule;487                SWIFT_OPTIMIZATION_LEVEL = "-O";488                VALIDATE_PRODUCT = YES;489            };490            name = Release;491        };492        BBBBBBBBBBBBBBBBBBBBBBCCC /* Debug */ = {493            isa = XCBuildConfiguration;494            buildSettings = {495                ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;496                ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;497                CODE_SIGN_STYLE = Manual;498                DEVELOPMENT_TEAM = "";499                ENABLE_PREVIEWS = YES;500                FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)";501                INFOPLIST_FILE = "iOSLlamaTest/Info.plist";502                LD_RUNPATH_SEARCH_PATHS = (503                    "$(inherited)",504                    "@executable_path/Frameworks",505                );506                PRODUCT_BUNDLE_IDENTIFIER = "org.ggml.iOSLlamaTest";507                PRODUCT_NAME = "$(TARGET_NAME)";508                PROVISIONING_PROFILE_SPECIFIER = "";509                SWIFT_VERSION = 5.0;510                TARGETED_DEVICE_FAMILY = "1,2";511            };512            name = Debug;513        };514        CCCCCCCCCCCCCCCCCCCCCCDDD /* Release */ = {515            isa = XCBuildConfiguration;516            buildSettings = {517                ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;518                ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;519                CODE_SIGN_STYLE = Manual;520                DEVELOPMENT_TEAM = "";521                ENABLE_PREVIEWS = YES;522                FRAMEWORK_SEARCH_PATHS = (523                    "$(inherited)",524                    "$(PROJECT_DIR)",525                );526                INFOPLIST_FILE = "iOSLlamaTest/Info.plist";527                LD_RUNPATH_SEARCH_PATHS = (528                    "$(inherited)",529                    "@executable_path/Frameworks",530                );531                PRODUCT_BUNDLE_IDENTIFIER = "org.ggml.iOSLlamaTest";532                PRODUCT_NAME = "$(TARGET_NAME)";533                PROVISIONING_PROFILE_SPECIFIER = "";534                SWIFT_VERSION = 5.0;535                TARGETED_DEVICE_FAMILY = "1,2";536            };537            name = Release;538        };539/* End XCBuildConfiguration section */540EOF541 542# Finish the project.pbxproj file543cat >> "${TEMP_DIR}/${APP_NAME}/${APP_NAME}.xcodeproj/project.pbxproj" << EOF544/* Begin XCConfigurationList section */545        8888888888888888888888AA /* Build configuration list for PBXProject "${APP_NAME}" */ = {546            isa = XCConfigurationList;547            buildConfigurations = (548                9999999999999999999999AA /* Debug */,549                AAAAAAAAAAAAAAAAAAAAABBB /* Release */,550            );551            defaultConfigurationIsVisible = 0;552            defaultConfigurationName = Release;553        };554        4444444444444444444444AA /* Build configuration list for PBXNativeTarget "${APP_NAME}" */ = {555            isa = XCConfigurationList;556            buildConfigurations = (557                BBBBBBBBBBBBBBBBBBBBBBCCC /* Debug */,558                CCCCCCCCCCCCCCCCCCCCCCDDD /* Release */,559            );560            defaultConfigurationIsVisible = 0;561            defaultConfigurationName = Release;562        };563/* End XCConfigurationList section */564    };565    rootObject = 7777777777777777777777AA /* Project object */;566}567EOF568 569# 2. Copy XCFramework to test project570echo "Copying XCFramework to test project..."571cp -R "${XCFRAMEWORK_PATH}" "${TEMP_DIR}/${APP_NAME}/"572 573# 3. Build and archive the app574echo "Building and archiving test app..."575cd "${TEMP_DIR}/${APP_NAME}"576 577# Create a simple xcscheme file to avoid xcodebuild scheme issues578mkdir -p "${APP_NAME}.xcodeproj/xcshareddata/xcschemes"579cat > "${APP_NAME}.xcodeproj/xcshareddata/xcschemes/${APP_NAME}.xcscheme" << EOF580<?xml version="1.0" encoding="UTF-8"?>581<Scheme582   LastUpgradeVersion = "1240"583   version = "1.3">584   <BuildAction585      parallelizeBuildables = "YES"586      buildImplicitDependencies = "YES">587      <BuildActionEntries>588         <BuildActionEntry589            buildForTesting = "YES"590            buildForRunning = "YES"591            buildForProfiling = "YES"592            buildForArchiving = "YES"593            buildForAnalyzing = "YES">594            <BuildableReference595               BuildableIdentifier = "primary"596               BlueprintIdentifier = "3333333333333333333333AA"597               BuildableName = "${APP_NAME}.app"598               BlueprintName = "${APP_NAME}"599               ReferencedContainer = "container:${APP_NAME}.xcodeproj">600            </BuildableReference>601         </BuildActionEntry>602      </BuildActionEntries>603   </BuildAction>604   <TestAction605      buildConfiguration = "Debug"606      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"607      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"608      shouldUseLaunchSchemeArgsEnv = "YES">609      <Testables>610      </Testables>611   </TestAction>612   <LaunchAction613      buildConfiguration = "Debug"614      selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"615      selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"616      launchStyle = "0"617      useCustomWorkingDirectory = "NO"618      ignoresPersistentStateOnLaunch = "NO"619      debugDocumentVersioning = "YES"620      debugServiceExtension = "internal"621      allowLocationSimulation = "YES">622      <BuildableProductRunnable623         runnableDebuggingMode = "0">624         <BuildableReference625            BuildableIdentifier = "primary"626            BlueprintIdentifier = "3333333333333333333333AA"627            BuildableName = "${APP_NAME}.app"628            BlueprintName = "${APP_NAME}"629            ReferencedContainer = "container:${APP_NAME}.xcodeproj">630         </BuildableReference>631      </BuildableProductRunnable>632   </LaunchAction>633   <ProfileAction634      buildConfiguration = "Release"635      shouldUseLaunchSchemeArgsEnv = "YES"636      savedToolIdentifier = ""637      useCustomWorkingDirectory = "NO"638      debugDocumentVersioning = "YES">639      <BuildableProductRunnable640         runnableDebuggingMode = "0">641         <BuildableReference642            BuildableIdentifier = "primary"643            BlueprintIdentifier = "3333333333333333333333AA"644            BuildableName = "${APP_NAME}.app"645            BlueprintName = "${APP_NAME}"646            ReferencedContainer = "container:${APP_NAME}.xcodeproj">647         </BuildableReference>648      </BuildableProductRunnable>649   </ProfileAction>650   <AnalyzeAction651      buildConfiguration = "Debug">652   </AnalyzeAction>653   <ArchiveAction654      buildConfiguration = "Release"655      revealArchiveInOrganizer = "YES">656   </ArchiveAction>657</Scheme>658EOF659 660# Now use xcodebuild with an explicitly defined product name661xcodebuild -project "${APP_NAME}.xcodeproj" -scheme "${APP_NAME}" -sdk iphoneos -configuration Release archive -archivePath "${ARCHIVE_PATH}" CODE_SIGN_IDENTITY="-" CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO PRODUCT_NAME="${APP_NAME}" SWIFT_OPTIMIZATION_LEVEL="-Onone" -quiet662 663# 4. Create IPA from archive664echo "Creating IPA from archive..."665mkdir -p "${TEMP_DIR}/Payload"666cp -R "${ARCHIVE_PATH}/Products/Applications/${APP_NAME}.app" "${TEMP_DIR}/Payload/"667 668# Check and log app structure before zipping669echo "App structure:"670ls -la "${TEMP_DIR}/Payload/${APP_NAME}.app/"671echo "Frameworks:"672ls -la "${TEMP_DIR}/Payload/${APP_NAME}.app/Frameworks/" 2>/dev/null || echo "No Frameworks directory found"673 674cd "${TEMP_DIR}"675zip -r "${IPA_PATH}" Payload676 677# Check embedded provisioning profile678echo "Checking provisioning profile (if any)..."679PROVISIONING_PROFILE=$(find "${ARCHIVE_PATH}/Products/Applications/${APP_NAME}.app" -name "embedded.mobileprovision" 2>/dev/null)680if [ -n "$PROVISIONING_PROFILE" ]; then681    echo "Found embedded provisioning profile:"682    security cms -D -i "$PROVISIONING_PROFILE" || echo "Unable to decode provisioning profile"683else684    echo "No embedded provisioning profile found (expected for ad-hoc builds)"685fi686 687# 5. Validate the IPA688echo "Validating IPA..."689VALIDATION_OUTPUT="${VALIDATION_DIR}/validation_output.txt"690 691# Check if authentication credentials are provided692AUTH_ARGS=""693if [ -n "$APPLE_ID" ] && [ -n "$APPLE_PASSWORD" ]; then694    echo "Using Apple ID authentication for validation..."695    AUTH_ARGS="--username \"$APPLE_ID\" --password \"$APPLE_PASSWORD\""696else697    echo "No authentication credentials provided. Will perform basic validation."698    echo "To use your personal developer account, you can run the script with:"699    echo "  APPLE_ID='your.email@example.com' APPLE_PASSWORD='your-app-specific-password' ./validate-ios.sh"700    echo "Note: You need to create an app-specific password at https://appleid.apple.com/account/manage"701fi702 703# Run validation with detailed output704echo "Running validation with altool..."705if [ -n "$AUTH_ARGS" ]; then706    # Use eval to properly handle the quoted arguments707    eval "xcrun altool --validate-app -f \"${IPA_PATH}\" --type ios --output-format xml $AUTH_ARGS" 2>&1 | tee "${VALIDATION_OUTPUT}"708else709    xcrun altool --validate-app -f "${IPA_PATH}" --type ios --output-format xml 2>&1 | tee "${VALIDATION_OUTPUT}"710fi711VALIDATION_RESULT=$?712 713# Final validation result714FINAL_VALIDATION_RESULT=0715 716# Check if validation failed because the app isn't in App Store Connect717if grep -q "No suitable application records were found" "${VALIDATION_OUTPUT}"; then718    echo "⚠️ App Store Connect Warning: The app bundle identifier is not found in App Store Connect"719    echo "This is expected for apps that haven't been registered in App Store Connect yet."720    echo "This doesn't indicate a problem with the build or framework."721 722    # Perform alternative validation723    echo "Performing alternative validation checks..."724 725    # Check if IPA was created successfully726    if [ -f "${IPA_PATH}" ] && [ -s "${IPA_PATH}" ]; then727        echo "✅ IPA file created successfully"728    else729        echo "❌ IPA file not created or empty"730        FINAL_VALIDATION_RESULT=1731    fi732 733    # Check if app binary exists and is executable734    if [ -f "${TEMP_DIR}/Payload/${APP_NAME}.app/${APP_NAME}" ] && [ -x "${TEMP_DIR}/Payload/${APP_NAME}.app/${APP_NAME}" ]; then735        echo "✅ App binary exists and is executable"736    else737        echo "❌ App binary missing or not executable"738        FINAL_VALIDATION_RESULT=1739    fi740 741    # Check if framework was properly embedded742    if [ -d "${TEMP_DIR}/Payload/${APP_NAME}.app/Frameworks/llama.framework" ]; then743        echo "✅ llama.framework properly embedded"744    else745        echo "❌ llama.framework not properly embedded"746        FINAL_VALIDATION_RESULT=1747    fi748 749    # Check if framework binary exists750    if [ -f "${TEMP_DIR}/Payload/${APP_NAME}.app/Frameworks/llama.framework/llama" ]; then751        echo "✅ Framework binary exists"752 753        # Further validate framework by checking architecture754        ARCHS=$(lipo -info "${TEMP_DIR}/Payload/${APP_NAME}.app/Frameworks/llama.framework/llama" 2>/dev/null | grep -o "arm64\\|armv7\\|x86_64" | tr '\n' ' ')755        if [ -n "$ARCHS" ]; then756            echo "✅ Framework architecture(s): $ARCHS"757        else758            echo "⚠️ Could not determine framework architecture"759        fi760    else761        echo "❌ Framework binary missing"762        FINAL_VALIDATION_RESULT=1763    fi764 765    if [ $FINAL_VALIDATION_RESULT -eq 0 ]; then766        echo "✅ Alternative validation PASSED: App built successfully with embedded framework"767    else768        echo "❌ Alternative validation FAILED: Issues found with the app or framework"769    fi770elif grep -q "You must specify authentication credentials" "${VALIDATION_OUTPUT}" && [ -z "$AUTH_ARGS" ]; then771    echo "✅ iOS Validation PASSED: IPA successfully validated"772    echo "Results saved to ${VALIDATION_OUTPUT}"773else774    echo "❌ iOS Validation FAILED: IPA validation found issues"775    echo "See validation output at ${VALIDATION_OUTPUT}"776    echo ""777    echo "==== VALIDATION ERRORS ===="778 779    # Try to extract specific errors from the output780    if grep -q "Error" "${VALIDATION_OUTPUT}"; then781        grep -A 5 "Error" "${VALIDATION_OUTPUT}"782    else783        # If no specific error found, show the whole log784        cat "${VALIDATION_OUTPUT}"785    fi786 787    # Additional debugging: check IPA contents788    echo ""789    echo "==== IPA CONTENTS ===="790    mkdir -p "${TEMP_DIR}/ipa_contents"791    unzip -q "${IPA_PATH}" -d "${TEMP_DIR}/ipa_contents"792    ls -la "${TEMP_DIR}/ipa_contents/Payload/${APP_NAME}.app/"793 794    # Check for code signing issues795    echo ""796    echo "==== CODE SIGNING INFO ===="797    codesign -vv -d "${TEMP_DIR}/ipa_contents/Payload/${APP_NAME}.app" 2>&1 || echo "Code signing verification failed"798 799    # Check embedded frameworks800    echo ""801    echo "==== FRAMEWORK INFO ===="802    ls -la "${TEMP_DIR}/ipa_contents/Payload/${APP_NAME}.app/Frameworks/" 2>/dev/null || echo "No Frameworks directory found"803fi804 805# Don't clean up on error to allow inspection806if [ $FINAL_VALIDATION_RESULT -ne 0 ]; then807    echo ""808    echo "Temporary files kept for inspection at: ${TEMP_DIR}"809    echo "===== iOS Validation Process Failed ====="810    exit 1811fi812 813# Clean up temporary files but keep build artifacts814if [ $FINAL_VALIDATION_RESULT -eq 0 ]; then815    echo "Cleaning up temporary files..."816    #rm -rf "${TEMP_DIR}"817fi818 819echo "===== iOS Validation Process Completed ====="820exit $FINAL_VALIDATION_RESULT821