GrabBag/GrabBagPrj/buildArmPrj.sh

166 lines
4.1 KiB
Bash
Raw Normal View History

#!/bin/bash
set -u
set -o pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
2026-07-11 15:49:14 +08:00
BUILD_ROOT="${SCRIPT_DIR}/buildarm"
BUILD_DIR="${BUILD_ROOT}/GrabBagPrj"
SDK_VARIANT="${SDK_VARIANT:-vznl}"
SDK_EXPLICIT=false
2026-01-03 22:28:04 +08:00
show_help() {
cat <<'EOF'
用法:
./buildArmPrj.sh [-r] [-q] [-h] [--sdk vznl|wood] [AppName]
选项:
-r 删除 buildarm 后重新编译
-q 强制重新执行 qmake
--sdk 选择 SDK:vznl(默认)或 wood,并执行全量重建
-h 显示帮助
参数:
AppName 可选的编译目标;不传则编译全部
2026-01-03 22:28:04 +08:00
可编译目标:
EOF
list_projects | sed 's/^/ - /'
2026-01-03 22:28:04 +08:00
}
CLEAN_BUILD=false
FORCE_QMAKE=false
TARGET_APP=""
while [ $# -gt 0 ]; do
case "$1" in
-r) CLEAN_BUILD=true; shift ;;
-q) FORCE_QMAKE=true; shift ;;
-h|--help) show_help; exit 0 ;;
--sdk)
[ $# -ge 2 ] || { echo "--sdk 缺少参数" >&2; show_help >&2; exit 1; }
SDK_VARIANT="$2"
SDK_EXPLICIT=true
shift 2
2026-01-03 22:28:04 +08:00
;;
--sdk=*) SDK_VARIANT="${1#*=}"; SDK_EXPLICIT=true; shift ;;
--) shift; break ;;
-*) echo "未知选项: $1" >&2; show_help >&2; exit 1 ;;
*) break ;;
2026-01-03 22:28:04 +08:00
esac
done
case "${SDK_VARIANT}" in
vznl|wood) ;;
*) echo "不支持的 SDK: ${SDK_VARIANT}(可选 vznl 或 wood)" >&2; exit 1 ;;
esac
# 注册表中的 SDK 占位符和目标列表必须在参数解析后生成。
source "${SCRIPT_DIR}/project_registry.sh"
if [ "${SDK_EXPLICIT}" = true ]; then
# VrEyeDevice is a static library. Its objects must not be reused across SDK ABIs.
CLEAN_BUILD=true
FORCE_QMAKE=true
fi
if [ $# -gt 1 ]; then
show_help
exit 1
fi
if [ $# -eq 1 ]; then
TARGET_APP="$1"
if ! is_project "${TARGET_APP}"; then
echo "无效的编译目标: ${TARGET_APP}" >&2
echo >&2
show_help >&2
2026-01-03 22:28:04 +08:00
exit 1
fi
fi
START_TIME=$(date +%s)
if [ "${CLEAN_BUILD}" = true ]; then
2026-07-11 15:49:14 +08:00
echo "清理 ${BUILD_ROOT}"
rm -rf "${BUILD_ROOT}"
2026-01-03 22:28:04 +08:00
FORCE_QMAKE=true
fi
2026-07-11 15:49:14 +08:00
if [ "${FORCE_QMAKE}" = true ] && [ -d "${BUILD_ROOT}" ]; then
# Force recursive qmake to refresh stale subdir Makefiles while keeping objects/libs.
find "${BUILD_ROOT}" -type f \( -name Makefile -o -name .qmake.stash \) -delete
fi
mkdir -p "${BUILD_DIR}"
cd "${BUILD_DIR}"
2026-01-03 22:28:04 +08:00
QMAKE_ARGS=(
-r
CONFIG+=release
"MOC_DIR=moc"
"UI_DIR=ui"
"RCC_DIR=rcc"
"OBJECTS_DIR=obj"
"QMAKE_CC=aarch64-linux-gnu-gcc"
"QMAKE_CXX=aarch64-linux-gnu-g++"
"QMAKE_LINK=aarch64-linux-gnu-g++"
)
if [ "${SDK_VARIANT}" = "wood" ]; then
QMAKE_ARGS+=("CONFIG+=woodsdk")
else
QMAKE_ARGS+=("CONFIG+=vznlsdk")
fi
if [ -n "${TARGET_APP}" ]; then
QMAKE_ARGS+=("TARGET_APP=${TARGET_APP}")
echo "编译目标: ${TARGET_APP}(SDK: ${SDK_VARIANT})"
2026-01-03 22:28:04 +08:00
else
echo "编译全部目标(SDK: ${SDK_VARIANT})"
2026-01-03 22:28:04 +08:00
fi
if [ "${FORCE_QMAKE}" = true ] || [ ! -f "${BUILD_DIR}/Makefile" ]; then
echo "执行 qmake"
if ! qmake "${QMAKE_ARGS[@]}" "${SCRIPT_DIR}/GrabBagPrj.pro"; then
echo "qmake 执行失败" >&2
exit 1
fi
2026-01-03 22:28:04 +08:00
else
echo "跳过 qmake"
2026-01-03 22:28:04 +08:00
fi
JOBS="${JOBS:-$(getconf _NPROCESSORS_ONLN 2>/dev/null || echo 8)}"
echo "=========================================="
2026-06-26 17:49:32 +08:00
echo "一次性编译,并行度 ${JOBS}"
echo "(若内存不足出现 cc1plus 被 Killed,降低并行度重试:JOBS=4 ./buildArmPrj.sh 或 JOBS=2 ./buildArmPrj.sh)"
2026-06-26 17:49:32 +08:00
# 一次性编译全部目标(并行度由 JOBS 控制,默认取 CPU 核心数)
BUILD_RESULT=0
make -j"${JOBS}" || BUILD_RESULT=$?
2026-01-03 22:28:04 +08:00
END_TIME=$(date +%s)
ELAPSED=$((END_TIME - START_TIME))
MINUTES=$((ELAPSED / 60))
SECONDS=$((ELAPSED % 60))
if [ "${BUILD_RESULT}" -eq 0 ]; then
if [ -n "${TARGET_APP}" ]; then
echo "${TARGET_APP} 编译成功,耗时 ${MINUTES} 分 ${SECONDS} 秒"
2026-01-03 22:28:04 +08:00
else
echo "全部目标编译成功,耗时 ${MINUTES} 分 ${SECONDS} 秒"
2026-01-03 22:28:04 +08:00
fi
exit 0
fi
if [ -n "${TARGET_APP}" ]; then
echo "${TARGET_APP} 编译失败,耗时 ${MINUTES} 分 ${SECONDS} 秒" >&2
else
echo "编译失败,耗时 ${MINUTES} 分 ${SECONDS} 秒" >&2
fi
exit "${BUILD_RESULT}"