gpt4 book ai didi

cross-compiling - 如何在 x64 主机上为 AArch64 交叉编译 LLVM/Clang?

转载 作者:行者123 更新时间:2023-12-04 16:27:04 43 4
gpt4 key购买 nike

我想在运行 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 文档页面是 Building LLVM with CMake .它解释了 CMake 选项 CMAKE_BUILD_TYPECMAKE_INSTALL_PREFIXLLVM_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 代码中启用断言,并且你会想要调试符号。它会减慢程序速度并使其变大,但由于提高了安全性和可调试性,因此绝对值得。查看Getting the Source Code and Building LLVM并在这种情况下设置 -DCMAKE_BUILD_TYPE=RelWithDebInfo -DLLVM_ENABLE_ASSERTIONS=On

接下来,阅读 Building a Distribution of LLVM .相关建议是通过设置 -DLLVM_BUILD_LLVM_DYLIB=On -DLLVM_LINK_LLVM_DYLIB=On -DLLVM_INSTALL_TOOLCHAIN_ONLY=On 进一步最小化安装大小。

最后,读How To Cross-Compile Clang/LLVM using 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_TABLEGENCLANG_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 源的目录从文件系统挂载到容器中。这将使编译结果更容易输出,而且 native 文件系统比 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
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 在链接时具有较低的内存要求。

关于cross-compiling - 如何在 x64 主机上为 AArch64 交叉编译 LLVM/Clang?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61771494/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com