10.5.PREFIX 和 DESTDIR
PREFIX
决定了 port 的安装位置。 它的默认值是 /usr/local , 但也可以由用户设置为类似 /opt 的自定义路径。port 必须尊重这个变量的值。
DESTDIR
, 如果由用户设置, 则决定了完整的替代环境, 通常是一个 jail 或安装在 / 以外的地方的系统。 一个 port 实际上会安装到 DESTDIR/PREFIX , 并在 DESTDIR/var/db/pkg 的软件包数据库中注册。 DESTDIR
是由 chroot(8) 的 ports 基础框架自动处理的。 在编写符合 DESTDIR
的 port 时, 不需要进行修改或任何额外的处理。
PREFIX
的值将被设置为 LOCALBASE
(默认为 /usr/local )。 如果设置了 USE_LINUX_PREFIX
, PREFIX
将是 LINUXBASE
(默认为 /compat/linux )。
在源码中避免硬编码的 /usr/local 路径, 使得 port 更加灵活, 并能够满足其他站点的需要。 通常, 这可以通过用 ${PREFIX}
替换 port 的各种 Makefile 中出现的 /usr/local 来实现。 这个变量会自动传递到联编和安装过程的每个阶段。
要确保应用程序没有在 /usr/local 而不是 PREFIX
中安装东西。 对这种硬编码路径的一个快速测试是。
如果有任何东西安装在 PREFIX
之外,软件包创建过程将抱怨找不到这些文件。
此外,值得检查的是对阶段性目录的支持(见 Staging)。
check-plist
检查从 plist 中丢失的文件, 以及 plist 中没有被 port 安装的文件。stage-qa
会检查一些常见的问题, 例如坏的 shebang、指向 stage 目录之外的 symlinks、 setuid 文件, 以及非剥离的库...
这些测试不会在 port 的文件中找到硬编码的路径, 也不会验证 LOCALBASE
是否被用来正确引用其他 port 的文件。 必须对 /var/tmp/make -V PORTNAME 中临时安装的 port 进行测试, 以确保其在路径方面没有问题。
PREFIX 不能在 port 的 Makefile 中明确设置。安装这个 port 的用户可能已经将 PREFIX
设置为一个自定义的位置, 而 port 必须尊重这一设置。
参考其他 port 的程序和文件时, 应使用上面提到的变量, 而不是明确的路径名。 例如, 如果 port 要求宏 PAGER
具有 less
的完整路径名, 就不要使用 /usr/local/bin/less 的字面路径。相反, 应使用 ${LOCALBASE}
。
如果系统管理员将整个 /usr/local 树移到其他地方,使用 LOCALBASE
的路径更有可能仍然有效。
技巧
所有这些测试都会在运行
poudriere testport
或poudriere bulk -t
时自动完成。 我们强烈建议每一个 ports 贡献者都安装并使用它来测试他们的 port。 请参阅 Poudriere 以了解更多信息。
最后更新于