如何在 ARM 上构建

简介

本文档包含关于在 ARM 机器上构建/测试 LLVM 和 Clang 的信息。

本文档旨在帮助您在其他架构(例如 x86_64 机器)上交叉编译 LLVM/Clang 到 ARM。要了解更多关于交叉编译的信息,请查看 如何使用 Clang/LLVM 交叉编译 Clang/LLVM

关于在 ARM 上构建 LLVM/Clang 的注意事项

这里有一些关于在 ARM 上构建/测试 LLVM/Clang 的注意事项。请注意,ARM 包含各种各样的 CPU;这些建议主要基于 ARMv6 和 ARMv7 架构,可能不适用于较旧的芯片。

  1. 最流行的用于 ARM 开发板的 Linaro/Ubuntu 操作系统,例如 Pandaboard,已经成为硬浮点平台。使用 CMake 时有很多选择。自 3.8 版本起,Autoconf 的使用已被弃用。

    建议在 Release 模式下构建 LLVM/Clang,因为它占用更少的内存。否则,构建过程很可能因内存不足而失败。仅构建相关的后端(ARM 和 AArch64)也更快,因为您不太可能使用 ARM 开发板交叉编译到其他架构。如果您正在运行 Compiler-RT 测试,也请包含 x86 后端,否则某些测试将会失败。

    cmake $LLVM_SRC_DIR -DCMAKE_BUILD_TYPE=Release \
                        -DLLVM_TARGETS_TO_BUILD="ARM;X86;AArch64"
    

    您可以使用的其他选项是

    Use Ninja instead of Make: "-G Ninja"
    Build with assertions on: "-DLLVM_ENABLE_ASSERTIONS=True"
    Local (non-sudo) install path: "-DCMAKE_INSTALL_PREFIX=$HOME/llvm/install"
    CPU flags: "DCMAKE_C_FLAGS=-mcpu=cortex-a15" (same for CXX_FLAGS)
    

    之后,只需输入 make -jNninja 即可构建所有内容。make -jN check-allninja check-all 将运行所有编译器测试。有关运行测试套件的信息,请参阅 LLVM 测试基础设施指南

  2. 如果您在内存为 1GB 或更少的 ARM 开发板上构建 LLVM/Clang,请使用 gold 而不是 GNU ld。在任何情况下,设置交换分区也可能是一个好主意。

    $ sudo ln -sf /usr/bin/ld /usr/bin/ld.gold
    
  3. ARM 开发板可能不稳定,您可能会遇到内核消失、每次 big.LITTLE 切换时缓存被刷新以及其他类似问题。为了减轻这种影响,请使用以下小脚本将 Linux 调度器设置为所有内核上的 “performance”

    # The code below requires the package 'cpufrequtils' to be installed.
    for ((cpu=0; cpu<`grep -c proc /proc/cpuinfo`; cpu++)); do
        sudo cpufreq-set -c $cpu -g performance
    done
    

    请记住在构建完成后关闭它,否则您可能会有烧毁 CPU 的风险。大多数现代内核不需要这样做,因此仅在遇到问题时才使用它。

  4. 在 SD 卡上运行构建是可以的,但是它们比高质量的 USB 驱动器更容易出现故障,而 USB 驱动器又比外部硬盘驱动器更容易出现故障(外部硬盘驱动器也快得多)。因此,至少您应该考虑购买一个快速的 USB 驱动器。在具有快速 eMMC 的系统上,这也是一个不错的选择。

  5. 确保您有一个体面的电源(价值几十美元),它可以提供至少 4 安培的电流,如果您在开发板上使用 USB 设备,这一点尤其重要。外部供电的 USB/SATA 硬盘驱动器甚至比拥有一个好的电源更好。