GrabBag/GrabBagPrj/buildArmPrj.sh
2026-06-26 17:49:32 +08:00

141 lines
2.9 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
set -u
set -o pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BUILD_DIR="${SCRIPT_DIR}/buildarm/GrabBagPrj"
source "${SCRIPT_DIR}/project_registry.sh"
show_help() {
cat <<'EOF'
用法:
./buildArmPrj.sh [-r] [-q] [-h] [AppName]
选项:
-r 删除 buildarm 后重新编译
-q 强制重新执行 qmake
-h 显示帮助
参数:
AppName 可选的编译目标;不传则编译全部
可编译目标:
EOF
list_projects | sed 's/^/ - /'
}
CLEAN_BUILD=false
FORCE_QMAKE=false
TARGET_APP=""
while getopts "rqh" opt; do
case "$opt" in
r)
CLEAN_BUILD=true
;;
q)
FORCE_QMAKE=true
;;
h)
show_help
exit 0
;;
*)
show_help
exit 1
;;
esac
done
shift $((OPTIND - 1))
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
exit 1
fi
fi
START_TIME=$(date +%s)
if [ "${CLEAN_BUILD}" = true ]; then
echo "清理 ${SCRIPT_DIR}/buildarm"
rm -rf "${SCRIPT_DIR}/buildarm"
FORCE_QMAKE=true
fi
mkdir -p "${BUILD_DIR}"
cd "${BUILD_DIR}"
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 [ -n "${TARGET_APP}" ]; then
QMAKE_ARGS+=("TARGET_APP=${TARGET_APP}")
echo "编译目标: ${TARGET_APP}"
else
echo "编译全部目标"
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
else
echo "跳过 qmake"
fi
JOBS="${JOBS:-$(getconf _NPROCESSORS_ONLN 2>/dev/null || echo 8)}"
echo "=========================================="
echo "一次性编译,并行度 ${JOBS}"
echo "(若内存不足出现 cc1plus 被 Killed降低并行度重试JOBS=4 ./buildArmPrj.sh 或 JOBS=2 ./buildArmPrj.sh"
# 一次性编译全部目标(并行度由 JOBS 控制,默认取 CPU 核心数)
BUILD_RESULT=0
make -j"${JOBS}" || BUILD_RESULT=$?
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}"
else
echo "全部目标编译成功,耗时 ${MINUTES}${SECONDS}"
fi
exit 0
fi
if [ -n "${TARGET_APP}" ]; then
echo "${TARGET_APP} 编译失败,耗时 ${MINUTES}${SECONDS}" >&2
else
echo "编译失败,耗时 ${MINUTES}${SECONDS}" >&2
fi
exit "${BUILD_RESULT}"