4.1.他是怎么运作的
首先,当用户在 Port 目录中首次键入 make
命令时,会发生以下事件序列。 在阅读本文时,如果能够同时在另一个窗口打开 bsd.port.mk,将有助于更好地理解。
但不必担心,了解 bsd.port.mk 的工作原理的人并不多…… :-)
执行
fetch
目标。fetch
目标负责确保压缩包存在于本地的DISTDIR
中。如果在DISTDIR
中找不到所需文件,它会查找在 Makefile 中设置的 URLMASTER_SITES
,以及我们的 FTP 镜像,我们会将 distfiles 作为备份放置在其中。然后,它将尝试使用FETCH
获取指定的分发文件,假设请求站点可以直接访问互联网。如果成功,它将把文件保存在DISTDIR
中供将来使用,然后继续执行。执行
extract
目标。它会在DISTDIR
中查找 Port 的分发文件(通常是压缩的压缩包),并将其解压缩到由WRKDIR
(默认为 work)指定的临时子目录中。执行
patch
目标。首先,会应用在PATCHFILES
中定义的任何补丁。其次,如果在 files 子目录中找到任何名为 patch-* 的补丁文件,它们会按照字母顺序在此时应用。执行
configure
目标。这可以执行多种不同的操作。
如果存在,将运行 scripts/configure。
如果设置了
HAS_CONFIGURE
或GNU_CONFIGURE
,将运行 WRKSRC/configure。执行
build
目标。这会进入 Port 的私有工作目录(WRKSRC)并进行构建。执行
stage
目标。这会将最终构建的文件集放入临时目录(STAGEDIR,详见交叉引用:特殊[staging,Staging])。该目录的层次结构与将要安装软件包的系统相同。执行
package
目标。这将使用在stage
目标期间创建的临时目录中的文件以及 Port 的 pkg-plist 来创建一个软件包。执行
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_
目标。
注意
“主要”目标(例如,
extract
、configure
等)仅确保所有直到该阶段的步骤已完成,并调用真正的目标或脚本,它们不打算进行更改。 要修复解压问题,请修复do-extract
,但绝对不要更改extract
的操作方式!此外,目标post-deinstall
无效,不会被 ports 基础设施运行。
现在,了解用户键入 make install
时发生的情况,让我们继续按照推荐步骤来创建完美的 Port 。
最后更新于