24.5 在 Linux 系统上交叉构建 FreeBSD
设备环境
Ubuntu 24.04 LTS
内存建议不低于 12 GB
Swap 建议为 16 GB
安装软件包
# apt update # 刷新软件源,部分用户可能需要更换软件源
# apt install git build-essential libbz2-dev libarchive-dev libssl-dev flex # 安装构建所需的软件包和开发库禁用熄屏
依次进入“设置” → “电源” → “节电选项”,然后将“熄屏”选项设置为“从不”。
禁用 systemd-oomd
自 Ubuntu 22.04 LTS(Desktop)以降,系统默认启用了 systemd-oomd 这一服务,该服务会在系统达到某阈值时强制结束当前高占用的进程,导致构建失败。且这一操作不会向用户提供任何提示信息。
禁用 systemd-oomd 的自启动,并立即停止其运行
# systemctl mask --now systemd-oomd systemd-oomd.socket # 立即禁用并屏蔽 systemd-oomd 及其 socket 单元检查 systemd-oomd 的运行状态
创建放置构建产物的目录
创建目录 bsdobj;若其父目录不存在,则一并创建:
使用 git 拉取 FreeBSD 源代码
拉取 FreeBSD 源码仓库:
拉取完成后,源代码应位于 /home/ykla/freebsd-src(freebsd-src 目录由 Git 自动创建)。
构建工具链与世界(用户空间)
切换到 FreeBSD 源码树根目录:
指定对象目录并使用 make.py 构建 arm64/aarch64 的基本系统,同时启用 AArch64 和 ARM 的 LLVM 后端,并禁用 32 位库支持:
选项注释:
MAKEOBJDIRPREFIX=/home/ykla/bsdobj
指定所有构建产物的输出目录
tools/build/make.py
在非 FreeBSD 系统上启动构建流程的官方脚本
--bootstrap-toolchain
用源码树里的 LLVM/Clang/LLD 自举工具链,而非通过 apt 安装,使之更接近原生构建
-j16
启用 16 个并行编译任务。一般与 CPU 线程数一致,例如 4 线程可使用 -j4
TARGET=arm64
目标平台设为 arm64
TARGET_ARCH=aarch64
目标 CPU 架构设为 aarch64
WITH_LLVM_TARGET_AARCH64=yes
启用 LLVM 的 AArch64 后端
WITH_LLVM_TARGET_ARM=yes
启用 LLVM 的 ARM 后端
WITHOUT_LIB32=yes
禁用 32 位兼容库及相关组件,因为测试未通过
buildworld
构建 FreeBSD 用户空间(world)
验证:

构建内核工具链
确保当前仍位于 FreeBSD 源码树根目录:
使用与 buildworld 相同的参数构建内核工具链:
除末尾的 kernel-toolchain 不同外,其余选项参数均保持一致。
验证结果:

构建内核
确保当前仍位于 FreeBSD 源码树根目录:
使用指定参数构建 arm64/aarch64 内核:
除了末尾的 buildkernel 有变化,其他选项参数均一致。
验证结果:

附录:RISC-V 64
使用引导工具链并忽略 GCC 检测,构建 riscv64 架构的内核工具链:
验证:

使用引导工具链并忽略 GCC 检测,构建 riscv64 内核:
验证:

故障排除与未竟事宜
基于 Archlinux 构建 FreeBSD
要在 Arch 上编译,需要设置临时环境变量:
否则构建过程会停留在 krb5 阶段。这是由于 glibc 同时支持 POSIX 和 GNU 两种规范所致。
此外,还必须确保 hostname 命令存在且能够正常输出,同时需安装 time 等软件包。
32 位构建的问题
FreeBSD 15.0 已不再支持任何 32 位架构。
Ubuntu 原生的 LLVM 工具链
待测试
构建更多体系结构(如 amd64)
待解决
参考文献
Jammy Jellyfish Release Notes,Ubuntu 22.04 LTS 发行说明,参见 systemd v249.11 这一小节。
FreeBSD 手册,26.9. Building on non-FreeBSD Hosts,只提供了基本思路,参考价值有限
Building on non-FreeBSD hosts,仅提供基本思路,参考价值有限
man src.conf,构建参数参考此处
最后更新于