5.17.安装文件

5.17.1. INSTALL_* 宏

使用 bsd.port.mk 中提供的宏来确保 port 的 *-install 目标文件的正确模式。在 pkg-plist 中直接设置相应条目的所有权,如 @(owner,group,) , @owner owner 和 @group group 。这些操作符在被覆盖之前一直有效,或者直到 pkg-plist 的末尾,因此在不再需要它们时记得重置。默认所有权为 root:wheel 。更多信息请参阅基础关键字。

  • INSTALL_PROGRAM 是一个安装二进制可执行文件的命令。

  • INSTALL_SCRIPT is a command to install executable scripts.

  • INSTALL_LIB is a command to install shared libraries (but not static libraries).

  • INSTALL_KLD is a command to install kernel loadable modules. Some architectures do not like having the modules stripped, so use this command instead of INSTALL_PROGRAM.

  • INSTALL_DATA 是一个安装可共享数据的命令,包括静态库。

  • INSTALL_MAN 是一个安装 man 手册页和其他文档的命令(它不压缩任何内容)。

这些变量被设置为 install(1) 命令,带有适合每种情况的相应标志。

5.17.2. 剥离二进制文件和共享库

安装的二进制文件应进行剥离。除非绝对必要,否则不要手动剥离二进制文件。 INSTALL_PROGRAM 宏同时安装和剥离二进制文件。 INSTALL_LIB 宏对共享库执行相同操作。

当文件必须被剥离,但既不希望使用 INSTALL_PROGRAM 也不希望使用 INSTALL_LIB 宏时, ${STRIP_CMD} 会剥离程序或共享库。这通常在 post-install 目标内完成。例如:

post-install:
	${STRIP_CMD} ${STAGEDIR}${PREFIX}/bin/xdl

当需要剥离多个文件时:

post-install:
.for l in geometry media body track world
	${STRIP_CMD} ${STAGEDIR}${PREFIX}/lib/lib${PORTNAME}-${l}.so.0
.endfor

使用 file(1) 检查文件是否已经被剥离。二进制文件被 file(1) 报告为 stripped 或 not stripped 。另外,strip(1) 将检测已经被剥离的程序并干净地退出。

当定义变量 WITH_DEBUG 时,elf 文件不得被剥离。 框架自动处理提供的变量( STRIP_CMD , INSTALL_PROGRAM , INSTALL_LIB ,…)和 USES 。 一些软件在其 LDFLAGS 中添加 -s ,在这种情况下,如果设置了 WITH_DEBUG ,则删除 -s ,或者无条件地删除它并在 post-install 中使用 STRIP_CMD 。

安装整个文件树

有时候,必须安装大量文件,并保留它们的层次结构。例如,将整个目录树从 WRKSRC 复制到目标目录下的 PREFIX 。注意, PREFIX 、 EXAMPLESDIR 、 DATADIR 等路径变量必须始终以 STAGEDIR 开头,以遵循分段(见分段)。

针对这种情况,存在两个宏。使用这些宏的优势是它们确保目标文件的正确所有权和权限。第一个宏, COPYTREE_BIN ,将所有安装的文件设置为可执行,因此适合安装到 PREFIX/bin。第二个宏, COPYTREE_SHARE ,不会对文件设置可执行权限,因此适合安装到 PREFIX/share 目标下的文件。

post-install:
	${MKDIR} ${STAGEDIR}${EXAMPLESDIR}
	(cd ${WRKSRC}/examples && ${COPYTREE_SHARE} . ${STAGEDIR}${EXAMPLESDIR})

这个示例将在port的适当示例位置中安装供应商 distfile 目录中 examples 目录的内容。

post-install:
	${MKDIR} ${STAGEDIR}${DATADIR}/summer
	(cd ${WRKSRC}/temperatures && ${COPYTREE_SHARE} "June July August" ${STAGEDIR}${DATADIR}/summer)

这个示例将夏季月份的数据安装到 DATADIR 的夏季子目录中。

额外的 find 参数可以通过第三个参数传递给 COPYTREE_* 宏。例如,要安装第一个示例中除了 Makefiles 之外的所有文件,可以使用以下命令。

post-install:
	${MKDIR} ${STAGEDIR}${EXAMPLESDIR}
	(cd ${WRKSRC}/examples && \
	${COPYTREE_SHARE} . ${STAGEDIR}${EXAMPLESDIR} "! -name Makefile")

