如果直接上来就cmake...,大概率会报错:
bash
CMake Error at /opt/homebrew/share/cmake/Modules/CMakeDetermineSystem.cmake:152 (message):
Could not find toolchain file: /build/cmake/android.toolchain.cmake
Call Stack (most recent call first):
CMakeLists.txt:2 (project)
这个时候需要:
bash
echo $ANDROID_NDK
然后再:
bash
ls ~/Library/Android/sdk/ndk
会看到不同版本的ndk,选择你需要使用的,然后再:
bash
export ANDROID_NDK=$HOME/Library/Android/sdk/ndk/27.0.12077973
后面的版本用你所需要的版本。
再验证下是否制定版本成功:
bash
ls $ANDROID_NDK/build/cmake/android.toolchain.cmake
生成构建配置指令:
bash
cmake -S . -B build-android \
-DCMAKE_TOOLCHAIN_FILE="$ANDROID_NDK/build/cmake/android.toolchain.cmake" \
-DANDROID_ABI=arm64-v8a \
-DANDROID_PLATFORM=android-28 \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_SHARED_LIBS=ON \
\
-DGGML_OPENMP=OFF \
-DGGML_LLAMAFILE=OFF \
-DGGML_OPENSSL=ON \
-DGGML_NATIVE=OFF \
\
-DLLAMA_OPENSSL=ON \
-DLLAMA_CURL=OFF \
-DLLAMA_BUILD_TOOLS=OFF \
-DLLAMA_BUILD_EXAMPLES=OFF \
-DLLAMA_BUILD_TESTS=OFF \
-DLLAMA_BUILD_SERVER=OFF \
\
-DOPENSSL_USE_STATIC_LIBS=TRUE \
-DOPENSSL_ROOT_DIR="/Users/yourname/Desktop/openssl-android-arm64-v8a" \
-DOPENSSL_INCLUDE_DIR="/Users/yourname/Desktop/openssl-android-arm64-v8a/include" \
-DOPENSSL_CRYPTO_LIBRARY="/Users/yourname/Desktop/openssl-android-arm64-v8a/lib/arm64-v8a/libcrypto.a" \
-DOPENSSL_SSL_LIBRARY="/Users/yourname/Desktop/openssl-android-arm64-v8a/lib/arm64-v8a/libssl.a"
备注:
bash
这句命令是 用 CMake 生成构建目录(configure 阶段) 的标准写法,我们拆开来看就很清楚了
cmake -S . -B build-android
一、整体在干嘛?
告诉 CMake:源码在当前目录,用 build-android 这个目录来生成构建文件(Makefile / Ninja / Xcode 工程等)。
这是 out-of-source build(外部构建),不会把一堆中间文件污染你的源码目录
二、逐个参数解释
cmake
调用 CMake 可执行程序。
-S .
Source(源码目录)
-S 表示 source directory
. 表示 当前目录
也就是:
当前目录里必须有 CMakeLists.txt
等价于老写法:
cmake .
-B build-android
Build(构建目录)
-B 表示 build directory
build-android 是构建输出目录
如果不存在,CMake 会自动创建
生成的内容包括:
CMakeCache.txt
Makefile / build.ninja
各种中间 .o、.a、.so 文件
三、这句命令执行后会发生什么?
执行流程是:
CMake 读取
./CMakeLists.txt
检测:
编译器
平台
依赖库(OpenSSL、zlib 等)
把 构建系统文件 生成到:
./build-android/
注意:
这一步 不会编译代码,只是生成构建配置。
编译阶段:
bash
cmake --build build-android -j$(sysctl -n hw.ncpu)