#!/bin/bash #======================================================================= # FILE: scripts/build-board.sh # DESC: 把源码同步到目标板卡 (RK3588 / Ubuntu 22.04),在板卡原生编译 # (aarch64 直编,比本地 QEMU 模拟快约 10 倍),并把产物部署到 # /root/work/h100/bin/,可选重启 systemd 服务。 # # 用法: # ./scripts/build-board.sh # 同步+编译+部署(不重启) # ./scripts/build-board.sh --start # 编译后重启 3 个服务 # ./scripts/build-board.sh --clean # 板卡上重新 cmake 再编译 # ./scripts/build-board.sh --jobs 4 # 指定并行度(默认板卡 nproc) # # 参数: # --host 目标主机(默认 192.168.0.223) # --user 登录用户(默认 root) # --board-src 板卡源码目录(默认 /root/work/h100/src) # --board-bin 板卡部署目录(默认 /root/work/h100/bin) # --jobs 编译并行度(默认板卡 nproc) # --start 编译部署后重启服务 # --clean 先重新 cmake(配置变更时用) # -h, --help 显示帮助 # # 前置: 板卡已配免密 SSH,且有编译环境(cmake/g++/MOOS/jsoncpp), # 源码已能本地编译(本脚本只负责同步+板卡编译)。 #======================================================================= set -uo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(dirname "${SCRIPT_DIR}")" HOST="192.168.0.223" USER="root" BOARD_SRC="/root/work/h100/src" BOARD_BIN="/root/work/h100/bin" JOBS="" DO_START=0 DO_CLEAN=0 SERVICES=(moosdb pPowerManger pPowerMangerHost) info() { printf '\033[1;36m[build-board]\033[0m %s\n' "$*"; } ok() { printf '\033[1;32m[build-board]\033[0m %s\n' "$*"; } warn() { printf '\033[1;33m[build-board]\033[0m %s\n' "$*"; } err() { printf '\033[1;31m[build-board]\033[0m %s\n' "$*"; } usage() { sed -n '2,29p' "${BASH_SOURCE[0]}" | sed 's/^# \{0,1\}//' exit 0 } #------------------------------------------------------------------- # 参数解析 #------------------------------------------------------------------- while [ $# -gt 0 ]; do case "$1" in --host) [ $# -ge 2 ] || { err "--host 需要参数"; exit 1; }; HOST="$2"; shift 2 ;; --user) [ $# -ge 2 ] || { err "--user 需要参数"; exit 1; }; USER="$2"; shift 2 ;; --board-src) [ $# -ge 2 ] || { err "--board-src 需要参数"; exit 1; }; BOARD_SRC="$2"; shift 2 ;; --board-bin) [ $# -ge 2 ] || { err "--board-bin 需要参数"; exit 1; }; BOARD_BIN="$2"; shift 2 ;; --jobs) [ $# -ge 2 ] || { err "--jobs 需要参数"; exit 1; }; JOBS="$2"; shift 2 ;; --start) DO_START=1; shift ;; --clean) DO_CLEAN=1; shift ;; -h|--help) usage ;; *) err "未知参数: $1(见 --help)"; exit 1 ;; esac done SSH_TARGET="${USER}@${HOST}" SSH="ssh -o BatchMode=yes -o ConnectTimeout=5" #------------------------------------------------------------------- # 1. 前置检查 #------------------------------------------------------------------- if ! ${SSH} "${SSH_TARGET}" 'true' 2>/dev/null; then err "无法免密 SSH 到 ${SSH_TARGET}" err "请先配置免密登录: ssh-copy-id ${SSH_TARGET}" exit 1 fi ok "SSH 连接正常: ${SSH_TARGET}" #------------------------------------------------------------------- # 2. 同步源码到板卡(排除构建产物 / git / 数据) #------------------------------------------------------------------- info "同步源码到板卡 ${BOARD_SRC} ..." rsync -az --delete \ --exclude='build/' \ --exclude='build-arm64/' \ --exclude='build-native/' \ --exclude='build-nosa-test/' \ --exclude='bin/' \ --exclude='.git/' \ --exclude='.cache/' \ --exclude='reports/' \ --exclude='*.log' \ --exclude='*.db' \ --exclude='CMakeCache.txt' \ "${PROJECT_ROOT}/" "${SSH_TARGET}:${BOARD_SRC}/" || { err "rsync 源码失败"; exit 1; } ok "源码已同步" #------------------------------------------------------------------- # 3. 板卡原生编译 #------------------------------------------------------------------- if [ "${DO_CLEAN}" = "1" ]; then info "重新 cmake(--clean)..." ${SSH} "${SSH_TARGET}" "rm -rf ${BOARD_SRC}/build-native && mkdir -p ${BOARD_SRC}/build-native && \ cd ${BOARD_SRC}/build-native && cmake -DCMAKE_BUILD_TYPE=Release .." \ || { err "cmake 失败"; exit 1; } ok "cmake 完成" else ${SSH} "${SSH_TARGET}" "mkdir -p ${BOARD_SRC}/build-native" # 若首次未配置过则先 cmake if ! ${SSH} "${SSH_TARGET}" "[ -f ${BOARD_SRC}/build-native/Makefile ]"; then info "首次编译,先 cmake ..." ${SSH} "${SSH_TARGET}" "cd ${BOARD_SRC}/build-native && cmake -DCMAKE_BUILD_TYPE=Release .." \ || { err "cmake 失败"; exit 1; } ok "cmake 完成" fi fi if [ -z "${JOBS}" ]; then JOBS="$(${SSH} "${SSH_TARGET}" nproc)" fi info "板卡编译 (make -j${JOBS}) ..." if ! ${SSH} "${SSH_TARGET}" "cd ${BOARD_SRC}/build-native && make -j${JOBS}"; then err "板卡编译失败(见上方输出)" exit 1 fi ok "板卡编译完成" #------------------------------------------------------------------- # 4. 部署产物到板卡运行目录 #------------------------------------------------------------------- info "部署产物到 ${BOARD_BIN}/ ..." ${SSH} "${SSH_TARGET}" "mkdir -p ${BOARD_BIN} && \ cp -f ${BOARD_SRC}/bin/pPowerManger ${BOARD_BIN}/pPowerManger && \ cp -f ${BOARD_SRC}/bin/pPowerMangerHost ${BOARD_BIN}/pPowerMangerHost && \ chmod +x ${BOARD_BIN}/pPowerManger ${BOARD_BIN}/pPowerMangerHost" \ || { err "部署产物失败"; exit 1; } ok "产物已部署" echo "" ok "产物: ${BOARD_BIN}/pPowerManger (aarch64)" ${SSH} "${SSH_TARGET}" "file ${BOARD_BIN}/pPowerManger | cut -c1-60" #------------------------------------------------------------------- # 5. 可选重启服务 #------------------------------------------------------------------- if [ "${DO_START}" = "1" ]; then info "重启服务 ..." ${SSH} "${SSH_TARGET}" "systemctl restart ${SERVICES[*]}" \ || { err "重启服务失败"; exit 1; } sleep 3 ok "服务状态: $(${SSH} "${SSH_TARGET}" "systemctl is-active ${SERVICES[*]}")" else echo "" info "未重启服务。需要重启请加 --start 或手动:" echo " systemctl restart ${SERVICES[*]}" fi echo "" ok "完成。"