6.1.Staging

本节解释了创建 Port 时最常考虑的事情。

6.1.Staging

bsd.port.mk 希望 ports 能够在 "stage directory" 中工作。这意味着 port 不能直接将文件安装到常规的目标目录中 (例如, 在 PREFIX 下), 而应安装到一个单独的目录中, 然后从这个目录中联编软件包。在许多情况下, 这不需要 root 权限, 这使得以非特权用户的身份构建软件包成为可能。在 staging 中, port 被构建并安装到舞台目录 STAGEDIR 中。从舞台目录中创建一个包, 然后安装到系统中。Automake 工具将这个概念称为 DESTDIR, 但在 FreeBSD 中, DESTDIR 有不同的含义 (参见 PREFIXDESTDIR)。

注意

没有一个 Port 真的需要成为 root。通过使用 USES=uidfix 可以避免这种情况。如果 port 仍然在运行 chown(8)chgrp(1) 等命令, 或用 install(1) 强制使用所有者或组, 则可以使用 USES=fakeroot 来伪造这些调用。需要对 port 的 Makefile 进行一些修补。

Meta port, 或那些本身不安装文件而只依赖其他 port 的 port, 必须避免不必要地将 mtree(8) 解压到 stage 目录中。这是软件包的基本目录布局, 这些空目录会被视为孤儿。要防止 mtree(8) 的解压, 请加入这一行:

NO_MTREE=	yes

技巧

Metaports 应该使用 USES=metaport。它为那些不获取、构建或安装任何东西的 Port 设置了默认值。

通过在 pre-installdo-installpost-install 目标中使用的路径前缀 STAGEDIR 来启用暂存功能 (参见书中的例子)。通常, 这包括 PREFIXETCDIRDATADIREXAMPLESDIRMANPREFIXDOCSDIR, 等等。目录应该作为安装后目标的一部分来创建。尽可能地避免使用绝对路径。

技巧

安装内核模块的 port 必须在其目的地前加上 STAGEDIR, 默认是 /boot/modules

6.1.1. 处理符号性链接

创建符号链接时,强烈建议使用相对链接。使用 ${RLN} 来创建相对符号链接。它在后台使用 install(1) 来自动计算出要创建的相对链接。

例54. 自动创建相对的符号链接

${RLN} 使用了 install(1) 的相对符号特性, 使得搬运工无需计算相对路径。

${RLN} ${STAGEDIR}${PREFIX}/lib/libfoo.so.42 ${STAGEDIR}${PREFIX}/lib/libfoo.so
${RLN} ${STAGEDIR}${PREFIX}/libexec/foo/bar ${STAGEDIR}${PREFIX}/bin/bar
${RLN} ${STAGEDIR}/var/cache/foo ${STAGEDIR}${PREFIX}/share/foo

将产生:

% ls -lF ${STAGEDIR}${PREFIX}/lib
lrwxr-xr-x  1 nobody  nobody    181 Aug  3 11:27 libfoo.so@ -> libfoo.so.42
-rwxr-xr-x  1 nobody  nobody     15 Aug  3 11:24 libfoo.so.42*
% ls -lF ${STAGEDIR}${PREFIX}/bin
lrwxr-xr-x  1 nobody  nobody    181 Aug  3 11:27 bar@ -> ../libexec/foo/bar
% ls -lF ${STAGEDIRDIR}${PREFIX}/share
lrwxr-xr-x  1 nobody  nobody    181 Aug  3 11:27 foo@ -> ../../../var/cache/foo

最后更新于

FreeBSD 中文社区