refactor: enhance Android build scripts with dynamic example discovery and configurable ABI, and correct LLM SDK path.
This commit is contained in:
parent
194e4b6b18
commit
72e0647351
4 changed files with 92 additions and 31 deletions
|
|
@ -1,5 +1,5 @@
|
||||||
LOCAL_PATH := $(call my-dir)
|
LOCAL_PATH := $(call my-dir)
|
||||||
LLM_SDK_PATH := $(LOCAL_PATH)/../../../../amlnn-toolkit/npu_runtime/llmsdk
|
LLM_SDK_PATH := $(LOCAL_PATH)/../../../../amlnn-toolkit/nn_runtime/llmsdk
|
||||||
3RDPARTY_PATH := $(LOCAL_PATH)/../../../dependency
|
3RDPARTY_PATH := $(LOCAL_PATH)/../../../dependency
|
||||||
$(warning $(LOCAL_PATH))
|
$(warning $(LOCAL_PATH))
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,14 +3,16 @@ cmake_minimum_required(VERSION 3.5.1)
|
||||||
set(CMAKE_SYSTEM_NAME Linux)
|
set(CMAKE_SYSTEM_NAME Linux)
|
||||||
project(AML_LLM_NNSDK)
|
project(AML_LLM_NNSDK)
|
||||||
|
|
||||||
# xinxin, 后面yocto的编so的时候,如果用的cmake的话,可以把这些cmakelist.txt里面指定sysroot的都去掉,
|
# xinxin, when building the .so with Yocto using CMake, you can remove the sysroot settings
|
||||||
# 然后用官方推荐的方式,source完之后它会增加很多环境变量,你可以export命令看一下,后续cmake根据环境变量自己会配置,就不用再cmakelist里面配置了
|
# from these CMakeLists.txt files and use the officially recommended approach instead:
|
||||||
|
# after sourcing the environment script, many environment variables will be set (check with `export`),
|
||||||
|
# and CMake will configure itself automatically based on them without needing explicit settings here.
|
||||||
# source /mnt/fileroot/xinxin.he/environment/new-yocto/64/environment-setup-armv8a-poky-linux
|
# source /mnt/fileroot/xinxin.he/environment/new-yocto/64/environment-setup-armv8a-poky-linux
|
||||||
# export CXXFLAGS=$(echo "$CXXFLAGS" | sed 's/-g//g')
|
# export CXXFLAGS=$(echo "$CXXFLAGS" | sed 's/-g//g')
|
||||||
# export CFLAGS=$(echo "$CXXFLAGS" | sed 's/-g//g')
|
# export CFLAGS=$(echo "$CXXFLAGS" | sed 's/-g//g')
|
||||||
# cmake -DCMAKE_TOOLCHAIN_FILE=${OE_CMAKE_TOOLCHAIN_FILE} ..
|
# cmake -DCMAKE_TOOLCHAIN_FILE=${OE_CMAKE_TOOLCHAIN_FILE} ..
|
||||||
|
|
||||||
# # 设置 Yocto 交叉编译环境
|
# # Set Yocto cross-compilation environment
|
||||||
# set(SYSROOT_PATH /mnt/fileroot/xinxin.he/environment/new-yocto/64/sysroots/x86_64-pokysdk-linux)
|
# set(SYSROOT_PATH /mnt/fileroot/xinxin.he/environment/new-yocto/64/sysroots/x86_64-pokysdk-linux)
|
||||||
# set(CMAKE_SYSROOT "${SYSROOT_PATH}")
|
# set(CMAKE_SYSROOT "${SYSROOT_PATH}")
|
||||||
# message(STATUS "Using sysroot path as ${SYSROOT_PATH}")
|
# message(STATUS "Using sysroot path as ${SYSROOT_PATH}")
|
||||||
|
|
@ -19,7 +21,7 @@ project(AML_LLM_NNSDK)
|
||||||
# cmake_force_c_compiler("${SYSROOT_PATH}/usr/bin/aarch64-poky-linux/aarch64-poky-linux-gcc" GNU)
|
# cmake_force_c_compiler("${SYSROOT_PATH}/usr/bin/aarch64-poky-linux/aarch64-poky-linux-gcc" GNU)
|
||||||
# cmake_force_cxx_compiler("${SYSROOT_PATH}/usr/bin/aarch64-poky-linux/aarch64-poky-linux-g++" GNU)
|
# cmake_force_cxx_compiler("${SYSROOT_PATH}/usr/bin/aarch64-poky-linux/aarch64-poky-linux-g++" GNU)
|
||||||
|
|
||||||
# # 设置真正目标板的 sysroot
|
# # Set the sysroot for the actual target board
|
||||||
# set(MYSYSROOT "/mnt/fileroot/xinxin.he/environment/new-yocto/64/sysroots/armv8a-poky-linux")
|
# set(MYSYSROOT "/mnt/fileroot/xinxin.he/environment/new-yocto/64/sysroots/armv8a-poky-linux")
|
||||||
# add_definitions("--sysroot=${MYSYSROOT}")
|
# add_definitions("--sysroot=${MYSYSROOT}")
|
||||||
# set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} --sysroot=${MYSYSROOT}" CACHE INTERNAL "" FORCE)
|
# set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} --sysroot=${MYSYSROOT}" CACHE INTERNAL "" FORCE)
|
||||||
|
|
@ -29,22 +31,22 @@ set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
|
||||||
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
|
||||||
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
|
||||||
|
|
||||||
# SDK路径
|
# SDK paths
|
||||||
set(LLM_NNSDK_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../../01_src/jni")
|
set(LLM_NNSDK_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../../01_src/jni")
|
||||||
set(NNSDK_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../../01_src/jni/nnsdk_v2.8.1_2025_0317/lib/linux/lib64_yocto")
|
set(NNSDK_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../../01_src/jni/nnsdk_v2.8.1_2025_0317/lib/linux/lib64_yocto")
|
||||||
|
|
||||||
# 包含头文件路径
|
# Include header paths
|
||||||
include_directories(
|
include_directories(
|
||||||
${LLM_NNSDK_PATH}
|
${LLM_NNSDK_PATH}
|
||||||
)
|
)
|
||||||
|
|
||||||
# 源文件
|
# Source files
|
||||||
aux_source_directory(. SRC_LIST)
|
aux_source_directory(. SRC_LIST)
|
||||||
|
|
||||||
# 生成可执行文件
|
# Build executable
|
||||||
add_executable(demo_llm_yocto ${SRC_LIST})
|
add_executable(demo_llm_yocto ${SRC_LIST})
|
||||||
|
|
||||||
# 链接库
|
# Link libraries
|
||||||
target_link_libraries(demo_llm_yocto
|
target_link_libraries(demo_llm_yocto
|
||||||
${LLM_NNSDK_PATH}/build/libllm_nnsdk.so
|
${LLM_NNSDK_PATH}/build/libllm_nnsdk.so
|
||||||
${NNSDK_PATH}/libnnsdk.so
|
${NNSDK_PATH}/libnnsdk.so
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,75 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
if [ ! -d "$NDK_PATH" ]; then
|
set -e
|
||||||
echo "Error: NDK_PATH '$NDK_PATH' not found."
|
|
||||||
echo "Please set NDK_PATH environment variable to your Android NDK directory."
|
#
|
||||||
|
# Copyright (C) 2024-2025 Amlogic, Inc. All rights reserved.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
# you may not use this file except in compliance with the License.
|
||||||
|
# You may obtain a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
# See the License for the specific language governing permissions and
|
||||||
|
# limitations under the License.
|
||||||
|
#
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
echo "Usage: $0 [-a <target_abi>]"
|
||||||
|
echo " -a <target_abi> : Target ABI (default: arm64-v8a)"
|
||||||
|
echo " -h : Show this help message"
|
||||||
exit 1
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# Default values
|
||||||
|
TARGET_ABI=arm64-v8a
|
||||||
|
|
||||||
|
# Parse arguments
|
||||||
|
while getopts 'a:h' opt; do
|
||||||
|
case "$opt" in
|
||||||
|
a)
|
||||||
|
TARGET_ABI=$OPTARG
|
||||||
|
;;
|
||||||
|
h)
|
||||||
|
usage
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
usage
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ -z "${ANDROID_NDK_PATH}" ]; then
|
||||||
|
if [ -n "${ANDROID_NDK}" ]; then
|
||||||
|
ANDROID_NDK_PATH=${ANDROID_NDK}
|
||||||
|
elif [ -n "${ANDROID_NDK_HOME}" ]; then
|
||||||
|
ANDROID_NDK_PATH=${ANDROID_NDK_HOME}
|
||||||
|
else
|
||||||
|
echo "Error: ANDROID_NDK_PATH is not set."
|
||||||
|
echo "Please set ANDROID_NDK_PATH to your Android NDK directory."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
$NDK_PATH/ndk-build \
|
ROOT_PWD=$(cd "$(dirname $0)" && pwd)
|
||||||
NDK_PROJECT_PATH=. \
|
BUILD_DIR=${ROOT_PWD}/build/android
|
||||||
APP_BUILD_SCRIPT=./Android.mk \
|
|
||||||
NDK_APPLICATION_MK=./Application.mk
|
echo "Building LLMs for Android (ndk-build)..."
|
||||||
|
echo "NDK_PATH: ${ANDROID_NDK_PATH}"
|
||||||
|
echo "TARGET_ABI: ${TARGET_ABI}"
|
||||||
|
echo "BUILD_DIR: ${BUILD_DIR}"
|
||||||
|
|
||||||
|
mkdir -p ${BUILD_DIR}
|
||||||
|
|
||||||
|
${ANDROID_NDK_PATH}/ndk-build \
|
||||||
|
NDK_PROJECT_PATH="${ROOT_PWD}" \
|
||||||
|
APP_BUILD_SCRIPT="${ROOT_PWD}/Android.mk" \
|
||||||
|
NDK_APPLICATION_MK="${ROOT_PWD}/Application.mk" \
|
||||||
|
NDK_OUT="${BUILD_DIR}/obj" \
|
||||||
|
NDK_LIBS_OUT="${BUILD_DIR}/libs" \
|
||||||
|
APP_ABI="${TARGET_ABI}"
|
||||||
|
|
||||||
|
echo "Build complete. Libs in ${BUILD_DIR}/libs"
|
||||||
|
|
|
||||||
|
|
@ -84,20 +84,15 @@ echo "NDK_PATH: ${ANDROID_NDK_PATH}"
|
||||||
echo "TARGET_ABI: ${TARGET_ABI}"
|
echo "TARGET_ABI: ${TARGET_ABI}"
|
||||||
echo "============================================"
|
echo "============================================"
|
||||||
|
|
||||||
# List all examples that have a build-android.sh
|
# Dynamically discover all examples that have a build-android.sh
|
||||||
EXAMPLES=(
|
mapfile -t BUILD_SCRIPTS < <(find "${SCRIPT_DIR}" -mindepth 3 -maxdepth 3 -name "build-android.sh" | sort)
|
||||||
"clip/cpp"
|
|
||||||
"mobilenet/cpp"
|
EXAMPLES=()
|
||||||
"ppocr-det/cpp"
|
for script in "${BUILD_SCRIPTS[@]}"; do
|
||||||
"resnet/cpp"
|
# Convert absolute path to a path relative to SCRIPT_DIR (e.g. "yolov8/cpp")
|
||||||
"retinaface/cpp"
|
rel=$(realpath --relative-to="${SCRIPT_DIR}" "$(dirname "$script")")
|
||||||
"whisper/cpp"
|
EXAMPLES+=("$rel")
|
||||||
"yoloe/cpp"
|
done
|
||||||
"yolov11/cpp"
|
|
||||||
"yolov8/cpp"
|
|
||||||
"yoloworld/cpp"
|
|
||||||
"yolox/cpp"
|
|
||||||
)
|
|
||||||
|
|
||||||
FAILED=()
|
FAILED=()
|
||||||
SUCCEEDED=()
|
SUCCEEDED=()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue