10.6.PREFIX 和 DESTDIR

PREFIX 决定了port将安装在哪里。默认为/usr/local,但用户可以将其设置为自定义路径,如/opt。port必须遵守这个变量的值。

DESTDIR ,如果由用户设置,则确定完整的替代环境,通常是一个jail或者安装在除 / 之外的某个地方的系统。port实际上会安装到 DESTDIR/PREFIX,并在 DESTDIR/var/db/pkg 中注册到软件包数据库中。 DESTDIR 由ports基础设施自动处理,使用 chroot(8)。不需要修改或额外注意编写 DESTDIR 兼容的ports。

PREFIX 的值将设置为 LOCALBASE (默认为 /usr/local)。如果设置了 USE_LINUX_PREFIX , PREFIX 将会是 LINUXBASE (默认为/compat/linux)。

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

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

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

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

另外,值得检查是否支持阶段目录(请参阅分段):

% make stage && make check-plist && make stage-qa && make package
  • check-plist 检查 plist 中缺失的文件,以及 plist 中未被 port 安装的文件。

  • stage-qa 检查常见问题,如错误的 shebang、符号链接指向阶段目录之外、setuid 文件和未剥离的库文件…

这些测试不会发现 port 文件中的硬编码路径,也不会验证 LOCALBASE 是否被正确用于引用其他 ports 的文件。必须测试 /var/tmp/ 中临时安装的 port,以确保路径没有问题。

PREFIX 不得在 port 的 Makefile 中明确设置。安装 port 的用户可能已将 PREFIX 设置为定制位置,port 必须尊重该设置。

使用上述提到的变量,而不是显式路径名,从其他 ports 引用程序和文件。例如,如果 port 需要一个宏 PAGER 具有 less 的完整路径名,则不要使用文字路径 /usr/local/bin/less。而是使用 ${LOCALBASE} :

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

具有 LOCALBASE 的路径更有可能在系统管理员将整个 /usr/local 树移动到其他位置时仍然有效。

最后更新于

FreeBSD 中文社区