如何在ARM平台上构建

简介

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

这份文档 是帮助您了解在其他系统上(例如x86_64的机器)交叉编译LLVM / Clang到ARM上的。要了解更多关于交叉编译,请检查 How To Cross-Compile Clang/LLVM using Clang/LLVM

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

这里是在ARM上构建/测试LLVM / Clang的一些注意事项。需要注意的是ARM涵盖了各种各样的CPU;目前这个文档主要是基于ARMv6和ARMv7体系结构,可能不适用某些较旧的芯片。

  1. 最流行的Linaro/Ubuntu的操作系统的ARM板,例如,Pandaboard,已经成为难以替换的平台。使用CMake您将有许多选择。而Autoconf构建系统已在LLVM3.8被废弃。

    Relese 模式构建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"
    Force Python2: "-DPYTHON_EXECUTABLE=/usr/bin/python2"
    Local (non-sudo) install path: "-DCMAKE_INSTALL_PREFIX=$HOME/llvm/instal"
    CPU flags: "DCMAKE_C_FLAGS=-mcpu=cortex-a15" (same for CXX_FLAGS)
    

    之后,只需输入 make -jN or ninja 将会开始构建。 make -jN check-all or ninja check-all 将运行所有的编译器测试。对于运行测试套件,请参考 LLVM Testing Infrastructure Guide

  2. 如果您是在内存少于1G的ARM板上构建LLVM / Clang的,请使用 gold 而不是GNU ld 。大多数情况下,建立一个交换分区将是一个不错的主意。

    $ sudo ln -sf /usr/bin/ld /usr/bin/ld.gold
    
  3. ARM开发板可能是不稳定的,您可能会遇到内核消失,big.LITTLE切换时刷新缓存,和其它类似的问题。为了帮助缓解这样的问题,可以对**全部**使用该脚本的内核设置Linux scheduler到 “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记忆棒,SD卡更容易出现错误,甚至比外部硬盘驱动器更容易出错(这些也更快)。所以,至少,你应该考虑买一个快速的USB记忆棒。在一个快速的eMMC系统,也是一个很好的选择。

  5. 请确保你有一个高质量的电源(几十美元的)可以提供 至少 4安培,这一点在你还需要同时使用其他USB设备(如移动硬盘)时显得尤其重要。当然,使用外部供电的USB / SATA硬盘,这可能比有一个好的电源更加有效。