我想在我的AArch64 Raspberry Pi 4上使用clang-11,运行Ubuntu20.04焦点。我查看了https://apt.llvm.org/,但是AArch64预构建的二进制文件似乎不可用?
我试着直接在Raspberry Pi上创建clang,但是速度非常慢,最终我在SD卡上耗尽了空间。
如何在我的x64笔记本电脑上自己交叉编译clang?
发布于 2020-05-13 09:54:13
构建LLVM可能很棘手,因为它需要大量的计算资源,因此很难使用不同的构建选项进行迭代。我第一次尝试为我的AArch64 Raspberry构建主干版本的clang时,最终生成了一个ARM7版本,大小也是30 on,只是不适合在存储卡上使用。哇哦。
关于wiki项目的研究文档
第一个相关的Clang文档页面是用CMake构建LLVM。它解释了CMake options 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焦点(直接使用或正在构建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可以与llvm包一起安装,clang并不是发行版的一部分。这意味着,你需要做两个构建。首先,为主机构建这两个二进制文件(您不必构建完整的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 run -v `pwd`:/mnt --rm -it ubuntu:focal bash安装依赖关系
Ubuntu 20.04焦
apt install g++-10-aarch64-linux-gnu libstdc++-10-dev-arm64-cross gcc-10 g++-10
apt install cmake ninja-build python3配置
mkdir build-aarch64
cd build-aarch64
CC=aarch64-linux-gnu-gcc-10 CXX=aarch64-linux-gnu-g++-10 cmake ../llvm \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DLLVM_ENABLE_ASSERTIONS=On \
-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=/mnt/repos/llvm-project/build-host/bin/llvm-tblgen \
-DCLANG_TABLEGEN=/mnt/repos/llvm-project/build-host/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在链接时具有较低的内存需求。
https://stackoverflow.com/questions/61771494
复制相似问题