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
相关推荐
JavaPub-rodert11 分钟前
使用 Docker 部署 Ollama:Docker Compose 一键运行 DeepSeek-R1 1.5B
运维·docker·容器
蓝速科技14 分钟前
蓝速科技信创落地:平衡安全合规与项目成本的实战方案
android·运维·人工智能·科技·安全·电脑·鸿蒙
NJCloud32 分钟前
MooseFS 分布式存储部署与高可用架构实践
linux·运维·分布式·架构
晓晓_za89866833 分钟前
Geo 优化源码蒸馏词机制:地域词库构建与匹配逻辑详解
运维·tcp/ip·spring·缓存·ci/cd
mounter62534 分钟前
将 RDMA 引入容器:Soft-RoCE (RXE) 网络命名空间支持深度解析
linux·linux kernel·kernel·rdma·net namespace
奈斯先生Vector1 小时前
从 127.0.0.1:3080 到插件运行时:DeepSeek Harness 远程开发与版本治理实战
linux·运维·人工智能·ubuntu·aigc
wuminyu1 小时前
JDK21中虚拟线程和FFM协同实现高并发源码剖析
java·linux·c语言·jvm·c++
Android系统攻城狮2 小时前
Linux PipeWire深度解析之pw_stream_new调用流程与实战(七十八)
linux·运维·服务器·音频进阶·pipewire音频实战进阶
换个号退隐江湖i3 小时前
LLM 调试日志刷屏怎么办?用 tee 边看边存
linux
DYWorker0013 小时前
搭建嵌入式Linux虚拟机开发环境
linux