更新 OpenWrt 编译脚本为 2.0

This commit is contained in:
2025-09-24 23:45:23 +08:00
committed by GitHub
parent a48e7d88c2
commit efdc40ccef

301
build.sh
View File

@@ -17,12 +17,13 @@ readonly RESET='\033[0m'
# 全局常量定义 # 全局常量定义
# ============================================================================= # =============================================================================
readonly SCRIPT_NAME="OpenWRT 构建系统" readonly SCRIPT_NAME="OpenWRT 构建系统"
readonly SCRIPT_VERSION="1.0.0" readonly SCRIPT_VERSION="2.0.0"
readonly AUTHOR="OPPEN321" readonly AUTHOR="OPPEN321"
readonly BLOG="www.kejizero.online" readonly BLOG="www.kejizero.online"
readonly MIRROR="https://raw.githubusercontent.com/BlueStack-Sky/QuickWrt/refs/heads/master" readonly MIRROR="https://raw.githubusercontent.com/BlueStack-Sky/QuickWrt/refs/heads/master"
readonly SUPPORTED_ARCHITECTURES=("rockchip" "x86_64") readonly SUPPORTED_ARCHITECTURES=("rockchip" "x86_64")
readonly REQUIRED_USER="zhao" readonly REQUIRED_USER="zhao"
readonly BUILD_MODES=("accelerated" "normal" "toolchain-only")
# ============================================================================= # =============================================================================
# 全局变量 # 全局变量
@@ -30,6 +31,8 @@ readonly REQUIRED_USER="zhao"
GROUP_FLAG=false GROUP_FLAG=false
START_TIME=$(date +%s) START_TIME=$(date +%s)
CPU_CORES=$(( $(nproc --all) + 1 )) CPU_CORES=$(( $(nproc --all) + 1 ))
BUILD_MODE="normal"
TOOLCHAIN_ARCH=""
# ============================================================================= # =============================================================================
# 函数定义 # 函数定义
@@ -73,20 +76,26 @@ validate_environment() {
# 显示使用帮助 # 显示使用帮助
show_usage() { show_usage() {
echo -e "\n${BOLD}使用方法:${RESET}" echo -e "\n${BOLD}使用方法:${RESET}"
echo -e " bash $0 <version> <architecture>" echo -e " bash $0 <version> <architecture> [build_mode]"
echo -e "\n${BOLD}支持的架构:${RESET}" echo -e "\n${BOLD}支持的架构:${RESET}"
for arch in "${SUPPORTED_ARCHITECTURES[@]}"; do for arch in "${SUPPORTED_ARCHITECTURES[@]}"; do
echo -e "${GREEN_COLOR}$arch${RESET}" echo -e "${GREEN_COLOR}$arch${RESET}"
done done
echo -e "\n${BOLD}支持的编译模式:${RESET}"
echo -e "${GREEN_COLOR}accelerated${RESET} - 加速编译(下载预编译工具链)"
echo -e "${GREEN_COLOR}normal${RESET} - 普通编译(完整编译所有组件)"
echo -e "${GREEN_COLOR}toolchain-only${RESET} - 仅编译工具链(用于缓存)"
echo -e "\n${BOLD}示例:${RESET}" echo -e "\n${BOLD}示例:${RESET}"
echo -e " bash $0 v24 x86_64" echo -e " bash $0 v24 x86_64 accelerated"
echo -e " bash $0 v24 rockchip" echo -e " bash $0 v24 rockchip normal"
echo -e " bash $0 v24 x86_64 toolchain-only"
} }
# 验证参数 # 验证参数
validate_arguments() { validate_arguments() {
local version="$1" local version="$1"
local arch="$2" local arch="$2"
local mode="${3:-normal}"
if [[ -z "$version" ]]; then if [[ -z "$version" ]]; then
error_exit "未指定版本号" error_exit "未指定版本号"
@@ -96,6 +105,7 @@ validate_arguments() {
error_exit "未指定目标架构" error_exit "未指定目标架构"
fi fi
# 验证架构
local valid_arch=false local valid_arch=false
for supported_arch in "${SUPPORTED_ARCHITECTURES[@]}"; do for supported_arch in "${SUPPORTED_ARCHITECTURES[@]}"; do
if [[ "$arch" == "$supported_arch" ]]; then if [[ "$arch" == "$supported_arch" ]]; then
@@ -107,6 +117,20 @@ validate_arguments() {
if [[ "$valid_arch" == false ]]; then if [[ "$valid_arch" == false ]]; then
error_exit "不支持的架构: '$arch'" error_exit "不支持的架构: '$arch'"
fi fi
# 验证编译模式
local valid_mode=false
for supported_mode in "${BUILD_MODES[@]}"; do
if [[ "$mode" == "$supported_mode" ]]; then
valid_mode=true
BUILD_MODE="$mode"
break
fi
done
if [[ "$valid_mode" == false ]]; then
error_exit "不支持的编译模式: '$mode'"
fi
} }
# 显示横幅 # 显示横幅
@@ -124,6 +148,7 @@ show_banner() {
echo -e "${BOLD}${BLUE_COLOR}${RESET} 🔧 ${GREEN_COLOR}构建开始:${RESET} $(date '+%Y-%m-%d %H:%M:%S') ${BOLD}${BLUE_COLOR}${RESET}" echo -e "${BOLD}${BLUE_COLOR}${RESET} 🔧 ${GREEN_COLOR}构建开始:${RESET} $(date '+%Y-%m-%d %H:%M:%S') ${BOLD}${BLUE_COLOR}${RESET}"
echo -e "${BOLD}${BLUE_COLOR}${RESET}${GREEN_COLOR}处理器核心:${RESET} $CPU_CORES${BOLD}${BLUE_COLOR}${RESET}" echo -e "${BOLD}${BLUE_COLOR}${RESET}${GREEN_COLOR}处理器核心:${RESET} $CPU_CORES${BOLD}${BLUE_COLOR}${RESET}"
echo -e "${BOLD}${BLUE_COLOR}${RESET} 🐧 ${GREEN_COLOR}系统用户:${RESET} $(whoami) ${BOLD}${BLUE_COLOR}${RESET}" echo -e "${BOLD}${BLUE_COLOR}${RESET} 🐧 ${GREEN_COLOR}系统用户:${RESET} $(whoami) ${BOLD}${BLUE_COLOR}${RESET}"
echo -e "${BOLD}${BLUE_COLOR}${RESET} 🚀 ${GREEN_COLOR}编译模式:${RESET} $BUILD_MODE ${BOLD}${BLUE_COLOR}${RESET}"
echo -e "${BOLD}${BLUE_COLOR}╚══════════════════════════════════════════════════════════════════╝${RESET}" echo -e "${BOLD}${BLUE_COLOR}╚══════════════════════════════════════════════════════════════════╝${RESET}"
echo -e "" echo -e ""
} }
@@ -147,8 +172,26 @@ setup_curl_progress() {
export CURL_OPTIONS export CURL_OPTIONS
} }
# 编译脚本 # 设置工具链架构
compilation_script() { setup_toolchain_arch() {
local arch="$1"
case "$arch" in
"x86_64")
TOOLCHAIN_ARCH="x86_64"
;;
"rockchip")
TOOLCHAIN_ARCH="aarch64"
;;
*)
error_exit "未知架构: $arch"
;;
esac
export TOOLCHAIN_ARCH
print_success "工具链架构设置为: $TOOLCHAIN_ARCH"
}
# 编译脚本 - 准备源代码
prepare_source_code() {
print_info "开始查询最新 OpenWRT 版本..." print_info "开始查询最新 OpenWRT 版本..."
tag_version="$(curl -s https://github.com/openwrt/openwrt/tags | grep -Eo "v[0-9\.]+\-*r*c*[0-9]*.tar.gz" | sed -n '/[2-9][4-9]/p' | sed -n 1p | sed 's/v//g' | sed 's/.tar.gz//g')" tag_version="$(curl -s https://github.com/openwrt/openwrt/tags | grep -Eo "v[0-9\.]+\-*r*c*[0-9]*.tar.gz" | sed -n '/[2-9][4-9]/p' | sed -n 1p | sed 's/v//g' | sed 's/.tar.gz//g')"
export tag_version="$tag_version" export tag_version="$tag_version"
@@ -177,23 +220,20 @@ compilation_script() {
print_info "正在复制密钥文件..." print_info "正在复制密钥文件..."
if [ -d "openwrt" ]; then if [ -d "openwrt" ]; then
cd openwrt || { printf "%b\n" "${RED_COLOR}进入 openwrt 目录失败${RES}"; exit 1; } cd openwrt || error_exit "进入 openwrt 目录失败"
if cp -rf ../OpenBox/key.tar.gz ./key.tar.gz; then if cp -rf ../OpenBox/key.tar.gz ./key.tar.gz; then
if tar zxf key.tar.gz; then if tar zxf key.tar.gz; then
rm -f key.tar.gz rm -f key.tar.gz
print_info "密钥已复制并解压完成" print_info "密钥已复制并解压完成"
else else
printf "%b\n" "${RED_COLOR}解压 key.tar.gz 失败${RES}" error_exit "解压 key.tar.gz 失败"
exit 1
fi fi
else else
printf "%b\n" "${RED_COLOR}复制 key.tar.gz 失败${RES}" error_exit "复制 key.tar.gz 失败"
exit 1
fi fi
else else
printf "%b\n" "${RED_COLOR}未找到 openwrt 源码目录,下载源码失败${RES}" error_exit "未找到 openwrt 源码目录,下载源码失败"
exit 1
fi fi
print_info "正在更新软件源 feeds..." print_info "正在更新软件源 feeds..."
@@ -211,6 +251,11 @@ compilation_script() {
else else
error_exit "feeds 安装失败" error_exit "feeds 安装失败"
fi fi
}
# 执行构建脚本
execute_build_scripts() {
local arch="$1"
print_info "下载并执行构建脚本..." print_info "下载并执行构建脚本..."
local scripts=( local scripts=(
@@ -255,19 +300,17 @@ compilation_script() {
# 执行架构特定脚本 # 执行架构特定脚本
echo -e "${BLUE_COLOR}├─ 执行架构特定配置...${RESET}" echo -e "${BLUE_COLOR}├─ 执行架构特定配置...${RESET}"
if [[ "$1" == "rockchip" ]]; then if [[ "$arch" == "rockchip" ]]; then
echo -e "${BLUE_COLOR}│ ├─ 配置 Rockchip 架构${RESET}" echo -e "${BLUE_COLOR}│ ├─ 配置 Rockchip 架构${RESET}"
if bash 02-rockchip_target_only.sh > /dev/null 2>&1; then if bash 02-rockchip_target_only.sh > /dev/null 2>&1; then
export core=arm64
echo -e "${GREEN_COLOR}│ │ ✓ Rockchip 架构配置完成${RESET}" echo -e "${GREEN_COLOR}│ │ ✓ Rockchip 架构配置完成${RESET}"
print_success "Rockchip 架构配置完成" print_success "Rockchip 架构配置完成"
else else
error_exit "Rockchip 架构配置脚本执行失败" error_exit "Rockchip 架构配置脚本执行失败"
fi fi
elif [[ "$1" == "x86_64" ]]; then elif [[ "$arch" == "x86_64" ]]; then
echo -e "${BLUE_COLOR}│ ├─ 配置 x86_64 架构${RESET}" echo -e "${BLUE_COLOR}│ ├─ 配置 x86_64 架构${RESET}"
if bash 02-x86_64_target_only.sh > /dev/null 2>&1; then if bash 02-x86_64_target_only.sh > /dev/null 2>&1; then
export core=amd64
echo -e "${GREEN_COLOR}│ │ ✓ x86_64 架构配置完成${RESET}" echo -e "${GREEN_COLOR}│ │ ✓ x86_64 架构配置完成${RESET}"
print_success "x86_64 架构配置完成" print_success "x86_64 架构配置完成"
else else
@@ -284,10 +327,14 @@ compilation_script() {
fi fi
print_success "构建环境准备完成" print_success "构建环境准备完成"
}
# 加载配置文件 # 加载配置文件
load_configuration() {
local arch="$1"
print_info "加载配置文件..." print_info "加载配置文件..."
if [[ "$1" == "rockchip" ]]; then if [[ "$arch" == "rockchip" ]]; then
echo -e "${BLUE_COLOR}├─ 选择 Rockchip 架构配置${RESET}" echo -e "${BLUE_COLOR}├─ 选择 Rockchip 架构配置${RESET}"
if cp -rf ../OpenBox/Config/Rockchip.config ./.config; then if cp -rf ../OpenBox/Config/Rockchip.config ./.config; then
echo -e "${GREEN_COLOR}└─ ✓ Rockchip 配置文件加载完成${RESET}" echo -e "${GREEN_COLOR}└─ ✓ Rockchip 配置文件加载完成${RESET}"
@@ -295,7 +342,7 @@ compilation_script() {
else else
error_exit "Rockchip 配置文件加载失败" error_exit "Rockchip 配置文件加载失败"
fi fi
elif [[ "$1" == "x86_64" ]]; then elif [[ "$arch" == "x86_64" ]]; then
echo -e "${BLUE_COLOR}├─ 选择 x86_64 架构配置${RESET}" echo -e "${BLUE_COLOR}├─ 选择 x86_64 架构配置${RESET}"
if cp -rf ../OpenBox/Config/X86_64.config ./.config; then if cp -rf ../OpenBox/Config/X86_64.config ./.config; then
echo -e "${GREEN_COLOR}└─ ✓ x86_64 配置文件加载完成${RESET}" echo -e "${GREEN_COLOR}└─ ✓ x86_64 配置文件加载完成${RESET}"
@@ -306,61 +353,6 @@ compilation_script() {
fi fi
} }
# 缓存工具链
cache_toolchain() {
print_info "下载工具链..."
echo -e "${BLUE_COLOR}├─ 检测系统信息...${RESET}"
# 检测系统信息
if [[ -f /etc/os-release ]]; then
source /etc/os-release
echo -e "${GREEN_COLOR}│ ✓ 检测到系统: $PRETTY_NAME${RESET}"
else
echo -e "${YELLOW_COLOR}│ ⚠ 无法检测系统信息${RESET}"
fi
echo -e "${BLUE_COLOR}├─ 下载工具链文件...${RESET}"
local TOOLCHAIN_URL="https://github.com/BlueStack-Sky/QuickWrt/releases/download/openwrt-24.10"
local toolchain_file="toolchain_musl_${toolchain_arch}_gcc-13.tar.zst"
if curl -L ${TOOLCHAIN_URL}/${toolchain_file} -o toolchain.tar.zst ${CURL_OPTIONS}; then
echo -e "${GREEN_COLOR}│ ✓ 工具链下载完成${RESET}"
else
error_exit "工具链下载失败"
fi
echo -e "${BLUE_COLOR}├─ 解压工具链...${RESET}"
if tar -I "zstd" -xf toolchain.tar.zst; then
echo -e "${GREEN_COLOR}│ ✓ 工具链解压完成${RESET}"
else
error_exit "工具链解压失败"
fi
echo -e "${BLUE_COLOR}├─ 清理临时文件...${RESET}"
if rm -f toolchain.tar.zst; then
echo -e "${GREEN_COLOR}│ ✓ 临时文件清理完成${RESET}"
else
print_warning "清理临时文件时出现警告"
fi
echo -e "${BLUE_COLOR}├─ 创建目录结构...${RESET}"
if mkdir -p bin; then
echo -e "${GREEN_COLOR}│ ✓ 目录创建完成${RESET}"
else
error_exit "创建目录失败"
fi
echo -e "${BLUE_COLOR}├─ 更新文件时间戳...${RESET}"
if find ./staging_dir/ -name '*' -exec touch {} \; >/dev/null 2>&1 && \
find ./tmp/ -name '*' -exec touch {} \; >/dev/null 2>&1; then
echo -e "${GREEN_COLOR}└─ ✓ 文件时间戳更新完成${RESET}"
else
print_warning "更新文件时间戳时出现警告"
fi
print_success "工具链缓存完成"
}
# 生成 Config 文件 # 生成 Config 文件
generate_config_file() { generate_config_file() {
print_info "生成 Config 文件..." print_info "生成 Config 文件..."
@@ -386,45 +378,116 @@ generate_config_file() {
print_success "Config 文件生成完成" print_success "Config 文件生成完成"
} }
# 开始编译 # 下载预编译工具链(加速模式)
compile_openwrt() { download_prebuilt_toolchain() {
starttime=`date +'%Y-%m-%d %H:%M:%S'` print_info "下载预编译工具链(加速模式)..."
echo -e "${BLUE_COLOR}├─ 检测系统信息...${RESET}"
if [[ -f /etc/os-release ]]; then
source /etc/os-release
echo -e "${GREEN_COLOR}│ ✓ 检测到系统: $PRETTY_NAME${RESET}"
else
echo -e "${YELLOW_COLOR}│ ⚠ 无法检测系统信息${RESET}"
fi
echo -e "${BLUE_COLOR}├─ 下载工具链文件...${RESET}"
local TOOLCHAIN_URL="https://github.com/BlueStack-Sky/QuickWrt/releases/download/openwrt-24.10"
local toolchain_file="toolchain_musl_${TOOLCHAIN_ARCH}_gcc-13.tar.zst"
if curl -L "${TOOLCHAIN_URL}/${toolchain_file}" -o toolchain.tar.zst ${CURL_OPTIONS}; then
echo -e "${GREEN_COLOR}│ ✓ 工具链下载完成${RESET}"
else
error_exit "工具链下载失败"
fi
echo -e "${BLUE_COLOR}├─ 解压工具链...${RESET}"
if command -v zstd >/dev/null 2>&1; then
if tar -I "zstd" -xf toolchain.tar.zst; then
echo -e "${GREEN_COLOR}│ ✓ 工具链解压完成${RESET}"
else
error_exit "工具链解压失败"
fi
else
error_exit "未找到 zstd 命令,请先安装 zstd"
fi
echo -e "${BLUE_COLOR}├─ 清理临时文件...${RESET}"
if rm -f toolchain.tar.zst; then
echo -e "${GREEN_COLOR}│ ✓ 临时文件清理完成${RESET}"
else
print_warning "清理临时文件时出现警告"
fi
echo -e "${BLUE_COLOR}├─ 创建目录结构...${RESET}"
if mkdir -p bin; then
echo -e "${GREEN_COLOR}│ ✓ 目录创建完成${RESET}"
else
error_exit "创建目录失败"
fi
echo -e "${BLUE_COLOR}├─ 更新文件时间戳...${RESET}"
if find ./staging_dir/ -name '*' -exec touch {} \; >/dev/null 2>&1 && \
find ./tmp/ -name '*' -exec touch {} \; >/dev/null 2>&1; then
echo -e "${GREEN_COLOR}└─ ✓ 文件时间戳更新完成${RESET}"
else
print_warning "更新文件时间戳时出现警告"
fi
print_success "预编译工具链准备完成"
}
# 编译工具链(普通模式或工具链模式)
compile_toolchain() {
print_info "开始编译工具链..."
local starttime=$(date +'%Y-%m-%d %H:%M:%S')
if [ "$BUILD_TOOLCHAIN" = "y" ]; then
print_info "缓存工具链..."
echo -e "${BLUE_COLOR}├─ 编译工具链...${RESET}" echo -e "${BLUE_COLOR}├─ 编译工具链...${RESET}"
if make -j"$cores" toolchain/compile || make -j"$cores" toolchain/compile V=s; then if make -j"$CPU_CORES" toolchain/compile || make -j"$CPU_CORES" toolchain/compile V=s; then
echo -e "${GREEN_COLOR}│ ✓ 工具链编译完成${RESET}" echo -e "${GREEN_COLOR}│ ✓ 工具链编译完成${RESET}"
else else
error_exit "工具链编译失败" error_exit "工具链编译失败"
fi fi
# 如果是工具链模式,打包并退出
if [[ "$BUILD_MODE" == "toolchain-only" ]]; then
echo -e "${BLUE_COLOR}├─ 打包工具链缓存...${RESET}" echo -e "${BLUE_COLOR}├─ 打包工具链缓存...${RESET}"
if mkdir -p toolchain-cache && \ if mkdir -p toolchain-cache && \
tar -I "zstd -19 -T$(nproc --all)" -cf "toolchain-cache/toolchain_musl_${toolchain_arch}_gcc-13.tar.zst" \ tar -I "zstd -19 -T$(nproc --all)" -cf "toolchain-cache/toolchain_musl_${TOOLCHAIN_ARCH}_gcc-13.tar.zst" \
./build_dir ./dl ./staging_dir ./tmp; then ./build_dir ./dl ./staging_dir ./tmp; then
echo -e "${GREEN_COLOR}│ ✓ 工具链缓存完成${RESET}" echo -e "${GREEN_COLOR}│ ✓ 工具链缓存完成${RESET}"
else else
error_exit "工具链缓存打包失败" error_exit "工具链缓存打包失败"
fi fi
echo -e "${GREEN_COLOR}└─ ✓ 工具链任务完成${RESET}" local endtime=$(date +'%Y-%m-%d %H:%M:%S')
local start_seconds=$(date --date="$starttime" +%s)
local end_seconds=$(date --date="$endtime" +%s)
local SEC=$((end_seconds-start_seconds))
echo -e "${GREEN_COLOR}└─ ✓ 工具链任务完成,耗时: $(( SEC / 3600 ))h,$(( (SEC % 3600) / 60 ))m,$(( (SEC % 3600) % 60 ))s${RESET}"
exit 0 exit 0
else fi
print_info "开始编译 OpenWrt..."
print_success "工具链编译完成"
}
# 编译 OpenWRT
compile_openwrt() {
print_info "开始编译 OpenWRT..."
local starttime=$(date +'%Y-%m-%d %H:%M:%S')
echo -e "${BLUE_COLOR}├─ 执行 make 编译...${RESET}" echo -e "${BLUE_COLOR}├─ 执行 make 编译...${RESET}"
if make -j"$cores" IGNORE_ERRORS="n m"; then if make -j"$CPU_CORES" IGNORE_ERRORS="n m"; then
echo -e "${GREEN_COLOR}│ ✓ 编译过程完成${RESET}" echo -e "${GREEN_COLOR}│ ✓ 编译过程完成${RESET}"
else else
error_exit "OpenWrt 编译失败" error_exit "OpenWrt 编译失败"
fi fi
fi
# Compile time # 计算编译时间
endtime=`date +'%Y-%m-%d %H:%M:%S'` local endtime=$(date +'%Y-%m-%d %H:%M:%S')
start_seconds=$(date --date="$starttime" +%s) local start_seconds=$(date --date="$starttime" +%s)
end_seconds=$(date --date="$endtime" +%s) local end_seconds=$(date --date="$endtime" +%s)
SEC=$((end_seconds-start_seconds)) local SEC=$((end_seconds-start_seconds))
echo -e "${BLUE_COLOR}├─ 检查编译结果...${RESET}" echo -e "${BLUE_COLOR}├─ 检查编译结果...${RESET}"
if [ -f bin/targets/*/*/sha256sums ]; then if [ -f bin/targets/*/*/sha256sums ]; then
@@ -444,9 +507,13 @@ compile_openwrt() {
main() { main() {
local version="${1:-}" local version="${1:-}"
local architecture="${2:-}" local architecture="${2:-}"
local build_mode="${3:-normal}"
# 参数验证 # 参数验证
validate_arguments "$version" "$architecture" validate_arguments "$version" "$architecture" "$build_mode"
# 设置工具链架构
setup_toolchain_arch "$architecture"
# 显示横幅 # 显示横幅
show_banner show_banner
@@ -458,30 +525,46 @@ main() {
setup_build_environment setup_build_environment
setup_curl_progress setup_curl_progress
# 根据架构设置工具链类型 print_success "初始化完成,开始构建 $architecture 架构的 $version 版本,模式:$BUILD_MODE"
case "$architecture" in
rockchip)
toolchain_arch="aarch64_generic"
;;
x86_64)
toolchain_arch="x86_64"
;;
esac
export toolchain_arch
print_success "初始化完成,开始构建 $architecture 架构的 $version 版本"
# 记录开始时间 # 记录开始时间
START_TIME=$(date +%s) START_TIME=$(date +%s)
# 执行编译脚本 # 步骤1: 准备源代码
compilation_script "$architecture" prepare_source_code
# 缓存工具链 # 步骤2: 执行构建脚本
cache_toolchain "$toolchain_arch" execute_build_scripts "$architecture"
# 生成 Config 文件 # 步骤3: 加载配置文件
load_configuration "$architecture"
# 步骤4: 生成 Config 文件(必须在工具链之前)
generate_config_file generate_config_file
# 根据编译模式执行不同逻辑
case "$BUILD_MODE" in
"accelerated")
# 加速模式:下载预编译工具链
download_prebuilt_toolchain
# 然后直接编译 OpenWRT
compile_openwrt
;;
"normal")
# 普通模式:完整编译工具链和 OpenWRT
compile_toolchain
compile_openwrt
;;
"toolchain-only")
# 仅编译工具链模式
compile_toolchain
;;
esac
# 计算总耗时
local END_TIME=$(date +%s)
local TOTAL_SEC=$((END_TIME - START_TIME))
print_success "构建完成!总耗时: $((TOTAL_SEC / 3600))h,$(( (TOTAL_SEC % 3600) / 60 ))m,$((TOTAL_SEC % 60))s"
} }
# 脚本入口点 # 脚本入口点