GrabBag/GrabBagPrj/buildArmPrj.sh

166 lines
4.1 KiB
Bash
Raw 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_ROOT="${SCRIPT_DIR}/buildarm"
BUILD_DIR="${BUILD_ROOT}/GrabBagPrj"
SDK_VARIANT="${SDK_VARIANT:-vznl}"
SDK_EXPLICIT=false
show_help() {
cat <<'EOF'
用法:
./buildArmPrj.sh [-r] [-q] [-h] [--sdk vznl|wood] [AppName]
选项:
-r 删除 buildarm 后重新编译
-q 强制重新执行 qmake
--sdk 选择 SDK:vznl(默认)或 wood,并执行全量重建
-h 显示帮助
参数:
AppName 可选的编译目标;不传则编译全部
可编译目标:
EOF
list_projects | sed 's/^/ - /'
}
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
;;
--sdk=*) SDK_VARIANT="${1#*=}"; SDK_EXPLICIT=true; shift ;;
--) shift; break ;;
-*) echo "未知选项: $1" >&2; show_help >&2; exit 1 ;;
*) break ;;
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
exit 1
fi
fi
START_TIME=$(date +%s)
if [ "${CLEAN_BUILD}" = true ]; then
echo "清理 ${BUILD_ROOT}"
rm -rf "${BUILD_ROOT}"
FORCE_QMAKE=true
fi
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}"
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})"
else
echo "编译全部目标(SDK: ${SDK_VARIANT})"
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}"