GrabBag/GrabBagPrj/buildArmPrj.sh

139 lines
2.7 KiB
Bash

#!/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 "执行 make -j${JOBS}"
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}"