跳转至

交叉编译

交叉编译通用指南。

Debian ARM64

一份从 x86_64 系统进行交叉编译(或测试 NCE)的无痛指南,且不会弄脏你的主系统。

  • 安装 QEMU:sudo pkg install qemu
  • 下载 Debian 13:wget https://cdimage.debian.org/debian-cd/current/arm64/iso-cd/debian-13.0.0-arm64-netinst.iso
  • 创建系统磁盘:qemu-img create -f qcow2 debian-13-arm64-ci.qcow2 30G
  • 运行虚拟机:qemu-system-aarch64 -M virt -m 2G -cpu max -bios /usr/local/share/qemu/edk2-aarch64-code.fd -drive if=none,file=debian-13.0.0-arm64-netinst.iso,format=raw,id=cdrom -device scsi-cd,drive=cdrom -drive if=none,file=debian-13-arm64-ci.qcow2,id=hd0,format=qcow2 -device virtio-blk-device,drive=hd0 -device virtio-gpu-pci -device usb-ehci -device usb-kbd -device intel-hda -device hda-output -nic user,model=virtio-net-pci

Gentoo

Gentoo 的交叉编译设置相对简单,前提是你已经熟悉 portage。项目提供了一份交叉工具链文件。在本节中,请将 aarch64 替换为你想要的目标架构。

Crossdev

首先,通过 sudo emerge -a sys-devel/crossdev 安装 crossdev。

然后,根据目标架构设置环境;例如:

sudo crossdev aarch64

QEMU

如果你没有目标架构的 Gentoo 宿主系统,你应该安装一个 QEMU 用户态环境来进行测试。为此,请为 app-emulation/qemu 启用相关的 USE 标志:

app-emulation/qemu static-user qemu_user_targets_aarch64

要使用交叉 emerge 出来的共享库,你还需要告诉 qemu sysroot 的位置。你可以通过别名来实现:

alias qemu-aarch64="qemu-aarch64 -L /usr/aarch64-unknown-linux-gnu"

依赖项

依赖项与正常 Gentoo 相同;只需将 emerge 命令替换为 emerge-<target>-unknown-linux-gnu(例如 emerge-aarch64-unknown-linux-gnu)。不过,有几个注意事项:

启用 GURU

由于 Crossdev 的 sysroot 在 Portage 层面实际上与系统隔离,你必须手动在 sysroot 中启用 GURU。以 root 身份运行以下命令:

mkdir -p /usr/aarch64-unknown-linux-gnu/etc/portage/repos.conf
cat << EOF > /usr/aarch64-unknown-linux-gnu/etc/portage/repos.conf/guru.conf
[guru]
location = /var/db/repos/guru
auto-sync = no
priority = 1
EOF

软件包勘误

Crossdev 并不完美,你可能会遇到一些未正确设置 keyword 或在特定架构上有问题的软件包。不幸的是,这些行为并没有得到很好的文档记录,而且某些构建系统(如 Meson)以及某些棘手的软件包(如 GTK)通常对交叉编译不太友好。

因此,可能最好只 emerge 一组最小的依赖项,并让 Eden 的构建系统替你处理其余部分。至少,你只需要标准系统库(Crossdev 会为你处理)和 Qt:

sudo emerge-aarch64-unknown-linux-gnu dev-qt/qtbase:6 dev-qt/qtcharts:6

接着,CPMUtil 会处理其余一切。为了额外保险,你可能需要在配置命令中设置 -DCPMUTIL_FORCE_BUNDLED=ON。

构建

从这里开始,构建就相对标准了。交叉工具链文件 包含了一些额外的配置,但通常你只需要设置 CROSS_TARGET 和 CMAKE_TOOLCHAIN_FILE。同时强烈建议禁用 OpenGL。

cmake -S . -B build/aarch64 -DCMAKE_TOOLCHAIN_FILE=CMakeModules/toolchains/GentooCross.cmake -GNinja -DCROSS_TARGET=aarch64 -DENABLE_OPENGL=OFF

完成上述操作后,你可以像平常一样构建:

cmake --build build/aarch64

最后,用 QEMU 运行编译好的可执行文件!

qemu-aarch64 build/aarch64/bin/eden

本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 eg/Eglantine