4.1.Port 是如何运行的

首先,当用户在port的目录中首次输入 make 时发生的事件序列是这样的。在另一个窗口中有 bsd.port.mk 可以帮助理解这个过程。

但不用担心,了解 bsd.port.mk 的工作原理的人并不多... :-)

  1. 运行 fetch 目标。 fetch 目标负责确保 tarball 在本地 DISTDIR 存在。 如果 fetch 在 DISTDIR 找不到所需的文件,它将查找 Makefile 中设置的 URL MASTER_SITES ,以及我们放置备份文件的 FTP 镜像。 然后,它将尝试使用 FETCH 检索命名的分发文件,假定请求站点可以直接访问互联网。 如果成功,它将保存文件在 DISTDIR 以供将来使用并继续进行。

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

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

  4. 该 configure 目标正在运行。这可以做许多不同的事情之一。

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

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

  5. 运行 build 目标。这个目标负责进入 port 的私有工作目录( WRKSRC )并构建它。

  6. 运行 stage 目标。这将最终构建的文件集放入临时目录( STAGEDIR ,参见 Staging)。该目录的层次结构反映了将安装包的系统的层次结构。

  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 目标。

现在用户输入 make install 时发生的情况更清楚了,让我们来看看创建完美port的建议步骤。

最后更新于

FreeBSD 中文社区 2024