7 月 14 日,Phoronix 的 Michael Larabel 报道了 FreeBSD 开发分支上的一个合并提交:GNU dialog 从 base system 源代码树中被移除。这不是某个大型重构的一部分,也不是一次安全更新——它标志着 FreeBSD 基础系统中最后一款 GPL 许可的软件正式退役。随 dialog 一起消失的,是 FreeBSD 代码仓库里那个名为「GNU sub-tree」的目录。从这一刻起,FreeBSD base 不再包含任何 GPL 代码。
Lobsters 上 61△、10 条评论,Hacker News 上 92 分、54 条评论。对 FreeBSD 项目来说,这个里程碑酝酿了超过二十年。

最后一块拼图:从 dialog 到 bsddialog
最后一款留在 FreeBSD base 里的 GPL 软件是 dialog——一个基于 ncurses(LGPL 许可)的命令行界面工具,用于在终端里绘制菜单、表单、消息框和输入提示。FreeBSD 安装程序曾经依赖它来提供交互式 UI。
替代品 came in the form of bsddialog,一个 BSD 许可的 dialog 兼容实现。安装程序本身在更早的版本中就已经切换到了 bsddialog,但还有一个叫 dpv(dialog progress view)的工具仍然链接着 dialog 库。随着 dpv 在 FreeBSD 16 中被标记为退役,最后一条对 GNU dialog 的依赖链也断了。
Phabricator 上的 D55424 号 diff 记录了这个过程。提交者做了两件事:从源码树中移除 dialog 本身,然后删掉整个 gnu/ 子目录。diff 不算大——几百行删除——但它关掉了一个跨越 FreeBSD 4.x 时代延续至今的历史章节。

