FreeBSD 中文社区 2025 第二季度问卷调查
FreeBSD 中文社区(CFC)
VitePress 镜像站QQ 群 787969044视频教程Ⅰ视频教程Ⅱ
  • FreeBSD 从入门到追忆
  • 中文期刊
  • 状态报告
  • 发行说明
  • 手册
  • 网络文章集锦
  • 笔记本支持报告
  • Port 开发者手册
  • 架构手册
  • 开发者手册
  • 中文 man 手册
  • 文章
  • 书籍
  • FreeBSD 网络文章集锦
  • 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 池配置镜像来消除无效数据的影响
    • FreeBSD Bhyve PCI 直通
    • ZFS 池破坏实验
    • FreeBSD ports 开发技术研究
    • FreeBSD pkg 命令概述
    • portsnap 被淘汰了,本应由 git 代替,但结果我发现自己用的是 got
    • ccache 在构建 FreeBSD 的 buildworld 时的效率
    • Hyper-V FreeBSD 13 安装感想
    • 关于对 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 企业工作组首次会议总结
    • OpenBSD 路由器指南
    • 认识 2023 年 FreeBSD 谷歌编程之夏的学生:Sudhanshu Mohan Kashyap
    • 认识 2023 年夏季滑铁卢大学合作学生:Naman Sood
    • FreeBSD 基金会 2023 年暑期实习生:Jake Freeland
    • 第二次企业工作组会议回顾
    • OpenBSD 与 FreeBSD:有何不同,哪个更好?
  • 2023 年 9 月以前
    • 参与宣传: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 提供支持
LogoLogo

FreeBSD 中文社区(CFC) 2025

在本页
  • FreeBSD ports 开发技术研究
  • 开始
  • 目标阶段
  • 使用 make 命令进行调试
  • 常见问题及其答案
  • Q. 虽然不太整理,但为什么要写这个?
  • Q. 那问题解决了吗?
在GitHub上编辑
导出为 PDF
  1. 2024 年 7 月

FreeBSD ports 开发技术研究

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

最后更新于10个月前

FreeBSD ports 开发技术研究

发布于 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

实际上,对于每个 ports ,有各种情况,例如希望禁用该目标的情况( NO_BUILD / NO_INSTALL / NO_TEST ,每个 make build , make install , make test 都被禁用),或者明确希望启用目标的情况( HAS_CONFIGURE / GNU_CONFIGURE ,均启用 make configure )。情况千差万别。

实际上,还有更多细节的地方,发生了各种各样的挂钩。要完全列出它们太困难了,因此在调查要点中也要做笔记。

目标阶段

如前所述,众所周知的目标是

  • 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 选项会显示在 Makefile 中包含 bsd.port.mk 等的命令执行,而它们一直隐藏在 @ 中。

make -dl

或者也许是 make -de 吧。 这会仅显示执行失败的命令。 如果构建失败,想知道执行了哪些命令导致失败,首先检查 make -de ,然后在 make -dl 中查看整个流程是发生了什么,以便更容易地掌握问题。

再次 make -dx 的情况下,调用的 shell 命令将使用 -x 选项调用,因此在 shell 脚本中执行的内容将显示出来。当然,每次命令调用时... 所以有时候可能无法区分 make -dl 。

常见问题及其答案

Q. 虽然不太整理,但为什么要写这个?

A. Maven 或者 Gradle 有问题。这些家伙像 Go 语言一样频繁预取,就算能容许这一点,但它们没有很好地缓存,所以我在疯狂地调查该怎么办。

Q. 那问题解决了吗?

A. 详细内容请查看网页!

自由 BSD
创作
ports