第4章  复杂的 Porting

目录
4.1 整个系统是如何运转的?
4.2 获取源代码
4.3 修改 port
4.4 打补丁
4.5 配置
4.6 处理用户输入

  好了, 也许工作没那么简单, 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 来做些改变。

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

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

若您有关于 FreeBSD ports 系统的问题, 请发送电子邮件至 <ports@FreeBSD.org>。
关于此文档的任何问题, 请致函 <doc@FreeBSD.org>。