#!/bin/bash set -e usage() { echo "使用方式: $0 [选项]" echo "选项:" echo " -S, --Source 指定项目源码路径 (默认为当前脚本所在目录)" echo " -t, --target 指定构建目标 (如 menuconfig)" echo " -C, --Clean 清理构建目录" echo " -B, --build 构建输出目录" echo " -h, --help 显示此帮助信息" echo " -r, --release 以 Release 模式构建 (移除 DEBUG_PATH 信息)" echo " -w, --warnings-as-errors 将警告视为错误" echo " -v, --verbose 显示详细的编译命令 (ninja -v)" echo " -D= 传递 CMake 变量 (可多次使用)" echo "" echo "示例:" echo " $0 -S samples/helloworld -DBOARD=arcs_mini 指定板型构建" echo " $0 -S samples/helloworld -DBOARD=arcs_evb 使用 EVB 板型" echo " $0 -S samples/helloworld -t menuconfig -DBOARD=arcs_mini 运行 menuconfig" echo " $0 -C -S samples/helloworld -DBOARD=arcs_mini 清理并重新构建" echo " $0 -S samples/helloworld -DBOARD=my_board -DBOARD_SEARCH_PATH=/path/to/boards 使用自定义板型" exit 1 } SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) PROJECT_PATH="$SCRIPT_DIR" TARGET="" CLEAN=false OUTPUT="build" WARNINGS_AS_ERRORS=false RELEASE=false VERBOSE=false ARCS_BASE_DIR_NAME="arcs-sdk" ARCS_DEV_TOOLS_DIR_NAME="listenai-dev-tools" ARCS_DEV_TOOL_TOOLCHAIN_DIR_NAME="gcc" ARCS_DEV_TOOL_LISTENAI_TOOLS_DIR_NAME="listenai-tools" find_arcs_base() { local current_dir=$(cd "$(dirname "$0")" && pwd) local dir_name="$ARCS_BASE_DIR_NAME" while [ "$current_dir" != "/" ]; do if [ -d "$current_dir/$dir_name" ]; then echo "Found ARCS_BASE: $current_dir/$dir_name" export ARCS_BASE="$current_dir/$dir_name" return 0 fi current_dir=$(dirname "$current_dir") done echo "ARCS_BASE not found, Please add ARCS_BASE environment variable or set ARCS_BASE_DIR_NAME to the correct directory." echo "Current Target ARCS_BASE directory name: $ARCS_BASE_DIR_NAME." exit 1 } find_dev_tools() { local current_dir=$(cd "$(dirname "$0")" && pwd) local dir_name="$ARCS_DEV_TOOLS_DIR_NAME" echo "trying to find $dir_name in parent directories..." while [ "$current_dir" != "/" ]; do if [ -d "$current_dir/$dir_name" ]; then echo "Found $dir_name: $current_dir/$dir_name" if [ -d "$current_dir/$dir_name/$ARCS_DEV_TOOL_LISTENAI_TOOLS_DIR_NAME" ]; then echo "Found LISTENAI_TOOLS_PATH: $current_dir/$dir_name/$ARCS_DEV_TOOL_LISTENAI_TOOLS_DIR_NAME" export LISTENAI_TOOLS_PATH="$current_dir/$dir_name/$ARCS_DEV_TOOL_LISTENAI_TOOLS_DIR_NAME" fi if [ -d "$current_dir/$dir_name/$ARCS_DEV_TOOL_TOOLCHAIN_DIR_NAME" ]; then echo "Found NUCLEI_TOOLCHAIN_PATH: $current_dir/$dir_name/$ARCS_DEV_TOOL_TOOLCHAIN_DIR_NAME" export NUCLEI_TOOLCHAIN_PATH="$current_dir/$dir_name/$ARCS_DEV_TOOL_TOOLCHAIN_DIR_NAME" fi return 0 fi current_dir=$(dirname "$current_dir") done } while [[ $# -gt 0 ]]; do case $1 in -S|--Source) PROJECT_PATH="$2" shift 2 ;; -B|--build) OUTPUT="$2" shift 2 ;; -t|--target) TARGET="$2" shift 2 ;; -C|--Clean) CLEAN=true shift 1 ;; -w|--warnings-as-errors) WARNINGS_AS_ERRORS=true shift 1 ;; -v|--verbose) VERBOSE=true shift 1 ;; -h|--help) usage ;; -r|--release) RELEASE=true shift 1 ;; -D*) CMAKE_VARS+=("$1") shift 1 ;; *) echo "未知参数: $1" usage ;; esac done echo "Source: $PROJECT_PATH" echo "Target: $TARGET" echo "Clean : $CLEAN" if [ -z "$LISTENAI_TOOLS_PATH" ] || [ -z "$NUCLEI_TOOLCHAIN_PATH" ]; then find_dev_tools fi if [ -z "${LISTENAI_TOOLS_PATH}" ]; then export LISTENAI_TOOLS_PATH="请添加 LISTENAI_TOOLS_PATH 环境变量,或在此行设置正确的路径" echo "请添加 LISTENAI_TOOLS_PATH 环境变量或者修改脚本后, 注释脚本第 $LINENO 行";exit 1; fi if [ -z "${NUCLEI_TOOLCHAIN_PATH}" ]; then export NUCLEI_TOOLCHAIN_PATH="请添加 NUCLEI_TOOLCHAIN_PATH 环境变量,或在此行设置正确的路径" echo "请添加 NUCLEI_TOOLCHAIN_PATH 环境变量或者修改脚本后, 注释脚本第 $LINENO 行";exit 1; fi ############### 下面代码不用修改 ################## # 构建工具的位置 CMAKE_PROGRAM="$LISTENAI_TOOLS_PATH/cmake/bin/cmake" NINJA_PROGRAM="$LISTENAI_TOOLS_PATH/ninja/ninja" # 配置环境变量 ARCS_BASE if [ -z "$ARCS_BASE" ]; then find_arcs_base fi if [ "$CLEAN" = true ]; then rm -rf $OUTPUT fi # Initialize CMAKE_VARS array if it doesn't exist declare -a CMAKE_VARS # Add warnings-as-errors flag if enabled if [ "$WARNINGS_AS_ERRORS" = true ]; then CMAKE_VARS+=("-DCMAKE_C_FLAGS=-Werror") CMAKE_VARS+=("-DCMAKE_CXX_FLAGS=-Werror") echo "Treating warnings as errors" fi # Add release flags if enabled if [ "$RELEASE" = true ]; then CMAKE_VARS+=("-DENABLE_DEBUG_PATH=OFF") echo "Release mode enabled (-DENABLE_DEBUG_PATH=OFF)" fi # add boards path CMAKE_VARS+=("-DBOARD_SEARCH_PATH=$SCRIPT_DIR/boards") $CMAKE_PROGRAM -B "$OUTPUT" -G Ninja -S "$PROJECT_PATH" \ -DCMAKE_MAKE_PROGRAM="$NINJA_PROGRAM" \ "${CMAKE_VARS[@]}" # Build with optional verbose flag if [ "$VERBOSE" = true ]; then echo "Verbose mode enabled (ninja -v)" if [ -z "$TARGET" ]; then $CMAKE_PROGRAM --build "$OUTPUT" -j4 -- -v else $CMAKE_PROGRAM --build "$OUTPUT" --target "$TARGET" -- -v fi else if [ -z "$TARGET" ]; then $CMAKE_PROGRAM --build "$OUTPUT" -j${nproc} else $CMAKE_PROGRAM --build "$OUTPUT" --target "$TARGET" fi fi