FreeBSD Porter 手册
上一页 | 第9章 　测试您的 port | 下一页

# 9.4 `PREFIX` (安装时的顶级目录名) 和 `DESTDIR`

`PREFIX` 能够决定 port 安装时的目的位置。 一般情况下这个位置是 `/usr/local` 或 `/opt`， 但也可以设为其它的任意值。 您的 port 则必须遵循这个变量。

除此之外， 如果用户配置了 `DESTDIR`， 则表示希望将 port 安装到另一个环境， 通常是 jail 或在 `/` 以外的其他位置挂接的系统中。 实际上， port 会安装到 `DESTDIR`/`PREFIX`， 并注册到位于 `DESTDIR`/var/db/pkg 的预编译包数据库中。 由于 `DESTDIR` 是由 ports 框架藉由 chroot(8) 来实现的， 您在撰写符合 `DESTDIR` 规范的 ports 时并不需要什么额外的工作。

一般而言 `PREFIX` 会设为 `LOCALBASE_REL` (默认是 `/usr/local`)。 如果设置了 `USE_LINUX_PREFIX`， 则 `PREFIX` 会设为 `LINUXBASE_REL` (默认是 `/compat/linux`)。

避免将 `/usr/local` 或 `/usr/X11R6` 硬编码到源代码中， 能够大大提高 port 的灵活性， 并适应不同环境的需要。 对于使用 `imake` 的 X port， 这一工作是自动完成的； 其他情况下， 通常可以简单地将 port 所用到的 `Makefile` 脚本中出现的 `/usr/local` (或对于没有使用 imake 的 X port 而言， `/usr/X11R6`) 替换为读取 `${PREFIX}` 变量就能达到目的了， 因为这个变量在联编和安装的过程中， 会自动向下传递。

一定要避免让您的 port 在 `/usr/local` 而不是正确的 `PREFIX` 中安装文件。 简单的测试方法是：

    # make clean; make package PREFIX=/var/tmp/$(make -V PORTNAME)

如果有文件安装到了 `PREFIX` 以外的地方， 打包过程将抱怨找不到这些文件。

这一步骤并不能帮助发现内部引用， 或纠正在引用其它 port 中的文件时使用的 `LOCALBASE`。 您需要在 `/var/tmp/$(make -V PORTNAME)` 中测试安装好的软件， 才能够达到这样的目的。

您可以在自己的 `Makefile` 中改变 `PREFIX` 变量的值， 也可以通过用户环境变量来影响它。 然而， 一般情况下决不应该在 `Makefile` 中明确设置它的值。

此外， 引用其它 port 中的文件时， 应使用前面介绍的变量， 而不要直接指定它们的路径名。 例如， 如果您的 port 需要使用 `PAGER` 这个宏来指明 `less` 的完整路径， 应使用下面的编译选项：

    -DPAGER=\"${LOCALBASE}/bin/less\"

而非 `-DPAGER=\"/usr/local/bin/less\"`。 这种方法能够增加在系统管理员把整个 `/usr/local` 目录挪到其它位置时安装成功的机会。

上一页 | 起始页 | 下一页
使用 Port Tools 来完成测试 | 上一级 | Tinderbox

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