当前使用记录:
bash
############################################################ 工具链管理 ##############################################
function use_toolchain() {
# 切换makefile make时的CROSS变量链接即可,不要频繁动态切换path
case $1 in
###################### API install system path tool chain ####################################
"arm32-linux-hf")
export CROSS_COMPILE="arm-linux-gnueabihf-"
echo "Switched to: ARM32 Linux (Hard-float) system path IMX6ULL used"
echo " 编译器 arm-linux-gnueabihf-gcc "
;;
#################### myself install chain #################################
"arm32-linux-sf17")
# 你的 Linaro 5.5 工具链 (32位 ARM Linux, 软浮点)
export PATH="/usr/local/arm/gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabi/bin:$PATH"
export CROSS_COMPILE="arm-linux-gnueabi-"
echo " Switched to: ARM32 Linux (Soft-float) - GCC 5.5"
echo " Compiler: arm-linux-gnueabi-gcc"
;;
"arm32-bare-20")
# 旧版 Cortex-M 裸机 (STM32)
export PATH="/usr/local/arm/gcc-arm-none-eabi-10-2020-q4-major/bin:$PATH"
export CROSS_COMPILE="arm-none-eabi-"
echo " Switched to: ARM32 Bare-metal (Old) - GCC 10.2"
echo " Compiler: arm-none-eabi-gcc"
;;
"arm32-bare-26")
# 新版 Cortex-M 裸机 (STM32)
export PATH="/usr/local/arm/arm-gnu-toolchain-15.2.rel1-x86_64-arm-none-eabi/bin:$PATH"
export CROSS_COMPILE="arm-none-eabi-"
echo " Switched to: ARM32 Bare-metal (New) - GCC 15.2"
echo " Compiler: arm-none-eabi-gcc"
;;
"arm64-bare-26")
# 64位 ARM 裸机
export PATH="/usr/local/arm/arm-gnu-toolchain-15.2.rel1-x86_64-aarch64-none-elf/bin:$PATH"
# 注意:64位通常不设 CROSS_COMPILE,直接用全名
echo " Switched to: ARM64 Bare-metal - GCC 15.2"
echo " Compiler: aarch64-none-elf-gcc"
;;
*)
echo " Available Toolchains:"
echo " use_toolchain arm32-linux-hf # imx6ull API 安装 Linux (硬浮点)"
echo " use_toolchain arm32-linux-sf17 # 32位 ARM Linux (软浮点)(GCC 5.5)"
echo " use_toolchain arm32-bare-20 # STM32 (旧版)(GCC 10.2, Old)"
echo " use_toolchain arm32-bare-26 # STM32 (新版)(GCC 15.2, New)"
echo " use_toolchain arm64-bare-26 # 64位 ARM 裸机(GCC 15.2)"
;;
esac
# ------------- 3. 调试:打印当前生效的编译器 -------------
if [ -n "$CROSS_COMPILE" ]; then
echo "📍 当前交叉编译前缀: \$CROSS_COMPILE = $CROSS_COMPILE"
echo "📍 编译器路径: $(which ${CROSS_COMPILE}gcc)"
fi
# 显示当前生效的编译器路径(用于调试)
# echo " Current GCC: $(which $(echo $CROSS_COMPILE)gcc)"
}
path长度精确添加。但实际上度对于常开关的Linux虚拟机是不影响或者说没必要的
bash
function use_toolchain() {
# ----------------------- 1. Smart PATH Management -----------------------
# Add new path only if it's not already in PATH to avoid duplication
unset NEW_PATH
# Detect system type for proper PATH handling
if [[ "$OSTYPE" == "cygwin" || "$OSTYPE" == "msys" ]]; then
PATH_SEPARATOR=";"
MAX_PATH_LENGTH=30000 # Windows system limit
else
PATH_SEPARATOR=":"
MAX_PATH_LENGTH=500000 # Linux/macOS system
fi
case $1 in
"arm32-linux-hf")
# System toolchain, no need to modify PATH
export CROSS_COMPILE="arm-linux-gnueabihf-"
echo "Switched to: ARM32 Linux (Hard-float)"
;;
"arm32-linux-sf17")
NEW_PATH="/usr/local/arm/gcc-linaro-5.5.0-2017.10-x86_64_arm-linux-gnueabi/bin"
# Verify path exists before adding
if [ ! -d "$NEW_PATH" ]; then
echo "Error: Toolchain path '$NEW_PATH' does not exist"
return 1
fi
# Check if path is already in PATH (precise match)
if [[ ":$PATH:" != *":$NEW_PATH:"* ]]; then
export PATH="$NEW_PATH:$PATH"
fi
export CROSS_COMPILE="arm-linux-gnueabi-"
echo "Switched to: ARM32 Linux (Soft-float) - GCC 5.5"
;;
"arm32-linux-sf19")
NEW_PATH="/usr/local/arm/gcc-linaro-9.2.1-2019.12-x86_64_arm-linux-gnueabi/bin"
if [ ! -d "$NEW_PATH" ]; then
echo "Error: Toolchain path '$NEW_PATH' does not exist"
return 1
fi
if [[ ":$PATH:" != *":$NEW_PATH:"* ]]; then
export PATH="$NEW_PATH:$PATH"
fi
export CROSS_COMPILE="arm-linux-gnueabi-"
echo "Switched to: ARM32 Linux (Soft-float) - GCC 9.2"
;;
"arm64-linux-hf")
NEW_PATH="/usr/local/arm/gcc-linaro-5.5.0-2017.10-x86_64_aarch64-linux-gnu/bin"
if [ ! -d "$NEW_PATH" ]; then
echo "Error: Toolchain path '$NEW_PATH' does not exist"
return 1
fi
if [[ ":$PATH:" != *":$NEW_PATH:"* ]]; then
export PATH="$NEW_PATH:$PATH"
fi
export CROSS_COMPILE="aarch64-linux-gnu-"
echo "Switched to: ARM64 Linux (Hard-float) - GCC 5.5"
;;
"arm64-linux-sf19")
NEW_PATH="/usr/local/arm/gcc-linaro-9.2.1-2019.12-x86_64_aarch64-linux-gnu/bin"
if [ ! -d "$NEW_PATH" ]; then
echo "Error: Toolchain path '$NEW_PATH' does not exist"
return 1
fi
if [[ ":$PATH:" != *":$NEW_PATH:"* ]]; then
export PATH="$NEW_PATH:$PATH"
fi
export CROSS_COMPILE="aarch64-linux-gnu-"
echo "Switched to: ARM64 Linux (Soft-float) - GCC 9.2"
;;
"arm-none-eabi17")
NEW_PATH="/usr/local/arm/gcc-linaro-5.5.0-2017.10-x86_64_arm-none-eabi/bin"
if [ ! -d "$NEW_PATH" ]; then
echo "Error: Toolchain path '$NEW_PATH' does not exist"
return 1
fi
if [[ ":$PATH:" != *":$NEW_PATH:"* ]]; then
export PATH="$NEW_PATH:$PATH"
fi
export CROSS_COMPILE="arm-none-eabi-"
echo "Switched to: ARM Baremetal (GCC 5.5)"
;;
"arm-none-eabi19")
NEW_PATH="/usr/local/arm/gcc-linaro-9.2.1-2019.12-x86_64_arm-none-eabi/bin"
if [ ! -d "$NEW_PATH" ]; then
echo "Error: Toolchain path '$NEW_PATH' does not exist"
return 1
fi
if [[ ":$PATH:" != *":$NEW_PATH:"* ]]; then
export PATH="$NEW_PATH:$PATH"
fi
export CROSS_COMPILE="arm-none-eabi-"
echo "Switched to: ARM Baremetal (GCC 9.2)"
;;
*)
echo "Error: Unknown toolchain '$1'"
echo "Available options:"
echo " arm32-linux-hf - ARM32 Linux (Hard-float)"
echo " arm32-linux-sf17 - ARM32 Linux (Soft-float) - GCC 5.5"
echo " arm32-linux-sf19 - ARM32 Linux (Soft-float) - GCC 9.2"
echo " arm64-linux-hf - ARM64 Linux (Hard-float) - GCC 5.5"
echo " arm64-linux-sf19 - ARM64 Linux (Soft-float) - GCC 9.2"
echo " arm-none-eabi17 - ARM Baremetal (GCC 5.5)"
echo " arm-none-eabi19 - ARM Baremetal (GCC 9.2)"
return 1
;;
esac
# ----------------------- 2. Advanced PATH Deduplication -----------------------
if [ -n "$NEW_PATH" ]; then
# Remove duplicates while preserving order, and trim trailing separator
export PATH=$(echo -n "$PATH" | awk -v RS="$PATH_SEPARATOR" -v ORS="$PATH_SEPARATOR" '!a[$1]++' | sed "s/[$PATH_SEPARATOR]\+$//")
fi
# ----------------------- 3. Debug & Verification Info -----------------------
if [ -n "$CROSS_COMPILE" ]; then
echo "Current prefix: $CROSS_COMPILE"
echo "Compiler path: $(which ${CROSS_COMPILE}gcc)"
echo "PATH structure:"
echo "$PATH" | tr "$PATH_SEPARATOR" '\n' | sed 's/^/ - /'
fi
# PATH health check
PATH_LENGTH=${#PATH}
PATH_ITEMS=$(echo "$PATH" | tr "$PATH_SEPARATOR" '\n' | wc -l)
echo "PATH status: $PATH_LENGTH chars | $PATH_ITEMS entries"
# Warn if PATH is approaching system limits
if [ $PATH_LENGTH -gt $MAX_PATH_LENGTH ]; then
echo "Warning: PATH is very long, consider cleaning up"
fi
}
# ----------------------- 4. Helper: PATH Cleanup Tool -----------------------
function clean_path() {
# Detect system type for proper PATH handling
if [[ "$OSTYPE" == "cygwin" || "$OSTYPE" == "msys" ]]; then
PATH_SEPARATOR=";"
else
PATH_SEPARATOR=":"
fi
echo "Original PATH: ${#PATH} chars | $(echo "$PATH" | tr "$PATH_SEPARATOR" '\n' | wc -l) entries"
# Remove duplicates and non-existent directories
CLEANED_PATH=$(echo -n "$PATH" | awk -v RS="$PATH_SEPARATOR" -v ORS="$PATH_SEPARATOR" '!a[$1]++' | tr "$PATH_SEPARATOR" '\n' | while read p; do
if [ -d "$p" ]; then
echo "$p"
fi
done | tr '\n' "$PATH_SEPARATOR" | sed "s/[$PATH_SEPARATOR]\+$//")
export PATH="$CLEANED_PATH"
echo "Cleaned PATH: ${#PATH} chars | $(echo "$PATH" | tr "$PATH_SEPARATOR" '\n' | wc -l) entries"
echo "Done: Invalid paths and duplicates removed"
}
# ----------------------- 5. Usage Examples -----------------------
# Switch toolchain:
# use_toolchain arm32-linux-sf19
#
# Verify current compiler:
# which arm-linux-gnueabi-gcc
#
# Clean PATH (run periodically):
# clean_path