这些宏不会将安装的文件添加到 pkg-plist 中。必须手动添加它们。对于可选的文档( PORTDOCS ,请参阅安装额外文档)和示例( PORTEXAMPLES ),必须在 pkg-plist 中添加 %%PORTDOCS%% 或 %%PORTEXAMPLES%% 前缀。

5.17.4. 安装额外文档

如果软件除了标准的 man 和 info 页面外还有一些对用户有用的文档,请在 DOCSDIR 下安装它们。这可以像前一项一样在 post-install 目标中完成。

Create a new directory for the port. The directory name is DOCSDIR. This usually equals PORTNAME. However, if the user might want different versions of the port to be installed at the same time, the whole PKGNAME can be used.

Since only the files listed in pkg-plist are installed, it is safe to always install documentation to STAGEDIR (see Staging). Hence .if blocks are only needed when the installed files are large enough to cause significant I/O overhead.

post-install:
	${MKDIR} ${STAGEDIR}${DOCSDIR}
	${INSTALL_DATA} ${WRKSRC}/docs/xvdocs.ps ${STAGEDIR}${DOCSDIR}

On the other hand, if there is a DOCS option in the port, install the documentation in a post-install-DOCS-on target. These targets are described in Additional Build Targets, <em>target</em>-<em>OPT</em>-on and <em>target</em>-<em>OPT</em>-off.

这里是一些方便的变量以及它们在使用 Makefile 时的默认展开方式:

  • DATADIR 展开为 PREFIX/share/PORTNAME.

  • DATADIR_REL 展开为 share/PORTNAME.

  • DOCSDIR 会展开为 PREFIX/share/doc/PORTNAME。

  • DOCSDIR_REL 会展开为 share/doc/PORTNAME。

  • EXAMPLESDIR 会展开为 PREFIX/share/examples/PORTNAME。

  • " EXAMPLESDIR_REL "被扩展为 share/examples/PORTNAME。

这些变量被导出到 PLIST_SUB 中。它们的值将作为相对于 PREFIX 的路径名显示在那里。也就是说,默认情况下,share/doc/PORTNAME 将被 %%DOCSDIR%% 在包装清单中替换,并依此类推。(请参阅 pkg-plist 替换的更多信息。)

所有有条件安装的文档文件和目录都包含在 pkg-plist 中,带有 %%PORTDOCS%% 前缀,例如:

%%PORTDOCS%%%%DOCSDIR%%/AUTHORS
%%PORTDOCS%%%%DOCSDIR%%/CONTACT

作为在 pkg-plist 中列举文档文件的替代方法,port 可以将变量 PORTDOCS 设置为要添加到最终打包列表中的文件名和 shell 通配符模式的列表。 这些名称将是相对于 DOCSDIR 的。因此,利用 PORTDOCS 的 port ,并且对其文档使用非默认位置的 DOCSDIR 必须相应地设置。 如果目录在此变量中列出或被通配符匹配,则包含的文件和目录的整个子树将在最终打包列表中注册。 如果已取消 DOCS 选项,则不会安装或添加到 port 打包列表中的文件和目录。 如上所示在 PORTDOCS 处安装文档仍由 port 本身决定。 利用 PORTDOCS 的典型示例:

PORTDOCS=	README.* ChangeLog docs/*

安装在 DATADIR 和 EXAMPLESDIR 下的文件的 PORTDOCS 等效物分别是 PORTDATA 和 PORTEXAMPLES 。 pkg-message 的内容在安装时显示。有关使用 pkg-message 的详细信息,请参见 pkg-message 部分。pkg-message 不需要添加到 pkg-plist 中。

5.17.5. PREFIX 下的子目录

试着让 port 把东西放在 PREFIX 的正确子目录中。一些 ports 把所有东西混在一起放入具有 port 名称的子目录中,这是不正确的。此外,许多 ports 把除了二进制文件、头文件和手册页面之外的所有东西都放在 lib 的子目录中,这与 BSD 模式不太相符。许多文件必须移动到以下目录之一:etc(设置/配置文件)、libexec(内部启动的可执行文件)、sbin(超级用户/管理员的可执行文件)、info(信息浏览器的文档)或 share(体系结构无关的文件)。有关详细信息,请参阅 hier(7);适用于 /usr 的规则几乎适用于 /usr/local。例外是处理 USENET "news" 的 ports。它们可以使用 PREFIX/news 作为文件的目的地。

最后更新于

FreeBSD 中文社区