4.1.他是怎么运作的

首先,当用户在 Port 目录中首次键入 make 命令时,会发生以下事件序列。 在阅读本文时,如果能够同时在另一个窗口打开 bsd.port.mk,将有助于更好地理解。

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

  1. 执行 fetch 目标。fetch 目标负责确保压缩包存在于本地的 DISTDIR 中。如果在 DISTDIR 中找不到所需文件,它会查找在 Makefile 中设置的 URL MASTER_SITES,以及我们的 FTP 镜像,我们会将 distfiles 作为备份放置在其中。然后,它将尝试使用 FETCH 获取指定的分发文件,假设请求站点可以直接访问互联网。如果成功,它将把文件保存在 DISTDIR 中供将来使用,然后继续执行。

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

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

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

    • 如果存在,将运行 scripts/configure

    • 如果设置了 HAS_CONFIGUREGNU_CONFIGURE,将运行 WRKSRC/configure

  5. 执行 build 目标。这会进入 Port 的私有工作目录(WRKSRC)并进行构建。

  6. 执行 stage 目标。这会将最终构建的文件集放入临时目录(STAGEDIR,详见交叉引用:特殊[staging,Staging])。该目录的层次结构与将要安装软件包的系统相同。

  7. 执行 package 目标。这将使用在 stage 目标期间创建的临时目录中的文件以及 Port 的 pkg-plist 来创建一个软件包。

  8. 执行 install 目标。这会将在 package 目标期间创建的软件包安装到主机系统中。

上述为默认操作。此外,如果在 scripts 子目录中定义了 pre-_something_post-_something_ 目标,或者放置了以这些名称命名的脚本,它们将在默认操作完成之前或之后运行。

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

默认操作由 bsd.port.mk 中的 do-_something_ 目标执行。 例如,解压 Port 的命令位于 do-extract 目标中。 如果默认目标无法正常工作,可以在 Makefile 中重新定义 do-_something_ 目标。

注意

“主要”目标(例如,extractconfigure 等)仅确保所有直到该阶段的步骤已完成,并调用真正的目标或脚本,它们不打算进行更改。 要修复解压问题,请修复 do-extract,但绝对不要更改 extract 的操作方式!此外,目标 post-deinstall 无效,不会被 ports 基础设施运行。

现在,了解用户键入 make install 时发生的情况,让我们继续按照推荐步骤来创建完美的 Port 。

最后更新于

FreeBSD 中文社区