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
相关推荐
考虑考虑7 小时前
cmd局部设置java变量
运维·后端·自动化运维
我爱吃土豆18 小时前
AI 编程工具远程开发指南:Codex 桌面版与 WorkBuddy 通过 SSH 连接云服务器实践
服务器·人工智能·ssh
生活爱好者!8 小时前
哇!影视新玩法!docker部署NEOWATCH NAS
运维·docker·容器
一技安身8 小时前
【信创】银河麒麟V10、统信UOS解压7Z文件
linux·运维·服务器
奔跑的架构师9 小时前
[A-50]ARMv9/v8-DVFS系统架构
linux·arm开发·架构·系统架构·arm
迷途呀9 小时前
CI/CD 自动化部署实践:让代码提交后自动上线
linux·运维·nginx·ci/cd·自动化
闲云自留地9 小时前
动手玩 Nova:Hypervisor、主机聚合、可用分区、虚拟机生命周期实操
运维·架构·openstack
赴生-9 小时前
Liunx 操作系统 进程概念(上)
linux
binqian10 小时前
【linux】OpenSSH升级文档
linux·运维·网络
吴声子夜歌10 小时前
Shell编程——if条件语句
linux·运维·shell