如何在 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 板(例如 Pandaboard)上最流行的 Linaro/Ubuntu 操作系统已成为硬浮点平台。使用 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. 如果您在内存为 1G 或更小的 ARM 板上构建 LLVM/Clang,请使用gold而不是 GNU ld。无论如何,设置交换分区可能也是一个好主意。

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

    # 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 硬盘驱动器甚至比拥有一个好的电源还要好。