Files
he/process/build.sh
T
2026-06-22 15:35:18 +08:00

176 lines
6.6 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
#跳转到当前脚本所在路径
cd "$(dirname "$(readlink -f "$0")")"
ECHO() {
local current_lineno=${BASH_LINENO[0]} # 获取调用ECHO的行号
local parent_lineno=$((current_lineno-1)) # 通常我们想要的是调用ECHO的行号,所以需要减1
# echo -e "\e[36;47mLine $parent_lineno:\e[0m $@" # 输出行号和传入的参数
# 使用printf格式化行号,确保总是6位数字,前面用空格填充
local formatted_lineno=$(printf "%6d" "$parent_lineno")
# echo "Line $formatted_lineno: $@" # 输出格式化的行号和传入的参数
echo -e "\e[36m[$formatted_lineno]: \e[0m$@" # 输出行号和传入的参数
}
function help {
echo -e "help: \n 脚本使用说明:"
echo -e "\t ./build.sh # 默认编译(不含spdlog,sqlite3及external_/)"
echo -e "\t ./build.sh all # 全部编译(all:含spdlog,sqlite3; ext: external_/含拷贝)"
echo -e "\t ./build.sh ext # 编译external_(并拷贝external_/的动态库和程序)"
echo -e "\t ./build.sh extlib # 只拷贝external_/的动态库和程序"
echo -e "\t ./build.sh hmi # 只编译 ems_hmi程序,假设库文件已更新"
echo -e "\t ./build.sh -r # 编译全部,并release全部升级包"
echo -e "\t ./build.sh -r usb # 编译全部,并release U盘升级包"
echo -e "\t ./build.sh -r ota # 编译全部,并release 网络升级包(云平台)"
echo -e "\t ./build.sh -ro # 直接release升级包,不编译"
echo -e "\t ./script/release_usb.sh # 直接release usb升级包,不编译"
echo -e "\t ./logical/build.sh # 编译logical"
echo -e "\t ./lib_src/a_src/build.sh # 编译静态库"
echo -e "\t ./tools_code/prdebug/build.sh # 编译调试工具程序"
}
# help
if [[ "$1" == *-h* ]]; then ##if [ "$#" = 1 ] && [ "$1" = "-h" ]; then
help
exit 0 # 退出脚本
fi
# 获取脚本开始执行的时间
start_time=$(date +%s)
# 计算并打印脚本执行时间函数
function print_execution_time {
# 脚本结束执行的时间戳
end_time=$(date +%s)
# 计算执行时间差(秒)
execution_time=$((end_time - start_time))
# 将执行时间差转换为 HH:MM:SS 格式
execution_time_formatted=$(date -u -d @$execution_time +"%T")
# 判断正常还是异常退出
if [ $1 -eq 0 ];then
SET_COLOR="\e[32m "
else
SET_COLOR="\e[31m error at $(pwd) \n\e[1m"
fi
# 打印执行时间
mydir_name="$(d=$(pwd); echo ${d##*/})"
echo -e "${SET_COLOR} [$1] 执行时间:$execution_time_formatted ( $mydir_name )\e[0m "
}
# 捕获退出信号并调用函数
trap 'echo "$(print_execution_time $?)"' EXIT
# 获取脚本的名称
script_name=$(basename "$0")
# 检查是否被自身调用
#if [ "$0" = "$script_name" ]; then
# echo "脚本被自身调用,请检查无效路径"
# exit 1 # 退出脚本
#fi
# 添加可执行权限
find . -name "*.sh"|xargs chmod +x
current_project_path=$(pwd)
export current_project_name=`echo ${current_project_path##*/}`
echo "current_project_path = ${current_project_path}"
echo "====================== build shell start [ ${current_project_name} ] ========================="
pd_complier_type=${TARGET_PRODUCT}
if [ -z ${TARGET_PRODUCT} ];then
PROJECT_ROOT=$(while [ ! -f "build/envsetup.sh" ]; do [ "$(pwd)" = "/" ] && exit 1; cd ..; done; pwd)
if [ ! -z ${PROJECT_ROOT} ];then
source ${PROJECT_ROOT}/build/envsetup.sh && lunch LAST
if [ $? -eq 255 ];then exit 0; fi
pd_complier_type=${TARGET_PRODUCT}
fi
fi
echo -e " ready to build\e[34;1m ${pd_complier_type} \e[0m target [\e[34;1m ${current_project_name}\e[0m ] ......"
unset LD_LIBRARY_PATH
export pd_complier_name="$(if [[ "${TARGET_PRODUCT}" =~ "imx"* ]]; then echo "complier_arm"; else echo "complier_x86"; fi)"
export arm_sysroot_path=${SYSROOT}
export arm_compile_flags=${CFLAGS}
# set obj at: platform/out/build/xxxx/build
check_dirs() { # check dir: process/ script/
local dir="$1"; if [[ -d "$dir/process" && -d "$dir/script" ]]; then echo "$dir"; exit 0;fi
local parent="${dir%/*}"; if [[ "$parent" != "$dir" ]]; then check_dirs "$parent"; else echo "$(pwd)"; fi
}
base_folder="$(echo ${PROJECT_ROOT}|tr -s '/')"
build_path=$(echo "$current_project_path" | sed "s|${base_folder}|${base_folder}/out/build/${pd_complier_type}|g")
echo "build_path = ${build_path}"
if [[ $1 == "clean" ]] || [[ $1 == "-c" ]] || [[ $1 == "all" ]];then
if [[ "${build_path}" =~ "/out/build/" ]];then
rm -rvf ${build_path}
else
echo "Warn: ${build_path} is set as Code dir, try to rm -f *.o"
if [ -d ${build_path}];then
find "${build_path}" -name '*.o' -print0 | xargs -r0 rm -f
find ${build_path} -name 'cmake_install.cmake' -print0 | xargs -r0 rm -f
find ${build_path} -name 'CMakeCache.txt' -print0 | xargs -r0 rm -f
find ${build_path} -type d -name 'CMakeFiles' -print0 | xargs -r0 rm -rf
fi
fi
echo " clean done."
echo "====================== build shell end [ ${current_project_name} ] =========================="
# if [[ $1 != "all" ]];then exit 0; fi
fi
## 强烈建议cd切换目录时用&&连接条件,如果切换失败则不会调用后面的cd -,避免cd不成功但cd ..成功后导致当前脚本被迭代运行
if [ "$1" == "-r" ] || [ "$1" == "-ro" ];then # "build.sh -r 带-r参数时增加打包"
echo "jump to release pakage.."
cd ../script && \
echo -e "\nrelease USB upgrade package:" && \
sh release.sh ${@:2} || exit $? && \
cd -
else
# auto find build
lib_src_dir_list=$(find */ -maxdepth 1 -type f -name build.sh -exec dirname {} \;)
statistical_lists=""
ignore_lists=""
for dir in ${lib_src_dir_list[@]}; do
if [[ "$dir" == "mqtt" ]]; then
echo "ignore directory $dir"
ignore_lists+=("\n\t\t\t\t${dir}")
continue
fi
if [[ "$dir" =~ "toolsXXX" ]]; then
echo -e "\e[35mignore dir: \e[34m$dir\e[0m"
ignore_lists+=("\n\t\t\t\t${dir}")
sh $dir/build.sh $@
#cd "$dir" || { echo "Failed to change to directory $dir"; continue; } && \
#echo -e "\e[33;42;1mcd `pwd`/ \e[0m" && \
#sh build.sh $@ || exit $? || { echo "Failed to execute build.sh in directory $dir"; cd - > /dev/null; continue; } && \
#cd -
else
if [ -f "$dir"/build.sh ];then
echo -e "\e[32m enter dir: \e[34m$dir\e[0m"
cd "$dir" || { echo "Failed to change to directory $dir"; continue; } && \
sh build.sh $@ || exit $? || { echo "Failed to execute build.sh in directory $dir"; cd - > /dev/null; continue; } && \
cd -
statistical_lists+=("\n\t\t\t\t$dir")
fi
fi
done
echo -e "\e[34m build Statistical Lists [$((${#statistical_lists[@]}-1))]: ${statistical_lists[@]} \e[0m"
echo -e "\e[37m Ignore Lists[$((${#ignore_lists[@]}-1))]: ${ignore_lists[@]} \e[0m"
fi