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_PREFIXPREFIX 将是 LINUXBASE (默认为 /compat/linux )。

在源码中避免硬编码的 /usr/local 路径, 使得 port 更加灵活, 并能够满足其他站点的需要。 通常, 这可以通过用 ${PREFIX} 替换 port 的各种 Makefile 中出现的 /usr/local 来实现。 这个变量会自动传递到联编和安装过程的每个阶段。

要确保应用程序没有在 /usr/local 而不是 PREFIX 中安装东西。 对这种硬编码路径的一个快速测试是。

 % make clean; make package PREFIX=/var/tmp/`make -V PORTNAME`

如果有任何东西安装在 PREFIX 之外,软件包创建过程将抱怨找不到这些文件。

此外,值得检查的是对阶段性目录的支持(见 Staging)。

% make stage && make check-plist && make stage-qa && make package
  • 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}

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

如果系统管理员将整个 /usr/local 树移到其他地方,使用 LOCALBASE 的路径更有可能仍然有效。

技巧

所有这些测试都会在运行 poudriere testportpoudriere bulk -t 时自动完成。 我们强烈建议每一个 ports 贡献者都安装并使用它来测试他们的 port。 请参阅 Poudriere 以了解更多信息。

最后更新于

FreeBSD 中文社区