FreeBSD 中文社区 2025 第二季度问卷调查
FreeBSD 中文社区(CFC)
VitePress 镜像站QQ 群 787969044视频教程Ⅰ视频教程Ⅱ
  • FreeBSD 从入门到追忆
  • 中文期刊
  • 状态报告
  • 发行说明
  • 手册
  • 网络文章集锦
  • 笔记本支持报告
  • Port 开发者手册
  • 架构手册
  • 开发者手册
  • 中文 man 手册
  • 文章
  • 书籍
  • 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.获取源代码

最后更新于2天前

好的,看来这并不像想象中那样简单,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