为什么这件事值得关注
BSD 许可证和 GPL 的分歧不是秘密,但直到这一次代码清理完成,FreeBSD 才算是把自己「BSD 优先」的立场真正走完了。FreeBSD 官方 Wiki 的 GPLinBase 页面对此说得很直白:
「由于 GPL 软件在商业使用中可能产生的额外复杂性,在合理可行的情况下,我们更倾向于采用更宽松的 BSD 许可证提交的软件。」
这个立场背后的逻辑是务实的工程决策。BSD 许可证允许下游使用者在闭源产品中自由使用、修改和分发代码——Steve Jobs 用 FreeBSD 的用户态工具链构建了 NeXTSTEP,后来演化成了 macOS 的基础。Apple 的 Darwin 内核同样大量借用了 FreeBSD 代码。如果这些代码是 GPL 许可的,这条路就堵死了。
换句话说,BSD 社区理解的「软件自由」包含一个 FSF 并不认可的维度:把代码变成专有软件的自由。从 BSD 视角看,这正是许可设计有意保留的权利。
一条走了四十年的路
FreeBSD base 里的 GNU 组件从来不是计划好的——它们是历史遗留。当 FreeBSD 在 1993 年从 386BSD 分叉出来时,GCC 是当时唯一可用且足够成熟的开源 C 编译器,GNU C Library 和 GNU coreutils 是标准配置。那个年代没有 clang,没有 musl,没有 busybox。吃下 GPL 是务实的选择,不是因为认同。
随着替代品的出现,FreeBSD 项目开始有计划地替换这些组件。按时间线梳理:
- GCC → Clang:这是最大的一次切换。FreeBSD 在 2009 年前后开始引入 LLVM/Clang 作为备选编译器,到 FreeBSD 10(2014 年发布)Clang 已成为默认编译器。GCC 从 base 中完全移除发生在 FreeBSD 10 周期内。GCC 切换到 GPLv3 是这件事的催化剂——BSD 社区普遍认为 GPLv3 的限制条款和 BSD 的哲学不兼容。
- GNU C Library → FreeBSD libc:FreeBSD 一直有自己的 libc 实现,所以这方面没有依赖。
- GNU grep、GNU diff、GNU diff3:这些用户态工具逐一被 BSD 许可的替代品替换。其中 GNU diff3 是最晚被替换的之一——FreeBSD 论坛在 2026 年 2 月还在讨论它。
- GNU dialog → bsddialog:2026 年 7 月完成,标志着整个 GNU sub-tree 的清零。
Lobsters 上用户 thomas0 翻出了 FreeBSD Wiki 里的项目目标页面,指出这句话已经在那里放了相当长时间。这与其说是一个突然的决定,不如说是一个长期路线图的终点。
技术细节:移除的不只是代码
dialog 的移除看起来是个小动作——一个终端 UI 工具而已——但它触发了连锁反应。dialog 依赖 ncurses(LGPL),ncurses 留在 base 里本是为了支撑 dialog。dialog 一移除,ncurses 在 base 中的存在意义也消失了。FreeBSD 项目目前仍然在 base 中保留 ncurses,因为它被其他组件使用,但方向已经明确:继续减少许可证依赖的复杂性。
GNU sub-tree 的移除还带来了一个附带收益:FreeBSD 的构建系统和发布流程得到了简化。过去发布一个 FreeBSD 发行版,base system 包含的许可证清单里必须区分 BSD、MIT、ISC、LGPL、GPL 等不同条款。现在只剩 BSD 及其兼容许可证,合规审查的工作量大幅下降。
社区的反应
Hacker News 上的讨论呈现出两种典型立场。
支持 BSD 路线的一方认为,这是 FreeBSD 在追求许可证一致性上的自然终点。「FreeBSD 虽然名字里有 Free,但它从来不是自由软件运动的一部分,」用户 riedel 写道。「在自己的许可证上保持一致性是好事——尤其和 Linux 不同,FreeBSD 是一套完整的发行版,包含 userland。」他还提到了 FreeBSD 作为设备操作系统(防火墙、NAS)的独特生态位——在这些场景下,BSD 许可的「拿走就用」特性是货真价实的竞争优势。
对 GPL 式微感到惋惜的一方则认为这是一个信号。用户 matheusmoreira 写道:「从自由软件运动的角度看,这挺悲哀的。看看 GNU 这些年的影响力缩水了多少。」但他也承认:「不过话说回来,尝试给 GNU 贡献代码的体验确实不太愉快。也许这样更好。」
Lobsters 用户的讨论则更偏实用主义。用户 vegebond 最初不理解动机,看到 Wiki 上的解释后自己给出了答案:「当然!BSD 有自己的许可证,自然希望基础系统只用自己许可证下的代码。我居然问出这个问题,太傻了。」
一个值得注意的细节是,多条评论都提到了 FreeBSD 使用 Phabricator 作为代码评审平台——而非 GitHub、GitLab 或 SourceHut。这恰好也体现了 BSD 社区一贯的选择:用自己觉得对的工具,不跟风。
这对 FreeBSD 意味着什么
从实用角度看,这次清理对 FreeBSD 用户几乎没有直接影响。bsddialog 已经跑了足够久,功能和兼容性都没有问题。普通用户装系统时根本感受不到变化。
真正的影响在生态层面。一个完全不包含 GPL 代码的 base system 意味着:
-
商业采用的门槛进一步降低。嵌入 FreeBSD 的产品——从 Juniper 路由器到 Netflix 的 Open Connect 设备再到 PlayStation——不需要担心 base system 内的 GPL 传染风险。当然,ports 和 packages 里仍然有大量 GPL 软件,但那是用户自主选择安装的,和 base system 的许可证范围无关。
-
FreeBSD 的许可证立场终于自洽。过去强调「BSD 优先」但 base 里还嵌着 GNU 代码,在哲学上总有一丝尴尬。现在这条路走完了。
-
为 FreeBSD 16.0 发布扫清了最后一个历史包袱。FreeBSD 16.0 预计在 2027 年 12 月发布。去掉这个最后的许可证遗留问题,开发团队可以专注于更重要的工程目标。
最后值得一提的是,这个里程碑的达成方式本身就很「BSD」:没有宣言,没有新闻稿,没有道德批判。只有一个合并提交,一个关闭的 ticket,和一个被删除的目录。
参考链接
- Phoronix 报道:
phoronix.com/news/FreeBSD-16-Goes-GPL-Free - FossForce 分析:
fossforce.com/2026/07/freebsd-16-cleans-house-no-gpl-left-in-the-base-system/ - FreeBSD Wiki GPLinBase:
wiki.freebsd.org/GPLinBase - Phabricator diff D55424:
reviews.freebsd.org/D55424 - Hacker News 讨论:
news.ycombinator.com/item?id=48923363 - Lobsters 讨论:
lobste.rs/s/n1cwdh
本文的素材来自公开信息和社区讨论。如果你对这个话题有更深入的一手经验,欢迎指出文中的不足。