FreeBSD 中文社区 2025 第二季度问卷调查
FreeBSD 中文社区(CFC)
VitePress 镜像站QQ 群 787969044视频教程Ⅰ视频教程Ⅱ
  • FreeBSD 从入门到追忆
  • 中文期刊
  • 状态报告
  • 发行说明
  • 手册
  • 网络文章集锦
  • 笔记本支持报告
  • Port 开发者手册
  • 架构手册
  • 开发者手册
  • 中文 man 手册
  • 文章与书籍
  • UNIX 四分之一世纪
  • Unix 痛恨者手册
  • FreeBSD Port 开发者手册翻译项目
  • 编辑日志
  • 译者说明
  • FreeBSD Port 开发者手册
    • FreeBSD Port 开发者手册
  • 第 1 章 简介
    • 1.1.简介
  • 第 2 章 制作新的 port
    • 2.1.制作新的 port
  • 第 3 章 简单的 port
    • 3.1.编写 Makefile
    • 3.2.编写描述文件
    • 3.3.创建校验和文件
    • 3.4.测试 port
    • 3.5.用 portlint 来检查 port
    • 3.6.提交新的 port
  • 第 4 章 复杂的 Port
    • 4.1 Port 工作原理
    • 4.2.获取源代码
    • 4.3.修改 port
    • 4.4.打补丁
    • 4.5.配置
    • 4.6.处理用户输入
  • 第 5 章 配置 Makefile
    • 5.1.原始来源
    • 5.2.命名
    • 5.3.归类
    • 5.4.源代码包文件
    • 5.5.维护者(MAINTAINER)
    • 5.6.一句话说明(COMMENT)
    • 5.7.项目网站
    • 5.8.许可证
    • 5.9.PORTSCOUT
    • 5.10.依赖
    • 5.11.从属 port 和 MASTERDIR
    • 5.12.man 手册
    • 5.13.info 文件
    • 5.14.Makefile 参数
    • 5.15.特殊的工作目录
    • 5.16.解决冲突
    • 5.17.安装文件
    • 5.18. 使用 BINARY_ALIAS 来重命名命令,而不是在编译中打补丁
  • 第 6 章 特殊情况
    • 第 6 章 特殊情况
  • 第 7 章 Flavors
    • 7.1.Flavors 简介
    • 7.2.使用 FLAVORS
    • 7.3.USES=php 和 Flavors
    • 7.4.USES=python 和 Flavors
    • 7.5.USES=lua 和 Flavors
  • 第 8 章 高级 pkg-plist 实践
    • 8.1.根据 make 变量对 pkg-plist 进行修改
    • 8.2.空目录
    • 8.3.配置文件
    • 8.4.动态与静态软件包列表
    • 8.5.自动创建软件包列表
    • 8.6.用关键词扩展软件包列表
  • 第 9 章 pkg-*
    • 9.1.pkg-message(安装二进制包时显示的消息文件)
    • 9.2.pkg-install、pkg-pre-install 和 pkg-post-install(安装二进制包时执行的脚本文件)
    • 9.3.pkg-deinstall、pkg-pre-deinstall 和 pkg-post-deinstall(卸载时执行的脚本文件)
    • 9.4.修改 pkg-* 文件的名字
    • 9.5.使用 SUB_FILES 和 SUB_LIST
  • 第 10 章 测试 port
    • 10.1.运行 make describe
    • 10.2.运行 make test
    • 10.3.Portclippy / Portfmt
    • 10.4.Portlint
    • 10.5.Port 工具
    • 10.6.PREFIX 和 DESTDIR
    • 10.7.Poudriere
    • 10.8.调试 port
  • 第 11 章 升级 port
    • 11.1.使用 Git 制作补丁
    • 11.2.UPDATING 和 MOVED
  • 第 12 章 安全
    • 12.1.安全为何如此重要
    • 12.2.修复安全漏洞
    • 12.3.向社区通报情况
  • 第 13 章 该做什么和不该做什么
    • 第 13 章 该做什么和不该做什么
  • 第14章 一个简单的 port
    • 第 14 章 一个简单的 port
  • 第 15 章 在 Port Makefile 中变量的顺序
    • 第 15 章 在 Port Makefile 中变量的顺序
  • 第 16 章 保持更新
    • 第 16 章 保持更新
  • 第 17 章 使用 USES 宏
    • 第 17 章 使用 USES 宏
  • 第 18 章 __FreeBSD_version 的值
    • 第 18 章 __FreeBSD_version 的值
