FreeBSD 中文社区翻译文章存档
FreeBSD 中文社区
  • FreeBSD 网络文章集锦
  • 2025 年
    • BSD 许可证一览
    • FreeBSD 上的 ZFS 日志压缩
    • 为 FreeBSD 发声:FOSDEM 2025 参会报告
    • zfs 速查手册
    • FreeBSD 开发计划
    • 谁在使用 FreeBSD(基金会官方版本)
    • FreeBSD 特色开发项目
    • 如何将基于 Electron 的应用程序移植到 FreeBSD
    • FreeBSD:原始操作系统发行版的火炬传承者
    • 浏览 FreeBSD 新的季度和两年一次发布计划
    • FreeBSD 日专访 BSD 守护神 Beastie
  • 2024 年 11 月
    • 苹果的开源基石:macOS 和 iOS 背后的 BSD 传统
    • 在动荡的开源世界中保持稳定:FreeBSD 的持久稳定性
    • 为什么你应该使用 FreeBSD
    • FreeBSD 13.4: 新特性及其发展历程
    • Quantum Leap Research 和 FreeBSD 基金会将投资 75 万美元以改善笔记本电脑支持和用户体验
    • 主权科技基金将投资 68.64 万欧元用于 FreeBSD 基础设施现代化
  • 2024 年 7 月
    • BSD 老将:Michael J. Karels 逝世,享年 68 岁
    • 讣告——Michael "Mike" John Karels
    • 配置自己的 VPN——基于 OpenBSD、Wireguard、IPv6 和广告拦截
    • 如何在 FreeBSD 中指定 CPU 类型
    • 使用 BIOS 引导和 UEFI 引导的 GPT 分区的区别和制作方法
    • 通过替换 ZFS 镜像池中的磁盘来扩容
    • 通过将 ZFS 池构建为镜像结构,消除异常数据的影响
    • ZFS 池破坏实验
    • FreeBSD ports 开发技术研究
    • FreeBSD pkg 命令概述
    • portsnap 被淘汰了,本应由 git 代替,但结果我发现自己用的是 got
    • ccache 在构建 FreeBSD 的 buildworld 时的效率
    • 关于对 FreeBSD 发布计划和生命周期的修订
  • 2023 年 12 月
    • FreeBSD 新手?来参与社区吧
    • 介绍来 FreeBSD 的学生
    • EuroBSDCon 2023 旅行报告——Bojan Novković
    • 什么是开发播客?FreeBSD 项目的演变
    • EuroBSDCon 2023 旅行报告——Mark Johnston
    • TalkDev:探索开源的未来
    • 为什么选择 FreeBSD?Metify 展示迁移到 FreeBSD 如何对两个新产品进行增强
    • FreeBSD 基金会宣布通过 SSDF 认证
    • 2023 年全球开放大会报告
    • FreeBSD v14:恪守类 Unix 操作系统传统,提升安全性与性能
  • 2023 年 9 月
    • 认识 2023 年参与 FreeBSD 谷歌编程之夏项目的学生:Soobin Rho
    • 认识 2023 年参与 FreeBSD 谷歌编程之夏项目的学生:Aymeric Wibo
    • FreeBSD 企业工作组首次会议总结
    • 认识 2023 年 FreeBSD 谷歌编程之夏的学生:Sudhanshu Mohan Kashyap
    • 认识 2023 年夏季滑铁卢大学合作学生:Naman Sood
    • FreeBSD 基金会 2023 年暑期实习生:Jake Freeland
    • 第二次企业工作组会议回顾
    • OpenBSD 与 FreeBSD:有何不同,哪个更好?
  • 2023 年 9 月以前
    • 在 FreeBSD 的 jail 中安装 NextCloud
    • 参与宣传:2023 年 5 月的 FreeBSD 开发者峰会和 BSDCan
    • 恭喜 FreeBSD 迎来 30 周年!为什么开源项目 FreeBSD 能够持续存在
    • 庆祝 FreeBSD 成立 30 周年:许可证
    • 聚集在开放领域工作的公益和慈善基金会
    • 在 Linode 上安装 pfSense
    • 在 FreeBSD 的 jail 中安装 NextCloud
    • 将 FreeBSD 上的 Ansible 主机和客户机都安装在 Jail 中
    • FreeBSD 简介 | BSD.pw 研讨会
    • 如何在 FreeBSD 上安装 Python
    • 升级到 FreeBSD 13.2 的十大理由
    • 采访 FreeBSD 基金会执行董事 Deb Goodkin
    • 我们使用开源的 FreeBSD 作为企业操作系统的 5 个原因
    • 关于 BSD 与 Linux 的典型讨论
    • OpenBSD 太棒了
    • systemd 背后的真正动机
    • systemd 在任何地方都不安全
    • 为什么你应该将所有东西从 Linux 迁移到 BSD
    • 如何在 FreeBSD 上设置一个简单且实际工作的 WireGuard 服务器
    • 选择 FreeBSD 而非 GNU/Linux 的技术性原因
    • GPL 之殇
    • FreeBSD 与研究社区
    • 在 OpenBSD 和 FreeBSD 之间选择的区别
    • FreeBSD 是一个令人惊叹的操作系统
    • 留意日期:2023 年 11 月的自由软件组织厂商峰会
    • JENNY 日常使用的系统:FreeBSD 13.2
    • FreeBSD Ports 中的 OPTIONS 功能介绍——使用 OPTIONS_SET/OPTIONS_UNSET/NO_DIALOG 进行操作和实践
    • FreeBSD Bhyve 上的 PCI 直通
    • 2023 年 FreebBSD 谷歌编程之夏学生介绍:Raghav Sharma
    • 2023 年 7 月软件开发项目进展报道
    • 用于研究的 FreeBSD:CHERI/Morello
    • 在 FreeBSD Jail 中使用 OpenRC 启动并运行 Devuan GNU+Linux 系统
