Files
build_toochain/linux_shell/build_script/base/common.bash
T
2026-07-07 15:23:39 +08:00

175 lines
4.3 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
# shellcheck disable=SC2155
if ! type "include" > /dev/null 2>&1; then
include() {
. "$(cd "$(dirname "$1")" && pwd)/${2}";
};
fi
include "${BASH_SOURCE[0]}" ../pragma_once.bash
if ! pragma_once ${BASH_SOURCE[0]}; then return 0; fi
include "${BASH_SOURCE[0]}" ./global_rely/export.bash
# shellcheck source=./global_rely/export.bash
exec_record() {
local cmd="$1"
local start_time=$(date '+%Y-%m-%d %H:%M:%S.%3N')
local start_ts=$(date +%s.%3N)
log_info "[$(pwd)] exec: $cmd "
eval "$cmd"
local ret=$?
local end_time=$(date '+%Y-%m-%d %H:%M:%S.%3N')
local end_ts=$(date +%s.%3N)
local duration=$(awk "BEGIN {print $end_ts - $start_ts}")
if [ $ret -ne 0 ]; then
local pretty_cmd=$(printf '%s\n' "$cmd" | sed 's/ --/\n--/g')
log_error "$(pwd):cmd failed: $pretty_cmd, duration ${duration}s"
else
log_info "ok duration ${duration}s"
fi
return $ret
}
exec_record_fast_fail() {
local cmd="$1"
local log_file="$LOG_PATH"
local start_time
local start_ts
local end_time
local end_ts
local duration
local ret
local pretty_cmd
start_time=$(date '+%Y-%m-%d %H:%M:%S.%3N')
start_ts=$(date +%s.%3N)
log_info "[$(pwd)] exec: $cmd"
{
echo "[CMD-BEGIN] $start_time"
echo "[PWD] $(pwd)"
echo "[CMD] $cmd"
eval "$cmd"
ret=$?
echo "[CMD-END] ret=$ret"
exit $ret
} 2>&1 | tee -a "$log_file"
ret=${PIPESTATUS[0]}
end_time=$(date '+%Y-%m-%d %H:%M:%S.%3N')
end_ts=$(date +%s.%3N)
duration=$(awk "BEGIN {print $end_ts - $start_ts}")
if [ $ret -ne 0 ]; then
pretty_cmd=$(printf '%s\n' "$cmd" | sed 's/ --/\n--/g')
log_error "$(pwd):cmd failed: $pretty_cmd, duration ${duration}s"
else
log_info "ok duration ${duration}s"
fi
return $ret
}
exec_record_fast_fail_no_log() {
local cmd="$1"
exec_record "$cmd"
local ret=$?
if [ $ret -ne 0 ]; then
exit $ret
fi
}
append_rpath() {
if [ -z "$1" ] || [ -z "$2" ]; then
echo "Usage: update_rpath <directory> <rpath_value>"
return 1
fi
DIR_PATH="$1"
RPATH_VALUE="$2"
if [ ! -d "$DIR_PATH" ]; then
echo "Error: Directory '$DIR_PATH' does not exist."
return 1
fi
find "$DIR_PATH" -type f -exec file {} \; | grep -E 'ELF|shared object' | while read -r line; do
#find "$DIR_PATH" -type f ! -name "*.o" | parallel file {} | grep -E 'ELF|shared object' | while read -r line; do
FILE_PATH=$(echo "$line" | cut -d: -f1)
RPATH=$(readelf -d "$FILE_PATH" | grep -i rpath)
if [ ! -z "$RPATH" ]; then
CURRENT_RPATH=$(readelf -d "$FILE_PATH" | grep -i rpath | awk '{print $2}' | tr -d '[]')
NEW_RPATH="$CURRENT_RPATH:$RPATH_VALUE"
else
NEW_RPATH="$RPATH_VALUE"
fi
patchelf --set-rpath "$NEW_RPATH" "$FILE_PATH"
# 验证修改是否成功
if [ $? -eq 0 ]; then
echo "Updated rpath for: $FILE_PATH"
else
echo "Error: Failed to update rpath for $FILE_PATH"
fi
done
}
merge_args(){
local -n ret=$1
local t=$2
local list=""
shift 2
for param in "$@"; do
list="${list}${list:+$t}$param"
done
ret="$list"
}
#load_toolchain() {
# p=$1 # 工具链根路径
# n=$2 # 工具链架构名三元组
# local d="${p}/${n}"
# local d2="${p}/${n}/usr"
#
# local libs="$d2/lib:$d2/lib64:${p}/lib:${p}/lib64"
# # exe运行时查找库的路径
# export LD_LIBRARY_PATH="$libs${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
# export LIBRARY_PATH="$libs${LIBRARY_PATH:+:$LIBRARY_PATH}"
# # exe查找路径
# export PATH="${p}/bin${PATH:+:$PATH}"
#}
load_toolchain() {
local p="$1" # 工具链根路径(prefix
local n="$2" # 三元组目录名
local d="${p}/${n}"
log_info "load_toolchain path: ${p} 三元组: ${n}"
# 兼容两种布局:
# 1) prefix/<triplet>/usr/...
# 2) prefix/<triplet>/sysroot/usr/...
local d2="${d}/usr"
if [[ ! -d "$d2" && -d "${d}/sysroot/usr" ]]; then
d2="${d}/sysroot/usr"
fi
# 如果还是不存在,就直接跳过
local libs
if [[ ! -d "$d2" ]]; then
log_warn "skip load_toolchain: no usr found under ${d2}"
libs="${p}/lib:${p}/lib64"
else
libs="${d2}/lib:${d2}/lib64:${p}/lib:${p}/lib64"
fi
export LD_LIBRARY_PATH="${libs}${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
export LIBRARY_PATH="${libs}${LIBRARY_PATH:+:$LIBRARY_PATH}"
export PATH="${p}/bin${PATH:+:$PATH}"
}
return 0