由 GitBook 提供支持
LogoLogo

FreeBSD 中文社区(CFC) 2025

在本页
在GitHub上编辑
导出为 PDF
  1. 第 4 章 复杂的 Port

4.1 Port 工作原理

上一页3.6.提交新的 port下一页4.2.获取源代码

最后更新于25天前

好的,看来这并不像想象中那样简单,Port 需要一些修改才能正常工作。在本节中,我们将逐步解释如何修改它,以使其适应 Ports 的使用模式。


首先,当用户在 Port 目录下输入 make 时,会发生以下事件。阅读 bsd.port.mk 的相关内容能帮助更好地理解这一过程,建议在另一个窗口打开 bsd.port.mk 进行参考。

但别担心,并没有多少人完全理解 bsd.port.mk 的工作原理… :-)

  1. fetch 目标运行。fetch 目标负责确保 tarball 文件存在于本地的 DISTDIR 中。如果 fetch 在 DISTDIR 找不到所需的文件,它会查找 Makefile 中定义的 MASTER_SITES URL,或者我们将 distfiles 放入的 FTP 镜像站点作为备份。它将尝试使用 FETCH 下载指定的分发文件,假设请求的站点可以直接访问互联网。如果下载成功,文件将保存在 DISTDIR 中供将来使用,然后继续进行下一步。

  2. extract 目标运行。该目标会在 DISTDIR 中查找 Port 的分发文件(通常是压缩的 tarball 文件),并将其解压到指定的临时子目录 WRKDIR 中(默认是 work)。

  3. patch 目标运行。首先,应用在 PATCHFILES 中定义的补丁。其次,如果在 PATCHDIR 中找到任何名为 patch-* 的补丁文件(默认位于 files 子目录中),则按字母顺序在此时应用它们。

  4. configure 目标运行。这个目标可以执行许多不同的操作。

    1. 如果存在,则运行 scripts/configure。

    2. 如果设置了 HAS_CONFIGURE 或 GNU_CONFIGURE,则运行 WRKSRC/configure。

  5. build 目标运行。该目标负责进入 Port 的私有工作目录(WRKSRC)并进行编译。

  6. stage 目标运行。这个目标将最终构建好的文件放入一个临时目录(STAGEDIR,请参见 )。该目录的层级结构与将要安装该包的系统相似。

  7. package 目标运行。这个目标会根据 stage 目标期间创建的临时目录中的文件以及 Port 的 pkg-plist 来创建一个包。

  8. install 目标运行。这个目标将通过 package 目标创建的包安装到主机系统中。

以上是默认的操作步骤。此外,可以定义 pre-something 或 post-something 目标,或在 scripts 子目录中放置相应的脚本,它们将在默认操作前后执行。

例如,如果 Makefile 中定义了 post-extract 目标,并且 scripts 子目录中有一个 pre-build 文件,那么 post-extract 目标将在常规的解压操作之后被调用,而 pre-build 文件则会在默认的构建规则之前执行。建议在操作较简单时使用 Makefile 目标,因为这样更容易让其他人理解 Port 需要什么样的非默认操作。

默认的操作由 bsd.port.mk 中的 do-something 目标完成。例如,解压 Port 的命令位于 do-extract 目标中。如果默认目标没有正确执行某个操作,可以重新定义 Makefile 中的 do-something 目标。

注意

“主要”目标(例如 extract、configure 等)只不过是确保所有前置阶段都已完成,然后调用真正的目标或脚本,它们不应该被修改。要修复解压问题,就修改 do-extract,但绝不能改变 extract 的操作!另外,post-deinstall 目标无效,Port 基础设施不会运行它。

了解了用户输入 make install 时的操作流程之后,接下来我们将逐步介绍如何创建完美的 Port。

Staging