001 Linux个性操作记录——交叉编译工具链高兼容性调用函数备用

当前使用记录:

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
相关推荐
lsh曙光2 分钟前
延时at指令和定时cron指令
linux·服务器·网络
圆山猫12 分钟前
[Virtualization](四):Linux KVM/RISC-V 的 vCPU 运行路径
java·linux·risc-v
布鲁飞丝29 分钟前
vivo Pulsar 万亿级消息处理实践()-Ansible运维部署
运维·ansible
XR12345678834 分钟前
企业全光网络架构选型技术白皮书:从物理层到运维层的全链路分析
运维·网络·架构
似的8351 小时前
一步一步学习使用FireMonkey动画() 使用TAnimator类创建动画
linux·学习·nginx
HiDev_1 小时前
【非标自动化】2、认识元器件(直线模组)
运维·自动化
夏殇之殁2 小时前
包中创建自定义列表项。 . 使用自定义列表项进行数据绑定 . 将天气预报数据保存到本地内存表,通过LiveBindings进行显示。 ...
服务器·前端·javascript
龙仔7252 小时前
人大金仓 KingbaseES V8 只读账号创建完整运维笔记
运维·笔记·sql·人大金仓
我不管我就要叫小猪2 小时前
嵌入式Linux----网络通信
linux·运维·服务器
江湖有缘3 小时前
Docker实战 :使用Docker部署OneTerm堡垒机
运维·docker·容器