如何在x64主机上交叉编译AArch64的LLVM / Clang?

用户名

我想在运行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的大小,这恰恰不适合存储卡。哎呀

研究项目Wiki上的文档

有关Clang的第一个文档页面是使用CMake构建LLVM它解释CMake的选项CMAKE_BUILD_TYPECMAKE_INSTALL_PREFIX以及LLVM_TARGETS_TO_BUILD

最好设置一个-DCMAKE_BUILD_TYPE=MinSizeRel或默认值以外的其他值Debugclang的调试版本运行速度会大大降低。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

启动docker

建议将具有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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Clang,LLVM和g ++

来自分类Dev

如何为iOS交叉编译clang / llvm?

来自分类Dev

llvm / clang编译错误,内存耗尽

来自分类Dev

如何建立Clang?

来自分类Dev

用clang和gfortran编译

来自分类Dev

clang插件编译错误:未定义符号llvm :: Registry <clang :: PluginASTAction,llvm :: RegistryTraits <clang :: PluginASTAction>>

来自分类Dev

使用clang生成LLVM IR

来自分类Dev

如何使用clang ++进行编译?

来自分类Dev

如何使用Clang CompilerInstance完成?

来自分类Dev

如何使用clang :: TreeTransform?

来自分类Dev

如何在Ubuntu for Win32上交叉编译Clang?

来自分类Dev

“制作”失败并显示Clang错误-如何从Clang中获取错误?

来自分类Dev

clang / LLVM项目级别优化

来自分类Dev

如何用clang和mingw-w64进行编译?

来自分类Dev

当您不关心新通道时,如何在clang / AArch64上使用NEON内在函数将int32x2_t扩展为int32x4_t?

来自分类Dev

如何查看Clang AST?

来自分类Dev

用clang而不是gcc编译

来自分类Dev

如何为YouCompleteMe安装clang?

来自分类Dev

Clang,LLVM和g ++

来自分类Dev

交叉编译clang for Android arm

来自分类Dev

如何在ipad mini 3上交叉编译iOS8.x的clang / llvm 3.7.0?

来自分类Dev

如何使用clang ++进行编译?

来自分类Dev

如何使用gcc代替clang

来自分类Dev

clang编译在mariadb上失败

来自分类Dev

Clang ++编译,但无法运行

来自分类Dev

Clang:如何将多个参数传递给 clang 插件

来自分类Dev

使用aarch64 linux android clang的ARMv8架构的内联函数交叉编译问题

来自分类Dev

当 clang 运行链接器时,如何获得 clang 的路径?

来自分类Dev

如何为 Android 编译 LLVM/Clang?