我想在运行Ubuntu 20.04 Focal的AArch64 Raspberry Pi 4上使用clang-11。我查看了https://apt.llvm.org/,但是AArch64预置的二进制文件似乎不可用?
我尝试直接在Raspberry Pi上构建clang,但速度非常慢,最终我用尽了SD卡上的空间。
如何在x64笔记本电脑上自己交叉编译clang?
构建LLVM可能很棘手,因为它需要大量的计算资源,这使得很难使用不同的构建选项进行迭代。我第一次尝试为我的AArch64 Raspberry PI构建clang的主干版本时,最终还是为ARM7构建了一个版本,并且还有30GB的大小,这恰恰不适合存储卡。哎呀
有关Clang的第一个文档页面是使用CMake构建LLVM。它解释CMake的选项CMAKE_BUILD_TYPE
,CMAKE_INSTALL_PREFIX
以及LLVM_TARGETS_TO_BUILD
。
最好设置一个-DCMAKE_BUILD_TYPE=MinSizeRel
或默认值以外的其他值Debug
。clang的调试版本运行速度会大大降低。CMAKE_INSTALL_PREFIX
必须进行自定义,因为您不想将Clang安装到主机系统上。给它-DCMAKE_INSTALL_PREFIX=$PWD/install
,然后将安装目录复制到您的AArch64计算机上。
要减小安装尺寸,请设置-DLLVM_TARGETS_TO_BUILD=AArch64
。默认设置是构建所有目标。
如果要使用最先进的功能(否则可能是为什么要编译clang),则需要保持启用clang代码中的断言,并希望使用调试符号。它会减慢程序速度并使它变大,但由于增加了安全性和可调试性,因此绝对值得。请检查“获取源代码并构建LLVM”并-DCMAKE_BUILD_TYPE=RelWithDebInfo -DLLVM_ENABLE_ASSERTIONS=On
在这种情况下进行设置。
接下来,阅读构建LLVM的发行版。相关建议是通过设置进一步减小安装大小-DLLVM_BUILD_LLVM_DYLIB=On -DLLVM_LINK_LLVM_DYLIB=On -DLLVM_INSTALL_TOOLCHAIN_ONLY=On
。
最后,阅读如何使用Clang / LLVM交叉编译Clang / LLVM。即使您计划使用GCC进行交叉编译,此页面也会很有帮助。如果直接使用Ubuntu Focal或在Docker容器中构建,则可能最终会遇到CMake命令的这个框架,例如
CC=aarch64-linux-gnu-gcc-10 CXX=aarch64-linux-gnu-g++-10 cmake ../llvm \
-DCMAKE_CROSSCOMPILING=True \
-DLLVM_TARGET_ARCH=AArch64 \
-DLLVM_DEFAULT_TARGET_TRIPLE=aarch64-linux-gnueabihf \
-DCMAKE_CXX_FLAGS='-march=armv8-a -mtune=cortex-a72' \
-GNinja
除了LLVM_TABLEGEN
和之外,那里的选项应该很简单CLANG_TABLEGEN
。必须指定它们,因为这些二进制文件需要在主机上运行,但是构建会将它们编译为目标,因此它不能使用其构建的内容。您必须提供现有的二进制文件。尽管llvm-tblgen可以与llvm软件包一起安装,但是clang-tblgen并不是发行版的一部分。这意味着,您需要进行两次构建。首先,为主机构建这两个二进制文件(您不必构建完整的LLVM,这两个二进制文件就足够了),然后将交叉编译指向它们。
mkdir build-host
cd build-host
CC=gcc-10 CXX=g++-10 cmake ../llvm -DLLVM_ENABLE_PROJECTS='clang;compiler-rt;lld;clang-tools-extra' -GNinja
ninja llvm-tblgen clang-tblgen
现在,在交叉构建中使用这些二进制文件,因此将其添加到CMake命令中
-DLLVM_TABLEGEN=/usr/bin/llvm-tblgen-11 -DCLANG_TABLEGEN=/mnt/repos/llvm-project/build-host/bin/clang-tblgen
建议将具有llvm源的目录从文件系统挂载到容器中。这将使发布编译结果更加容易,并且本机文件系统比docker中的覆盖更快。
docker run -v `pwd`:/mnt --rm -it ubuntu:focal bash
在Ubuntu 20.04 Focal上
apt install g++-10-aarch64-linux-gnu libstdc++-10-dev-arm64-cross gcc-10 g++-10
mkdir build-aarch64
cd build-aarch64
CC=aarch64-linux-gnu-gcc-10 CXX=aarch64-linux-gnu-g++-10 cmake \
../llvm \
-DCMAKE_CROSSCOMPILING=True \
-DCMAKE_INSTALL_PREFIX=install \
-DLLVM_DEFAULT_TARGET_TRIPLE=aarch64-linux-gnueabihf \
-DLLVM_TARGET_ARCH=AArch64 \
-DLLVM_TARGETS_TO_BUILD=AArch64 \
-DCMAKE_CXX_FLAGS='-march=armv8-a -mtune=cortex-a72' \
-GNinja \
-DLLVM_ENABLE_PROJECTS='clang;compiler-rt;lld;clang-tools-extra' \
-DLLVM_TABLEGEN=/usr/bin/llvm-tblgen-11 \
-DCLANG_TABLEGEN=/mnt/repos/llvm-project/native/bin/clang-tblgen \
-DLLVM_BUILD_LLVM_DYLIB=On \
-DLLVM_LINK_LLVM_DYLIB=On \
-DLLVM_INSTALL_TOOLCHAIN_ONLY=On
如果可以,请获取功能强大的构建机。链接某些二进制文件会占用大量RAM。您应该具有约20 GB的可用内存,以便能够在合理的时间内到达任何地方,而64 GB甚至更好。如果发生并行运行的多个链接任务耗尽了计算机内存的情况,请尝试使用进行编译ninja -j3
,以将并行任务的数量限制为例如3个。
ninja install -j3
应该使用其他链接器来减少内存需求。据推测,ld.gold在链接时具有较低的内存要求。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句