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
相关推荐
zzzzzz3101 天前
9K Star 炸裂开源!这个 C 语言写的代码知识图谱,把 Linux 内核索引压缩到了 3 分钟
linux·服务器·sql
XIAOHEZIcode1 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220702 天前
如何搭建本地yum源(上)
运维
A小辣椒3 天前
TShark:Wireshark CLI 功能
linux
A小辣椒3 天前
TShark:基础知识
linux
AlfredZhao3 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao4 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334664 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪4 天前
linux 拷贝文件或目录到指定的位置
linux
大树885 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai