第 4 章 复杂的 Porting
上一页 |  | 下一页

## 第 4 章 复杂的 Porting

好了， 也许工作没那么简单， port 需要做些修改才能够在 FreeBSD 上跑起来。 在这一章里， 我们将会一步步举例来介绍应该如何修改来使您的 port 能在 FreeBSD 上面运行。

## 4.1. 整个系统是如何运转的?

首先， 这一系列的动作是由用户在您的 port 目录里敲入 `make` 后发生的。 您也许会发现在另外的一个窗口里阅读一下 `bsd.port.mk` 将会有助于您的理解。

要是您不是非常明白 `bsd.port.mk` 是做什么的话， 也不用太担心， 很多人都不知道的... :->

1. `fetch` 会首先被执行。 `fetch` 将检查在本地的 `DISTDIR` 目录里是否存在 tar 包。 如果 `fetch` 没有找到就会查找 Makefile 中定义的 `MASTER_SITES` URL， 还有我们的主 FTP 站点 ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/distfiles/， 在那里我们备份了所有被认可的 distfile。 假设那个 `MASTER_SITES` 站点是直接连在 Internet 上的， 就会试着用 `FETCH` 指定的程序取回 distfile。 如果成功的话， 文件会被保存在`DISTDIR` 所指定的目录以备稍后使用。

2. 接下来会执行 `extract`。 它会在 `DISTDIR` 中寻找您的 tar 包 (通常是用 gzip 压缩的 tar 包)，然后解压缩到由 `WRKDIR` 所指定的临时目录里 (默认为`work`目录)。

3. 下一步是执行 `patch`。 首先任何在 `PATCHFILES` 中定义的补丁都会被打上。 然后， 在由 `PATCHDIR` 指定的目录 (默认为 `files`目录) 中发现的`patch-`*``， 它们将会以文件名的字母顺序被先后打上。

4. `configure`会被执行。 这一步骤可能会有以下几种情形。

   1. 如果存在 `scripts/configure`， 就会执行它

   2. 如果定义了 `HAS_CONFIGURE` 或者 `GNU_CONFIGURE`， 就会执行 ``WRKSRC`/configure`。

   3. 如果定义了`USE_IMAGE`， 就会执行 `XMKMF` (默认为: `xmkmf -a`)。

5. `build`会被执行。 这一步将会进入ports的工作目录 (`WRKSRC`) 然后进行编译。如果定义了`USE_GMAKE`， 就会使用 GNU `make`， 反之， 则会使用系统默认的 `make`。

以上都是系统默认的步骤。 您也可以定义 `pre-`something`` 或者 `post-`something``， 或者把以此命名的脚本放到 `scripts` 目录， 它们会在默认的动作之前或之后被执行。

举个例子， 如果您在您的 `Makefile` 里定义了`post-extract`， 并在 `script` 目录里放了一个 `pre-build` 脚本， 那么在 tar 包解开之后 `post-extract` 将被调用， `pre-build` 脚本会在默认的编译之前被执行。 我们推荐您在 `Makefile` 定义所有的动作， 如果不是十分复杂的话， 这样， 别人能更容易明白您的 port 需要执行哪些非默认的动作。

默认的行为都是由 `bsd.port.mk` 定义的 `do-`something`` 来表示的。 例如， port 中用来解压缩的命令是由 `do-extract` 来定义的。 如果您对默认的设置不满意， 可以通过在 `Makefile` 重新定义 `do-`someting`` 来做些改变。

### 注意:

“主” 动作 (例如 `extract`、 `configure`， 等等) 仅仅是用来确定所有相应的阶段都完成了， 以及调用真实的动作或脚本， 它们不应被修改。 如果您想要修改解压缩这个动作， 可以修改 `do-extract`， 但永远都不要改变 `extract` 的操作！

我们已经介绍了在用户敲入 `make` 之后会发生哪些事情了。 接下来我们将进行进一步的学习， 来看一看如何创建一个理想的 port。

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

本文档和其它文档可从这里下载： ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题，请先阅读 文档，如不能解决再联系 <questions@FreeBSD.org>.
关于本文档的问题请发信联系 <doc@FreeBSD.org>.