24.5 在 Linux 上构建 FreeBSD
设备环境
Ubuntu 24.04 LTS
内存建议不低于 12G
Swap 建议 16G
安装软件包
# 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 的运行状态
创建放置构建产物的目录
使用 git 拉取 FreeBSD 源代码
拉取完成后,源代码应位于 /home/ykla/freebsd-src(freebsd-src 是 git 自动创建的)。
构建工具链与世界(用户空间)
注释:
MAKEOBJDIRPREFIX=/home/ykla/bsdobj
指定所有构建产物的输出的目录
tools/build/make.py
在非 FreeBSD 机器上启动构建流程的官方脚本所在
--bootstrap-toolchain
用源码树里的 LLVM/Clang/LLD 自举工具链,而非通过 apt 安装,使之更接近原生构建
-j16
启用 16 个并行任务编译。一般采用内核线程数,如 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)
验证:

构建内核工具链
除了末尾的 kernel-toolchain 有变化,其他选项参数均一致。
验证:

构建内核
除了末尾的 buildkernel 有变化,其他选项参数均一致。
验证:

附录:RISC-V 64
内核工具链
验证:

内核
验证:

故障排除与未竟事宜
基于 Archlinux 构建 FreeBSD
要在 Arch 上编译,需要设置临时环境变量:
否则会卡在 krb5。这是由于 glibc 同时支持 POSIX 以及 GNU 导致的。
除此外,你必须保证 hostname 命令有输出,且命令本身存在。还必须安装 time 等软件包。
32 位构建的问题
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,构建参数参考此处
最后更新于
这有帮助吗?