由 GitBook 提供支持

FreeBSD 中文社区

在本页
  • 介绍
  • 目标阶段
  • 使用 make 命令进行调试
  • 常见问题与解答
  • Q. 为什么这篇文章写得有点杂乱?
  • Q. 那么你最终解决了吗?
  • 参考文献

这有帮助吗?

在GitHub上编辑
导出为 PDF
  1. 2024 年 7 月

FreeBSD ports 开发技术研究

上一页ZFS 池破坏实验下一页FreeBSD pkg 命令概述

最后更新于11天前

这有帮助吗?

  • 原文:

  • 作者:重村法克

  • 2024-01-07

介绍

在创建 Ports 时,参考模板和手册进行操作时,可能会遇到一些无法按照常规模式处理的情况,或者需要处理一些特殊行为的情况。这时,我们可能会对如何追踪这些情况、如何正确插入操作产生困惑。

例如,当从 Ports 安装时(make install),通常会按以下顺序执行:

make fetch
make extract
make patch
make build
make install

此外,通过在各个目标前加上 pre- 或 post- 前缀(例如 pre-fetch 或 post-patch),可以在执行某个目标之前或之后插入自定义操作。更进一步,通过指定 do- 前缀(覆盖默认行为),也可以控制 Ports 的默认行为。关于这些顺序和控制,详细内容如下:

make fetch
 +- make pre-fetch
 +- make do-fetch
 +- make post-fetch
make extract
 +- make pre-extract
 +- make do-extract
 +- make post-extract
make patch
 +- make pre-patch
 +- make do-patch
 +- make post-patch
make configure
 +- make pre-configure
 +- make do-configure
 +- make post-configure
make build
 +- make pre-build
 +- make do-build
 +- make post-fetch
make install
 +- make pre-install
 +- make do-install
 +- make post-install

在某些情况下,可能需要禁用某个目标(例如 NO_BUILD、NO_INSTALL、NO_TEST,分别使 make build、make install、make test 失效),或显式启用某个目标(例如 HAS_CONFIGURE、GNU_CONFIGURE,使 make configure 生效)。这些设置在不同的 Ports 中有不同的处理方式。

实际上,在更多的细节处,还会有各种各样的钩子。要完全列出这些钩子非常困难,因此可以记录一些调试和调查的关键点。

目标阶段

如前所述,常见的目标包括:

  • all

  • fetch

  • extract

  • patch

  • configure

  • build

  • install

除此之外,还应了解一些其他目标:

  • config / showconfig / rmconfig

  • package / repackage

  • test

  • clean

  • deinstall / reinstall

  • makesum / makepatch

在 Ports 构建过程中,执行的一系列目标由 _TARGETS_STAGES 变量定义。这个变量在 bsd.port.mk 中定义,并不打算被覆盖。在适当的 Ports 目录中运行 make -V_TARGETS_STAGES,可以看到类似 SANITY PKG FETCH EXTRACT PATCH CONFIGURE BUILD INSTALL TEST PACKAGE STAGE 的内容。

基于上述变量的内容,每个阶段都会通过 _阶段名_SEQ 变量详细设置顺序,依赖关系则通过 _阶段名_DEP 进行定义。特别是以 _SEQ 结尾的变量,定义了“优先级:目标”,即使后来添加的目标也会按照顺序执行。

例如,在 Go 语言应用程序中,特有的 Go 获取操作 go mod download 会在以下阶段执行:

make -V_FETCH_SEQ
make -V_FETCH_REAL_SEQ

如果需要在极其特殊的时机插入操作,则需要按照这个流程来进行插入。

使用 make 命令进行调试

在 Ports 中,为了实现各种简化的表达,表面上看起来可能更加简单。然而,结果是实现变得极为复杂。尽管你可能大致理解了先前提到的目标阶段,但实际发生了什么,为什么会失败,进行调查是非常困难的。这时,make 命令的调试选项(-dX,其中 X 是针对特定功能的选项)就派上了用场。

特别是 -dl 选项,它会显示包括 bsd.port.mk 等文件中的 @ 隐藏的命令执行过程。

make -dl

或者使用 make -de。这个选项仅显示执行失败的命令。如果在构建过程中出现失败,并且你想知道具体是哪条命令执行失败,可以先使用 make -de 查看失败的命令,再通过 make -dl 查看整体流程,这样有助于更容易地掌握问题。

此外,make -dx 选项会使得调用的 shell 命令带上 -x 选项,从而使得在 shell 脚本中执行的内容被显示出来。由于是每次调用时显示,因此与 make -dl 的区别可能不太明显。

常见问题与解答

Q. 为什么这篇文章写得有点杂乱?

A. 这都是 Maven 或 Gradle 的错!它们像 Go 语言一样频繁地进行预获取(prefetch),这点我可以勉强接受。但问题是,它们没有很好地进行缓存,所以我查了很久,最后不得不想办法解决这个问题。

Q. 那么你最终解决了吗?

A. 继续关注网站上的更新吧!

参考文献

FreeBSD ports を作る際の調査ノウハウ
Mk/bsd.port.mk
make(1)
FreeBSD port 日语开发者手册
FreeBSD Port 开发者手册
Ports 的 Makefile 模板