使用 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) 命令,带有适合每种情况的相应标志。
安装的二进制文件应进行剥离。除非绝对必要,否则不要手动剥离二进制文件。 INSTALL_PROGRAM 宏同时安装和剥离二进制文件。 INSTALL_LIB 宏对共享库执行相同操作。
当文件必须被剥离,但既不希望使用 INSTALL_PROGRAM 也不希望使用 INSTALL_LIB 宏时, ${STRIP_CMD} 会剥离程序或共享库。这通常在 post-install 目标内完成。例如:
当需要剥离多个文件时:
使用 file(1) 检查文件是否已经被剥离。二进制文件被 file(1) 报告为 stripped 或 not stripped 。另外,strip(1) 将检测已经被剥离的程序并干净地退出。
有时候,必须安装大量文件,并保留它们的层次结构。例如,将整个目录树从 WRKSRC 复制到目标目录下的 PREFIX 。注意, PREFIX 、 EXAMPLESDIR 、 DATADIR 等路径变量必须始终以 STAGEDIR 开头,以遵循分段(见分段)。
针对这种情况,存在两个宏。使用这些宏的优势是它们确保目标文件的正确所有权和权限。第一个宏, COPYTREE_BIN ,将所有安装的文件设置为可执行,因此适合安装到 PREFIX/bin。第二个宏, COPYTREE_SHARE ,不会对文件设置可执行权限,因此适合安装到 PREFIX/share 目标下的文件。
这个示例将在port的适当示例位置中安装供应商 distfile 目录中 examples 目录的内容。
这个示例将夏季月份的数据安装到 DATADIR 的夏季子目录中。
额外的 find 参数可以通过第三个参数传递给 COPYTREE_* 宏。例如,要安装第一个示例中除了 Makefiles 之外的所有文件,可以使用以下命令。
这些宏不会将安装的文件添加到 pkg-plist 中。必须手动添加它们。对于可选的文档( PORTDOCS ,请参阅安装额外文档)和示例( PORTEXAMPLES ),必须在 pkg-plist 中添加 %%PORTDOCS%% 或 %%PORTEXAMPLES%% 前缀。
如果软件除了标准的 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.
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%% 前缀,例如:
作为在 pkg-plist 中列举文档文件的替代方法,port 可以将变量 PORTDOCS 设置为要添加到最终打包列表中的文件名和 shell 通配符模式的列表。 这些名称将是相对于 DOCSDIR 的。因此,利用 PORTDOCS 的 port ,并且对其文档使用非默认位置的 DOCSDIR 必须相应地设置。 如果目录在此变量中列出或被通配符匹配,则包含的文件和目录的整个子树将在最终打包列表中注册。 如果已取消 DOCS 选项,则不会安装或添加到 port 打包列表中的文件和目录。 如上所示在 PORTDOCS 处安装文档仍由 port 本身决定。 利用 PORTDOCS 的典型示例:
试着让 port 把东西放在 PREFIX 的正确子目录中。一些 ports 把所有东西混在一起放入具有 port 名称的子目录中,这是不正确的。此外,许多 ports 把除了二进制文件、头文件和手册页面之外的所有东西都放在 lib 的子目录中,这与 BSD 模式不太相符。许多文件必须移动到以下目录之一:etc(设置/配置文件)、libexec(内部启动的可执行文件)、sbin(超级用户/管理员的可执行文件)、info(信息浏览器的文档)或 share(体系结构无关的文件)。有关详细信息,请参阅 hier(7);适用于 /usr 的规则几乎适用于 /usr/local。例外是处理 USENET "news" 的 ports。它们可以使用 PREFIX/news 作为文件的目的地。
当定义变量 WITH_DEBUG 时,elf 文件不得被剥离。 框架自动处理提供的变量( STRIP_CMD , INSTALL_PROGRAM , INSTALL_LIB ,…)和 USES 。 一些软件在其 LDFLAGS 中添加 -s ,在这种情况下,如果设置了 WITH_DEBUG ,则删除 -s ,或者无条件地删除它并在 post-install 中使用 STRIP_CMD 。
安装在 DATADIR 和 EXAMPLESDIR 下的文件的 PORTDOCS 等效物分别是 PORTDATA 和 PORTEXAMPLES 。 pkg-message 的内容在安装时显示。有关使用 pkg-message 的详细信息,请参见 pkg-message 部分。pkg-message 不需要添加到 pkg-plist 中。