PREFIX 能够决定 port 安装时的目的位置。 一般情况下这个位置是 /usr/local 或 /opt。 用户可以将 PREFIX 设为其希望的任意值。 您的 port 则必须遵循这个变量。
除此之外, 如果用户配置了 DESTDIR, 则表示希望将 port 安装到另一个环境, 通常是 jail 或在 / 以外的其他位置挂接的系统中。 实际上, port 会安装到 DESTDIR/PREFIX, 并注册到位于 DESTDIR/var/db/pkg 的预编译包数据库中。 在撰写 port 时, 遵循 DESTDIR 的配置十分重要。
一般而言 PREFIX 会设为 LOCALBASE_REL (默认是 /usr/local)。 如果设置了 USE_X_PREFIX 或 USE_IMAKE, 则 PREFIX 会设为 X11BASE_REL (默认是 /usr/X11R6)。 如果设置了 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) 中测试安装好的软件, 才能够达到这样的目的。
除非真的需要, 否则不要设置 USE_X_PREFIX (例如, 如果它需要引用 X11BASE 中的文件)。
您可以在自己的 Makefile 中改变 PREFIX 变量的值, 也可以通过用户环境变量来影响它。 然而, 一般情况下决不应该在 Makefile 中明确设置它的值。
此外, 引用其它 port 中的文件时, 应使用前面介绍的变量, 而不要直接指定它们的路径名。 例如, 如果您的 port 需要使用 PAGER 这个宏来指明 less 的完整路径, 应使用下面的编译选项:
-DPAGER=\"${LOCALBASE}/bin/less\"
而非 -DPAGER=\"/usr/local/bin/less\"。
这种方法能够增加在系统管理员把整个 /usr/local
目录挪到其它位置时安装成功的机会。请注意 LOCALBASE、 LINUXBASE、 X11BASE、 DOCSDIR、 EXAMPLESDIR、 DATADIR 以及 DESKTOPDIR 这些变量中已经包含了 DESTDIR。 使用 DESTDIR LOCALBASE 是错误的。 在您需要相对于 DESTDIR 的路径时, 应使用 LOCALBASE_REL、 LINUXBASE_REL 和 X11BASE_REL。 为了使脚本撰写过程不过分地繁琐, 可以用 TARGETDIR 来代替 DESTDIR PREFIX。
以下是一些正确的用法:
post-install:
${INSTALL_PROGRAM} ${WRKSRC}/helper ${TARGETDIR}/bin/helper
${INSTALL_DATA} ${WRKSRC}/guide.txt ${DOCSDIR}
在引用 port 的依赖关系时, 会用到 LOCALBASE, 因为我们正在目标环境中进行工作。 如果必须在软件中将路径硬编码进去, 则应使用 LOCALBASE_REL 的值, 因为这些软件会在目标环境内使用。
以下是一些正确的用法:
RUN_DEPENDS= ${LOCALBASE}/share/gonzo/launch.dat:${PORTSDIR}/games/gonzo
post-patch:
@${REINPLACE_CMD} -e 's|/usr/gonzo/launch.dat|${LOCALBASE_REL}/share/gonzo/launch.dat}' ${WRKSRC}/main.c
@${REINPLACE_CMD} -e 's|/etc/game.conf|${PREFIX}/etc/game.conf|' ${WRKSRC}/loader.c
post-install:
@${INSTALL_DATA} ${WRKSRC}/example/conf ${TARGETDIR}/etc/game.conf
在装箱单和 pkg-* 脚本中, %%LOCALBASE%%、 %%LINUXBASE%% 和 %%X11BASE%% 在扩展时, 会自动剔除 DESTDIR, 因为这些文件都会在目标环境中使用。