llama-cpp-capacitor 0.1.0 β†’ 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -121,6 +121,21 @@ cd android
121
121
  - **iOS**: `ios/build/LlamaCpp.framework/`
122
122
  - **Android**: `android/src/main/jniLibs/{arch}/libllama-cpp-{arch}.so`
123
123
 
124
+ ### **Updating the native source (e.g. for vision model support)**
125
+
126
+ The native `cpp/` layer is based on [llama.cpp](https://github.com/ggerganov/llama.cpp). To pull in a newer upstream version (e.g. for vision model support) **without overwriting** the Capacitor adapter code, use the **bootstrap script** (included in this repo):
127
+
128
+ ```bash
129
+ ./scripts/bootstrap.sh [branch-or-tag-or-commit]
130
+ # Example: ./scripts/bootstrap.sh master
131
+ ```
132
+
133
+ This syncs upstream into `cpp/` and keeps project-specific files (`cap-*.cpp/h`, `tools/mtmd/`, etc.) intact. After running it, reconcile any API changes in the adapter code, then rebuild with `npm run build:native` or `./build-native.sh`. See [cpp/README.md](cpp/README.md) and [docs/IOS_IMPLEMENTATION_GUIDE.md](docs/IOS_IMPLEMENTATION_GUIDE.md).
134
+
135
+ ### **iOS implementation (step-by-step)**
136
+
137
+ For a **step-by-step guide** on how methods are implemented on the iOS side (Swift bridge β†’ native framework, adding/updating C symbols, and updating the native layer for vision), see **[docs/IOS_IMPLEMENTATION_GUIDE.md](docs/IOS_IMPLEMENTATION_GUIDE.md)**.
138
+
124
139
  ### iOS Setup
125
140
 
126
141
  1. Install the plugin:
@@ -696,6 +711,17 @@ const logListener = addNativeLogListener((level, text) => {
696
711
  });
697
712
  ```
698
713
 
714
+ ## πŸ“¦ Publishing
715
+
716
+ To publish the package to npm:
717
+
718
+ 1. **Build** (runs automatically on `npm publish` via `prepublishOnly`): `npm run build` β€” produces `dist/` (plugin bundles, ESM, docs).
719
+ 2. **Optional β€” include native libs in the tarball**: `npm run build:all` (requires macOS/NDK) β€” builds iOS framework and Android `.so` into `ios/Frameworks` and `android/src/main/jniLibs`.
720
+ 3. **Verify pack**: `npm run pack` (JS only) or `npm run pack:full` (JS + native) β€” lists files that would be published.
721
+ 4. **Publish**: `npm publish`.
722
+
723
+ See [NPM_PUBLISH_GUIDE.md](NPM_PUBLISH_GUIDE.md) for 2FA/token setup and troubleshooting.
724
+
699
725
  ## 🀝 Contributing
700
726
 
701
727
  We welcome contributions! Please see our [Contributing Guide](CONTRIBUTING.md) for details.
@@ -0,0 +1,229 @@
1
+ #!/bin/bash
2
+
3
+ # Build script for llama-cpp Capacitor plugin
4
+ # This script compiles the native llama.cpp library for iOS and Android
5
+
6
+ set -e
7
+
8
+ # Colors for output
9
+ RED='\033[0;31m'
10
+ GREEN='\033[0;32m'
11
+ YELLOW='\033[1;33m'
12
+ BLUE='\033[0;34m'
13
+ NC='\033[0m' # No Color
14
+
15
+ # Function to print colored output
16
+ print_status() {
17
+ echo -e "${BLUE}[INFO]${NC} $1"
18
+ }
19
+
20
+ print_success() {
21
+ echo -e "${GREEN}[SUCCESS]${NC} $1"
22
+ }
23
+
24
+ print_warning() {
25
+ echo -e "${YELLOW}[WARNING]${NC} $1"
26
+ }
27
+
28
+ print_error() {
29
+ echo -e "${RED}[ERROR]${NC} $1"
30
+ }
31
+
32
+ # Check if we're on macOS for iOS builds
33
+ check_macos() {
34
+ if [[ "$OSTYPE" != "darwin"* ]]; then
35
+ print_warning "iOS builds require macOS. Skipping iOS build."
36
+ return 1
37
+ fi
38
+ return 0
39
+ }
40
+
41
+ # Check if Android SDK is available
42
+ check_android_sdk() {
43
+ if [ -z "$ANDROID_HOME" ] && [ -z "$ANDROID_SDK_ROOT" ]; then
44
+ print_warning "Android SDK not found. Please set ANDROID_HOME or ANDROID_SDK_ROOT."
45
+ print_warning "Skipping Android build."
46
+ return 1
47
+ fi
48
+ return 0
49
+ }
50
+
51
+ # Detect NDK path: ndk/<version>/build/cmake/android.toolchain.cmake
52
+ # Uses latest versioned NDK under $ANDROID_SDK/ndk/ (e.g. ndk/29.0.13113456).
53
+ detect_ndk() {
54
+ local sdk="${ANDROID_HOME:-$ANDROID_SDK_ROOT}"
55
+ local ndk_root="$sdk/ndk"
56
+ if [ ! -d "$ndk_root" ]; then
57
+ echo ""
58
+ return 1
59
+ fi
60
+ local latest=""
61
+ local latest_ver=0
62
+ for v in "$ndk_root"/*; do
63
+ [ -d "$v" ] || continue
64
+ local base=$(basename "$v")
65
+ if [[ "$base" =~ ^[0-9] ]]; then
66
+ local ver=$(echo "$base" | sed 's/[^0-9]//g' | head -c 10)
67
+ ver=${ver:-0}
68
+ if [ "$ver" -gt "$latest_ver" ] 2>/dev/null; then
69
+ latest_ver=$ver
70
+ latest=$v
71
+ fi
72
+ fi
73
+ done
74
+ if [ -n "$latest" ] && [ -f "$latest/build/cmake/android.toolchain.cmake" ]; then
75
+ echo "$latest"
76
+ return 0
77
+ fi
78
+ echo ""
79
+ return 1
80
+ }
81
+
82
+ # Build iOS library
83
+ build_ios() {
84
+ print_status "Building iOS library..."
85
+
86
+ if ! check_macos; then
87
+ return 1
88
+ fi
89
+
90
+ # Always start from a clean iOS build directory to avoid stale Xcode settings
91
+ rm -rf ios/build
92
+ mkdir -p ios/build
93
+ cd ios/build
94
+
95
+ # Configure with CMake
96
+ # IMPORTANT: build iOS framework as **ARM64-only**.
97
+ # Including x86_64 here makes CMake/Xcode try to link an x86_64 slice,
98
+ # but we only compile ARM-specific kernels (arch/arm), which leads to
99
+ # undefined symbols like lm_ggml_gemm_* for x86_64.
100
+ cmake .. \
101
+ -DCMAKE_BUILD_TYPE=Release \
102
+ -DCMAKE_OSX_ARCHITECTURES="arm64" \
103
+ -DCMAKE_OSX_DEPLOYMENT_TARGET=13.0 \
104
+ -DCMAKE_XCODE_ATTRIBUTE_ENABLE_BITCODE=NO
105
+
106
+ # Build
107
+ cmake --build . --config Release
108
+
109
+ # CMake builds the framework directly (FRAMEWORK TRUE in CMakeLists.txt)
110
+ # Verify the framework was created
111
+ if [ -d "llama-cpp.framework" ]; then
112
+ print_success "iOS framework built successfully at: $(pwd)/llama-cpp.framework"
113
+
114
+ # Strip debug symbols to reduce app store size (~0.5–1 MB)
115
+ BINARY="llama-cpp.framework/Versions/A/llama-cpp"
116
+ if [ -f "$BINARY" ]; then
117
+ if xcrun strip -x -S "$BINARY" 2>/dev/null; then
118
+ print_status "Stripped debug symbols from iOS framework"
119
+ fi
120
+ fi
121
+
122
+ # Copy framework to package location for npm publishing
123
+ mkdir -p ../Frameworks
124
+ cp -R llama-cpp.framework ../Frameworks/
125
+ print_success "iOS framework copied to ios/Frameworks/ for npm package"
126
+ else
127
+ print_error "iOS framework not found after build"
128
+ cd ../..
129
+ return 1
130
+ fi
131
+
132
+ cd ../..
133
+ }
134
+
135
+ # Build Android library
136
+ build_android() {
137
+ print_status "Building Android library..."
138
+
139
+ if ! check_android_sdk; then
140
+ return 1
141
+ fi
142
+
143
+ ANDROID_NDK=$(detect_ndk)
144
+ if [ -z "$ANDROID_NDK" ]; then
145
+ print_error "Android NDK not found. Install NDK via Android Studio (SDK Manager β†’ NDK)."
146
+ print_error "Expected: \$ANDROID_HOME/ndk/<version>/build/cmake/android.toolchain.cmake"
147
+ return 1
148
+ fi
149
+ print_status "Using NDK: $ANDROID_NDK"
150
+
151
+ TOOLCHAIN_FILE="$ANDROID_NDK/build/cmake/android.toolchain.cmake"
152
+ if [ ! -f "$TOOLCHAIN_FILE" ]; then
153
+ print_error "Toolchain file not found: $TOOLCHAIN_FILE"
154
+ return 1
155
+ fi
156
+
157
+ rm -rf android/build
158
+ mkdir -p android/build
159
+ cd android/build
160
+
161
+ # Build only arm64-v8a to minimize app store size.
162
+ # build.gradle uses abiFilters 'arm64-v8a'; armeabi-v7a is not included in the app.
163
+ # Skipping armeabi-v7a saves ~25–48 MB in package and keeps app size minimal.
164
+ arch="arm64-v8a"
165
+ print_status "Building for $arch (only ABI shipped in app)..."
166
+ rm -rf CMakeCache.txt CMakeFiles Makefile cmake_install.cmake 2>/dev/null || true
167
+ find . -maxdepth 1 -name '*.so' -delete 2>/dev/null || true
168
+
169
+ cmake ../src/main \
170
+ -DCMAKE_BUILD_TYPE=Release \
171
+ -DANDROID_ABI=$arch \
172
+ -DANDROID_PLATFORM=android-21 \
173
+ -DCMAKE_TOOLCHAIN_FILE="$TOOLCHAIN_FILE" \
174
+ -DANDROID_STL=c++_shared
175
+
176
+ cmake --build . --config Release
177
+
178
+ mkdir -p ../src/main/jniLibs/$arch
179
+ if [ -f "libllama-cpp-arm64.so" ]; then
180
+ PREBUILT="$ANDROID_NDK/toolchains/llvm/prebuilt"
181
+ if [ -d "$PREBUILT/darwin-x86_64" ]; then
182
+ STRIP_TOOL="$PREBUILT/darwin-x86_64/bin/llvm-strip"
183
+ elif [ -d "$PREBUILT/darwin-aarch64" ]; then
184
+ STRIP_TOOL="$PREBUILT/darwin-aarch64/bin/llvm-strip"
185
+ else
186
+ STRIP_TOOL=$(find "$ANDROID_NDK/toolchains" -name "llvm-strip" -type f 2>/dev/null | head -1)
187
+ fi
188
+ if [ -f "$STRIP_TOOL" ]; then
189
+ "$STRIP_TOOL" --strip-debug libllama-cpp-arm64.so
190
+ print_status "Stripped debug symbols from library"
191
+ fi
192
+ cp "libllama-cpp-arm64.so" "../src/main/jniLibs/$arch/"
193
+ fi
194
+ print_success "Built for $arch"
195
+
196
+ print_success "Android library built successfully"
197
+ cd ../..
198
+ }
199
+
200
+ # Main build function
201
+ main() {
202
+ print_status "Starting llama-cpp Capacitor plugin build..."
203
+
204
+ # Check dependencies
205
+ if ! command -v cmake &> /dev/null; then
206
+ print_error "CMake is required but not installed"
207
+ exit 1
208
+ fi
209
+
210
+ if ! command -v make &> /dev/null; then
211
+ print_error "Make is required but not installed"
212
+ exit 1
213
+ fi
214
+
215
+ # Build iOS
216
+ if check_macos; then
217
+ build_ios
218
+ fi
219
+
220
+ # Build Android
221
+ if check_android_sdk; then
222
+ build_android
223
+ fi
224
+
225
+ print_success "Build completed successfully!"
226
+ }
227
+
228
+ # Run main function
229
+ main "$@"
package/cpp/README.md CHANGED
@@ -1,4 +1,15 @@
1
1
  # Note
2
2
 
3
- - Only `rn-tts.h`, `rn-tts.cpp`, `rn-mtmd.hpp`, `rn-mtmd.cpp`, `rn-llama.h` and `rn-llama.cpp` are the specific files for this folder, others are sync from [llama.cpp](https://github.com/ggerganov/llama.cpp).
4
- - We can update the native source by using the [bootstrap](../scripts/bootstrap.sh) script.
3
+ - The **project-specific** files in this folder (never overwritten by bootstrap) are:
4
+ - `cap-llama.cpp` / `cap-llama.h` – Capacitor bridge (context, model load)
5
+ - `cap-completion.cpp` / `cap-completion.h` – completion
6
+ - `cap-tts.cpp` / `cap-tts.h` – TTS
7
+ - `cap-embedding.cpp` / `cap-embedding.h` – embeddings
8
+ - `cap-mtmd.hpp` – multimodal/vision
9
+ - `tools/mtmd/` – multimodal/vision tooling
10
+ - All other sources are synced from [llama.cpp](https://github.com/ggerganov/llama.cpp).
11
+ - **Update native source** (e.g. for a newer llama.cpp or vision support): run from repo root:
12
+ ```bash
13
+ ./scripts/bootstrap.sh [branch-or-tag-or-commit]
14
+ ```
15
+ See [scripts/bootstrap.sh](../scripts/bootstrap.sh) and [docs/IOS_IMPLEMENTATION_GUIDE.md](../docs/IOS_IMPLEMENTATION_GUIDE.md).
@@ -0,0 +1,149 @@
1
+ cmake_minimum_required(VERSION 3.16)
2
+ project(llama-cpp VERSION 1.0.0 LANGUAGES CXX C)
3
+
4
+ set(CMAKE_CXX_STANDARD 17)
5
+ set(CMAKE_CXX_STANDARD_REQUIRED ON)
6
+
7
+ # iOS specific settings for ARM64 devices
8
+ set(CMAKE_OSX_DEPLOYMENT_TARGET 13.0)
9
+ set(CMAKE_XCODE_ATTRIBUTE_ENABLE_BITCODE NO)
10
+
11
+ # Common llama.cpp definitions
12
+ add_definitions(
13
+ -DNDEBUG
14
+ -DO3
15
+ -DLM_GGML_USE_CPU
16
+ -DLM_GGML_USE_ACCELERATE
17
+ -DLM_GGML_USE_METAL
18
+ -DLM_GGML_METAL_USE_BF16
19
+ )
20
+
21
+ set(SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../cpp)
22
+
23
+ # ARM64‑tuned ggml sources
24
+ set(SOURCE_FILES_ARCH
25
+ ${SOURCE_DIR}/ggml-cpu/arch/arm/quants.c
26
+ ${SOURCE_DIR}/ggml-cpu/arch/arm/repack.cpp
27
+ )
28
+
29
+ # Define public headers
30
+ set(PUBLIC_HEADERS
31
+ ${SOURCE_DIR}/cap-llama.h
32
+ ${SOURCE_DIR}/cap-completion.h
33
+ ${SOURCE_DIR}/cap-tts.h
34
+ ${SOURCE_DIR}/llama.h
35
+ ${SOURCE_DIR}/ggml.h
36
+ )
37
+
38
+ # Create library target
39
+ add_library(llama-cpp SHARED
40
+ ${SOURCE_DIR}/ggml.c
41
+ ${SOURCE_DIR}/ggml-alloc.c
42
+ ${SOURCE_DIR}/ggml-backend.cpp
43
+ ${SOURCE_DIR}/ggml-backend-reg.cpp
44
+ ${SOURCE_DIR}/ggml-cpu/amx/amx.cpp
45
+ ${SOURCE_DIR}/ggml-cpu/amx/mmq.cpp
46
+ ${SOURCE_DIR}/ggml-cpu/ggml-cpu.c
47
+ ${SOURCE_DIR}/ggml-cpu/ggml-cpu.cpp
48
+ ${SOURCE_DIR}/ggml-cpu/quants.c
49
+ ${SOURCE_DIR}/ggml-cpu/traits.cpp
50
+ ${SOURCE_DIR}/ggml-cpu/repack.cpp
51
+ ${SOURCE_DIR}/ggml-cpu/unary-ops.cpp
52
+ ${SOURCE_DIR}/ggml-cpu/binary-ops.cpp
53
+ ${SOURCE_DIR}/ggml-cpu/vec.cpp
54
+ ${SOURCE_DIR}/ggml-cpu/ops.cpp
55
+ ${SOURCE_DIR}/ggml-metal.m
56
+ ${SOURCE_DIR}/ggml-opt.cpp
57
+ ${SOURCE_DIR}/ggml-threading.cpp
58
+ ${SOURCE_DIR}/ggml-quants.c
59
+ ${SOURCE_DIR}/gguf.cpp
60
+ ${SOURCE_DIR}/log.cpp
61
+ ${SOURCE_DIR}/llama-impl.cpp
62
+ ${SOURCE_DIR}/llama-grammar.cpp
63
+ ${SOURCE_DIR}/llama-sampling.cpp
64
+ ${SOURCE_DIR}/llama-vocab.cpp
65
+ ${SOURCE_DIR}/llama-adapter.cpp
66
+ ${SOURCE_DIR}/llama-chat.cpp
67
+ ${SOURCE_DIR}/llama-context.cpp
68
+ ${SOURCE_DIR}/llama-arch.cpp
69
+ ${SOURCE_DIR}/llama-batch.cpp
70
+ ${SOURCE_DIR}/llama-cparams.cpp
71
+ ${SOURCE_DIR}/llama-hparams.cpp
72
+ ${SOURCE_DIR}/llama.cpp
73
+ ${SOURCE_DIR}/llama-model.cpp
74
+ ${SOURCE_DIR}/llama-model-loader.cpp
75
+ ${SOURCE_DIR}/llama-model-saver.cpp
76
+ ${SOURCE_DIR}/llama-mmap.cpp
77
+ ${SOURCE_DIR}/llama-kv-cache.cpp
78
+ ${SOURCE_DIR}/llama-kv-cache-iswa.cpp
79
+ ${SOURCE_DIR}/llama-memory-hybrid.cpp
80
+ ${SOURCE_DIR}/llama-memory-recurrent.cpp
81
+ ${SOURCE_DIR}/llama-memory.cpp
82
+ ${SOURCE_DIR}/llama-io.cpp
83
+ ${SOURCE_DIR}/llama-graph.cpp
84
+ ${SOURCE_DIR}/sampling.cpp
85
+ ${SOURCE_DIR}/unicode-data.cpp
86
+ ${SOURCE_DIR}/unicode.cpp
87
+ ${SOURCE_DIR}/common.cpp
88
+ ${SOURCE_DIR}/chat.cpp
89
+ # Additional sources required for JSON parsing, chat parser, and mtmd tools
90
+ ${SOURCE_DIR}/chat-parser.cpp
91
+ ${SOURCE_DIR}/regex-partial.cpp
92
+ ${SOURCE_DIR}/json-partial.cpp
93
+ ${SOURCE_DIR}/json-schema-to-grammar.cpp
94
+ ${SOURCE_DIR}/anyascii.c
95
+ ${SOURCE_DIR}/tools/mtmd/mtmd.cpp
96
+ ${SOURCE_DIR}/tools/mtmd/mtmd-helper.cpp
97
+ ${SOURCE_DIR}/tools/mtmd/mtmd-audio.cpp
98
+ ${SOURCE_DIR}/tools/mtmd/clip.cpp
99
+ ${SOURCE_DIR}/cap-llama.cpp
100
+ ${SOURCE_DIR}/cap-completion.cpp
101
+ ${SOURCE_DIR}/cap-tts.cpp
102
+ ${SOURCE_FILES_ARCH}
103
+ )
104
+
105
+ # Set target properties
106
+ set_target_properties(llama-cpp PROPERTIES
107
+ FRAMEWORK TRUE
108
+ FRAMEWORK_VERSION A
109
+ MACOSX_FRAMEWORK_IDENTIFIER com.arusatech.llama-cpp
110
+ MACOSX_FRAMEWORK_BUNDLE_VERSION 1.0.0
111
+ MACOSX_FRAMEWORK_SHORT_VERSION_STRING 1.0.0
112
+ XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer"
113
+ XCODE_ATTRIBUTE_DEVELOPMENT_TEAM ""
114
+ XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH NO
115
+ XCODE_ATTRIBUTE_ENABLE_BITCODE NO
116
+ )
117
+
118
+ # Include directories
119
+ target_include_directories(llama-cpp PRIVATE
120
+ ${SOURCE_DIR}
121
+ ${SOURCE_DIR}/ggml-cpu
122
+ ${SOURCE_DIR}/tools/mtmd
123
+ )
124
+
125
+ # ARM64: rely on Clang's default tuning; no x86‑specific -march flags here
126
+
127
+ # Link frameworks via linker flags
128
+ target_link_options(llama-cpp PRIVATE
129
+ "-Wl,-framework,Accelerate"
130
+ "-Wl,-framework,Metal"
131
+ "-Wl,-framework,MetalKit"
132
+ "-Wl,-framework,Foundation"
133
+ "-Wl,-framework,CoreGraphics"
134
+ )
135
+
136
+ # Public headers
137
+ set_target_properties(llama-cpp PROPERTIES
138
+ PUBLIC_HEADER "${PUBLIC_HEADERS}"
139
+ )
140
+
141
+ # Install rules
142
+ install(TARGETS llama-cpp
143
+ FRAMEWORK DESTINATION .
144
+ )
145
+
146
+ message(STATUS "Building llama-cpp for ARM64 (devices)")
147
+ message(STATUS "Source directory: ${SOURCE_DIR}")
148
+ message(STATUS "Architecture: arm64")
149
+
@@ -0,0 +1,176 @@
1
+ cmake_minimum_required(VERSION 3.16)
2
+ project(llama-cpp VERSION 1.0.0 LANGUAGES CXX C)
3
+
4
+ set(CMAKE_CXX_STANDARD 17)
5
+ set(CMAKE_CXX_STANDARD_REQUIRED ON)
6
+
7
+ # iOS specific settings for x86_64 emulator
8
+ set(CMAKE_OSX_DEPLOYMENT_TARGET 13.0)
9
+ set(CMAKE_XCODE_ATTRIBUTE_ENABLE_BITCODE NO)
10
+
11
+ # Dependencies and compile options optimized for x86_64
12
+ add_definitions(
13
+ -DNDEBUG
14
+ -DO3
15
+ -DLM_GGML_USE_CPU
16
+ -DLM_GGML_USE_ACCELERATE
17
+ -DLM_GGML_USE_METAL
18
+ -DLM_GGML_METAL_USE_BF16
19
+ )
20
+
21
+ # X86_64 specific optimizations for emulator
22
+ add_definitions(-DLM_GGML_CPU_GENERIC)
23
+ add_definitions(-DLM_GGML_USE_AVX2)
24
+ add_definitions(-DLM_GGML_USE_AVX)
25
+ add_definitions(-DLM_GGML_USE_SSE3)
26
+ add_definitions(-DLM_GGML_USE_SSE)
27
+ add_definitions(-DLM_GGML_USE_F16C)
28
+ add_definitions(-DLM_GGML_USE_FMA)
29
+
30
+ set(SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../cpp)
31
+
32
+ # Use x86_64 optimized source files for emulator
33
+ set(SOURCE_FILES_ARCH
34
+ ${SOURCE_DIR}/ggml-cpu/arch/x86/quants.c
35
+ ${SOURCE_DIR}/ggml-cpu/arch/x86/repack.cpp
36
+ )
37
+
38
+ # Define public headers
39
+ set(PUBLIC_HEADERS
40
+ ${SOURCE_DIR}/cap-llama.h
41
+ ${SOURCE_DIR}/cap-completion.h
42
+ ${SOURCE_DIR}/cap-tts.h
43
+ ${SOURCE_DIR}/llama.h
44
+ ${SOURCE_DIR}/ggml.h
45
+ )
46
+
47
+ # Create library target
48
+ add_library(llama-cpp SHARED
49
+ ${SOURCE_DIR}/ggml.c
50
+ ${SOURCE_DIR}/ggml-alloc.c
51
+ ${SOURCE_DIR}/ggml-backend.cpp
52
+ ${SOURCE_DIR}/ggml-backend-reg.cpp
53
+ ${SOURCE_DIR}/ggml-cpu/amx/amx.cpp
54
+ ${SOURCE_DIR}/ggml-cpu/amx/mmq.cpp
55
+ ${SOURCE_DIR}/ggml-cpu/ggml-cpu.c
56
+ ${SOURCE_DIR}/ggml-cpu/ggml-cpu.cpp
57
+ ${SOURCE_DIR}/ggml-cpu/quants.c
58
+ ${SOURCE_DIR}/ggml-cpu/traits.cpp
59
+ ${SOURCE_DIR}/ggml-cpu/repack.cpp
60
+ ${SOURCE_DIR}/ggml-cpu/unary-ops.cpp
61
+ ${SOURCE_DIR}/ggml-cpu/binary-ops.cpp
62
+ ${SOURCE_DIR}/ggml-cpu/vec.cpp
63
+ ${SOURCE_DIR}/ggml-cpu/ops.cpp
64
+ ${SOURCE_DIR}/ggml-metal.m
65
+ ${SOURCE_DIR}/ggml-opt.cpp
66
+ ${SOURCE_DIR}/ggml-threading.cpp
67
+ ${SOURCE_DIR}/ggml-quants.c
68
+ ${SOURCE_DIR}/gguf.cpp
69
+ ${SOURCE_DIR}/log.cpp
70
+ ${SOURCE_DIR}/llama-impl.cpp
71
+ ${SOURCE_DIR}/llama-grammar.cpp
72
+ ${SOURCE_DIR}/llama-sampling.cpp
73
+ ${SOURCE_DIR}/llama-vocab.cpp
74
+ ${SOURCE_DIR}/llama-adapter.cpp
75
+ ${SOURCE_DIR}/llama-chat.cpp
76
+ ${SOURCE_DIR}/llama-context.cpp
77
+ ${SOURCE_DIR}/llama-arch.cpp
78
+ ${SOURCE_DIR}/llama-batch.cpp
79
+ ${SOURCE_DIR}/llama-cparams.cpp
80
+ ${SOURCE_DIR}/llama-hparams.cpp
81
+ ${SOURCE_DIR}/llama.cpp
82
+ ${SOURCE_DIR}/llama-model.cpp
83
+ ${SOURCE_DIR}/llama-model-loader.cpp
84
+ ${SOURCE_DIR}/llama-model-saver.cpp
85
+ ${SOURCE_DIR}/llama-mmap.cpp
86
+ ${SOURCE_DIR}/llama-kv-cache.cpp
87
+ ${SOURCE_DIR}/llama-kv-cache-iswa.cpp
88
+ ${SOURCE_DIR}/llama-memory-hybrid.cpp
89
+ ${SOURCE_DIR}/llama-memory-recurrent.cpp
90
+ ${SOURCE_DIR}/llama-memory.cpp
91
+ ${SOURCE_DIR}/llama-io.cpp
92
+ ${SOURCE_DIR}/llama-graph.cpp
93
+ ${SOURCE_DIR}/sampling.cpp
94
+ ${SOURCE_DIR}/unicode-data.cpp
95
+ ${SOURCE_DIR}/unicode.cpp
96
+ ${SOURCE_DIR}/common.cpp
97
+ ${SOURCE_DIR}/chat.cpp
98
+ # Additional sources required for JSON parsing, chat parser, and mtmd tools
99
+ ${SOURCE_DIR}/chat-parser.cpp
100
+ ${SOURCE_DIR}/regex-partial.cpp
101
+ ${SOURCE_DIR}/json-partial.cpp
102
+ ${SOURCE_DIR}/json-schema-to-grammar.cpp
103
+ ${SOURCE_DIR}/anyascii.c
104
+ ${SOURCE_DIR}/tools/mtmd/mtmd.cpp
105
+ ${SOURCE_DIR}/tools/mtmd/mtmd-helper.cpp
106
+ ${SOURCE_DIR}/tools/mtmd/mtmd-audio.cpp
107
+ ${SOURCE_DIR}/tools/mtmd/clip.cpp
108
+ ${SOURCE_DIR}/minja/minja.hpp
109
+ ${SOURCE_DIR}/minja/chat-template.hpp
110
+ ${SOURCE_DIR}/nlohmann/json.hpp
111
+ ${SOURCE_DIR}/nlohmann/json_fwd.hpp
112
+ ${SOURCE_DIR}/cap-llama.cpp
113
+ ${SOURCE_DIR}/cap-completion.cpp
114
+ ${SOURCE_DIR}/cap-tts.cpp
115
+ ${SOURCE_FILES_ARCH}
116
+ )
117
+
118
+ # Set target properties
119
+ set_target_properties(llama-cpp PROPERTIES
120
+ FRAMEWORK TRUE
121
+ FRAMEWORK_VERSION A
122
+ MACOSX_FRAMEWORK_IDENTIFIER com.arusatech.llama-cpp
123
+ MACOSX_FRAMEWORK_BUNDLE_VERSION 1.0.0
124
+ MACOSX_FRAMEWORK_SHORT_VERSION_STRING 1.0.0
125
+ XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer"
126
+ XCODE_ATTRIBUTE_DEVELOPMENT_TEAM ""
127
+ XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH NO
128
+ XCODE_ATTRIBUTE_ENABLE_BITCODE NO
129
+ )
130
+
131
+ # Set include directories
132
+ target_include_directories(llama-cpp PRIVATE
133
+ ${SOURCE_DIR}
134
+ ${SOURCE_DIR}/ggml-cpu
135
+ ${SOURCE_DIR}/tools/mtmd
136
+ )
137
+
138
+ # Set compile options for x86_64 optimization
139
+ target_compile_options(llama-cpp PRIVATE
140
+ -march=x86-64
141
+ -mtune=generic
142
+ -mavx2
143
+ -mavx
144
+ -msse3
145
+ -msse
146
+ -mfma
147
+ -mf16c
148
+ )
149
+
150
+ # Set link options
151
+ # NOTE:
152
+ # Use -Wl,-framework,<Name> so that the compiler driver passes the correct
153
+ # framework flags through to the linker as a single option.
154
+ target_link_options(llama-cpp PRIVATE
155
+ "-Wl,-framework,Accelerate"
156
+ "-Wl,-framework,Metal"
157
+ "-Wl,-framework,MetalKit"
158
+ "-Wl,-framework,Foundation"
159
+ "-Wl,-framework,CoreGraphics"
160
+ )
161
+
162
+ # Set public headers
163
+ set_target_properties(llama-cpp PROPERTIES
164
+ PUBLIC_HEADER "${PUBLIC_HEADERS}"
165
+ )
166
+
167
+ # Install rules
168
+ install(TARGETS llama-cpp
169
+ FRAMEWORK DESTINATION .
170
+ )
171
+
172
+ # Print build information
173
+ message(STATUS "Building llama-cpp for x86_64 (emulator)")
174
+ message(STATUS "Source directory: ${SOURCE_DIR}")
175
+ message(STATUS "Architecture: x86_64")
176
+ message(STATUS "Optimizations: AVX2, AVX, SSE3, SSE, FMA, F16C")
@@ -0,0 +1,149 @@
1
+ cmake_minimum_required(VERSION 3.16)
2
+ project(llama-cpp VERSION 1.0.0 LANGUAGES CXX C)
3
+
4
+ set(CMAKE_CXX_STANDARD 17)
5
+ set(CMAKE_CXX_STANDARD_REQUIRED ON)
6
+
7
+ # iOS specific settings for ARM64 devices
8
+ set(CMAKE_OSX_DEPLOYMENT_TARGET 13.0)
9
+ set(CMAKE_XCODE_ATTRIBUTE_ENABLE_BITCODE NO)
10
+
11
+ # Common llama.cpp definitions
12
+ add_definitions(
13
+ -DNDEBUG
14
+ -DO3
15
+ -DLM_GGML_USE_CPU
16
+ -DLM_GGML_USE_ACCELERATE
17
+ -DLM_GGML_USE_METAL
18
+ -DLM_GGML_METAL_USE_BF16
19
+ )
20
+
21
+ set(SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../cpp)
22
+
23
+ # ARM64‑tuned ggml sources
24
+ set(SOURCE_FILES_ARCH
25
+ ${SOURCE_DIR}/ggml-cpu/arch/arm/quants.c
26
+ ${SOURCE_DIR}/ggml-cpu/arch/arm/repack.cpp
27
+ )
28
+
29
+ # Define public headers
30
+ set(PUBLIC_HEADERS
31
+ ${SOURCE_DIR}/cap-llama.h
32
+ ${SOURCE_DIR}/cap-completion.h
33
+ ${SOURCE_DIR}/cap-tts.h
34
+ ${SOURCE_DIR}/llama.h
35
+ ${SOURCE_DIR}/ggml.h
36
+ )
37
+
38
+ # Create library target
39
+ add_library(llama-cpp SHARED
40
+ ${SOURCE_DIR}/ggml.c
41
+ ${SOURCE_DIR}/ggml-alloc.c
42
+ ${SOURCE_DIR}/ggml-backend.cpp
43
+ ${SOURCE_DIR}/ggml-backend-reg.cpp
44
+ ${SOURCE_DIR}/ggml-cpu/amx/amx.cpp
45
+ ${SOURCE_DIR}/ggml-cpu/amx/mmq.cpp
46
+ ${SOURCE_DIR}/ggml-cpu/ggml-cpu.c
47
+ ${SOURCE_DIR}/ggml-cpu/ggml-cpu.cpp
48
+ ${SOURCE_DIR}/ggml-cpu/quants.c
49
+ ${SOURCE_DIR}/ggml-cpu/traits.cpp
50
+ ${SOURCE_DIR}/ggml-cpu/repack.cpp
51
+ ${SOURCE_DIR}/ggml-cpu/unary-ops.cpp
52
+ ${SOURCE_DIR}/ggml-cpu/binary-ops.cpp
53
+ ${SOURCE_DIR}/ggml-cpu/vec.cpp
54
+ ${SOURCE_DIR}/ggml-cpu/ops.cpp
55
+ ${SOURCE_DIR}/ggml-metal.m
56
+ ${SOURCE_DIR}/ggml-opt.cpp
57
+ ${SOURCE_DIR}/ggml-threading.cpp
58
+ ${SOURCE_DIR}/ggml-quants.c
59
+ ${SOURCE_DIR}/gguf.cpp
60
+ ${SOURCE_DIR}/log.cpp
61
+ ${SOURCE_DIR}/llama-impl.cpp
62
+ ${SOURCE_DIR}/llama-grammar.cpp
63
+ ${SOURCE_DIR}/llama-sampling.cpp
64
+ ${SOURCE_DIR}/llama-vocab.cpp
65
+ ${SOURCE_DIR}/llama-adapter.cpp
66
+ ${SOURCE_DIR}/llama-chat.cpp
67
+ ${SOURCE_DIR}/llama-context.cpp
68
+ ${SOURCE_DIR}/llama-arch.cpp
69
+ ${SOURCE_DIR}/llama-batch.cpp
70
+ ${SOURCE_DIR}/llama-cparams.cpp
71
+ ${SOURCE_DIR}/llama-hparams.cpp
72
+ ${SOURCE_DIR}/llama.cpp
73
+ ${SOURCE_DIR}/llama-model.cpp
74
+ ${SOURCE_DIR}/llama-model-loader.cpp
75
+ ${SOURCE_DIR}/llama-model-saver.cpp
76
+ ${SOURCE_DIR}/llama-mmap.cpp
77
+ ${SOURCE_DIR}/llama-kv-cache.cpp
78
+ ${SOURCE_DIR}/llama-kv-cache-iswa.cpp
79
+ ${SOURCE_DIR}/llama-memory-hybrid.cpp
80
+ ${SOURCE_DIR}/llama-memory-recurrent.cpp
81
+ ${SOURCE_DIR}/llama-memory.cpp
82
+ ${SOURCE_DIR}/llama-io.cpp
83
+ ${SOURCE_DIR}/llama-graph.cpp
84
+ ${SOURCE_DIR}/sampling.cpp
85
+ ${SOURCE_DIR}/unicode-data.cpp
86
+ ${SOURCE_DIR}/unicode.cpp
87
+ ${SOURCE_DIR}/common.cpp
88
+ ${SOURCE_DIR}/chat.cpp
89
+ # Additional sources required for JSON parsing, chat parser, and mtmd tools
90
+ ${SOURCE_DIR}/chat-parser.cpp
91
+ ${SOURCE_DIR}/regex-partial.cpp
92
+ ${SOURCE_DIR}/json-partial.cpp
93
+ ${SOURCE_DIR}/json-schema-to-grammar.cpp
94
+ ${SOURCE_DIR}/anyascii.c
95
+ ${SOURCE_DIR}/tools/mtmd/mtmd.cpp
96
+ ${SOURCE_DIR}/tools/mtmd/mtmd-helper.cpp
97
+ ${SOURCE_DIR}/tools/mtmd/mtmd-audio.cpp
98
+ ${SOURCE_DIR}/tools/mtmd/clip.cpp
99
+ ${SOURCE_DIR}/cap-llama.cpp
100
+ ${SOURCE_DIR}/cap-completion.cpp
101
+ ${SOURCE_DIR}/cap-tts.cpp
102
+ ${SOURCE_FILES_ARCH}
103
+ )
104
+
105
+ # Set target properties
106
+ set_target_properties(llama-cpp PROPERTIES
107
+ FRAMEWORK TRUE
108
+ FRAMEWORK_VERSION A
109
+ MACOSX_FRAMEWORK_IDENTIFIER com.arusatech.llama-cpp
110
+ MACOSX_FRAMEWORK_BUNDLE_VERSION 1.0.0
111
+ MACOSX_FRAMEWORK_SHORT_VERSION_STRING 1.0.0
112
+ XCODE_ATTRIBUTE_CODE_SIGN_IDENTITY "iPhone Developer"
113
+ XCODE_ATTRIBUTE_DEVELOPMENT_TEAM ""
114
+ XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH NO
115
+ XCODE_ATTRIBUTE_ENABLE_BITCODE NO
116
+ )
117
+
118
+ # Include directories
119
+ target_include_directories(llama-cpp PRIVATE
120
+ ${SOURCE_DIR}
121
+ ${SOURCE_DIR}/ggml-cpu
122
+ ${SOURCE_DIR}/tools/mtmd
123
+ )
124
+
125
+ # ARM64: rely on Clang's default tuning; no x86‑specific -march flags here
126
+
127
+ # Link frameworks via linker flags
128
+ target_link_options(llama-cpp PRIVATE
129
+ "-Wl,-framework,Accelerate"
130
+ "-Wl,-framework,Metal"
131
+ "-Wl,-framework,MetalKit"
132
+ "-Wl,-framework,Foundation"
133
+ "-Wl,-framework,CoreGraphics"
134
+ )
135
+
136
+ # Public headers
137
+ set_target_properties(llama-cpp PROPERTIES
138
+ PUBLIC_HEADER "${PUBLIC_HEADERS}"
139
+ )
140
+
141
+ # Install rules
142
+ install(TARGETS llama-cpp
143
+ FRAMEWORK DESTINATION .
144
+ )
145
+
146
+ message(STATUS "Building llama-cpp for ARM64 (devices)")
147
+ message(STATUS "Source directory: ${SOURCE_DIR}")
148
+ message(STATUS "Architecture: arm64")
149
+
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "llama-cpp-capacitor",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "A native Capacitor plugin that embeds llama.cpp directly into mobile apps, enabling offline AI inference with chat-first API design. Complete iOS and Android support: text generation, chat, multimodal, TTS, LoRA, embeddings, and more.",
5
5
  "main": "dist/plugin.cjs.js",
6
6
  "type": "module",
@@ -10,11 +10,14 @@
10
10
  "files": [
11
11
  "android/src/main/",
12
12
  "android/build.gradle",
13
+ "build-native.sh",
13
14
  "cpp/",
14
15
  "dist/",
16
+ "ios/CMakeLists.txt",
17
+ "ios/CMakeLists-arm64.txt",
18
+ "ios/CMakeLists-x86_64.txt",
15
19
  "ios/Sources",
16
20
  "ios/Frameworks",
17
- "ios/Tests",
18
21
  "Package.swift",
19
22
  "LlamaCpp.podspec",
20
23
  "types/"
@@ -65,8 +68,11 @@
65
68
  "docgen": "npx docgen --api LlamaCppPlugin --output-readme README.md --output-json dist/docs.json",
66
69
  "build": "npm run clean && npm run docgen && tsc && rollup -c rollup.config.mjs",
67
70
  "build:native": "./build-native.sh",
71
+ "build:all": "npm run build && npm run build:native",
68
72
  "build:ios": "cd ios && cmake -B build -S . && cmake --build build --config Release",
69
73
  "build:android": "cd android && gradlew.bat assembleRelease",
74
+ "pack": "npm run build && npm pack --dry-run",
75
+ "pack:full": "npm run build:all && npm pack --dry-run",
70
76
  "test": "jest",
71
77
  "test:integration": "./scripts/test-integration.sh",
72
78
  "test:integration:jest": "jest --config test/jest.integration.config.js",
@@ -1,15 +0,0 @@
1
- import XCTest
2
- @testable import LlamaCppPlugin
3
-
4
- class LlamaCppTests: XCTestCase {
5
- func testEcho() {
6
- // This is an example of a functional test case for a plugin.
7
- // Use XCTAssert and related functions to verify your tests produce the correct results.
8
-
9
- let implementation = LlamaCpp()
10
- let value = "Hello, World!"
11
- let result = implementation.echo(value)
12
-
13
- XCTAssertEqual(value, result)
14
- }
15
- }