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
相关推荐
同聘云2 小时前
阿里云国际站服务器IDC基础入门知识
服务器·阿里云·云计算
人间打气筒(Ada)2 小时前
「码动四季·开源同行」docker容器单机编排docker-compose
运维·docker·容器·docker-compose·容器编排·批量·docker compose
wanhengidc2 小时前
算力服务器都有哪些功能
大数据·运维·服务器·智能手机
EasyCVR2 小时前
插件模块化集成设计:花屏蓝屏画面模糊检测...EasyCVR视频质量诊断功能的技术与落地逻辑
服务器·数据库·音视频·视频质量诊断
云智慧AIOps社区2 小时前
ITIL 5 已来:轻帆云IT服务管理平台以“AI 原生 + 全生命周期”重构数智化服务管理
运维·人工智能·aiops·it服务管理·itsm平台·cmdb配置管理·it服务管理系统
夹芯饼干2 小时前
Linux命令(第三节课)
linux·运维·服务器
haokan_Jia2 小时前
3.30软考高项-每日5题
运维
oushaojun22 小时前
现代linux gpio编程接口(by deepseek)
linux·libgpiod
last demo2 小时前
企业级开源监控zabbit
运维·开源·zabbix