一定要使用由 bsd.port.mk 提供的宏, 以确保在您自己的 *-install target 中能够以正确的属主和权限模式安装文件。
INSTALL_PROGRAM 是安装可执行二进制文件的命令。
INSTALL_SCRIPT 是安装可执行脚本文件的命令。
INSTALL_LIB 是安装动态连接库的命令。
INSTALL_KLD 是用于安装可加载式内核模块的命令。 在某些平台上, 当对内核模块进行 strip 之后会导致一些问题, 因此您应使用这个宏而不是 INSTALL_PROGRAM 来安装内核模块。
INSTALL_DATA 是安装可共享数据的命令。
INSTALL_MAN 是安装联机手册和其他文档的命令 (注意它并不会执行压缩操作)。
这些宏展开后基本上都是包含适当参数的 install 命令。
除非不得不进行, 否则不要手工对可执行文件作脱模操作。 所有文件在安装时都应脱模, 但 INSTALL_PROGRAM 宏会在安装的同时对其进行脱模 (参见下一节的内容)。 INSTALL_LIB 宏
如果您需要对某一文件进行脱模, 但不希望使用 INSTALL_PROGRAM 及 INSTALL_LIB 宏, 则应使用 ${STRIP_CMD} 来处理程序。 一般而言这应该在 post-install target 中进行。 例如:
post-install: ${STRIP_CMD} ${PREFIX}/bin/xdl
可以使用 file(1) 命令来检查所安装的可执行文件是否进行过脱模。 如果它没有给出 not stripped 的提示, 则表示已经做过脱模了。 另外, strip(1) 不会对已经脱模过的文件重新脱模, 它会直接退出的。
有时, 会有需要安装大量的文件, 并保持其层次结构, 例如, 将整个目录结构从 WRKSRC 复制到 PREFIX 的目标目录。
针对这种情况, 系统提供了两个宏。 使用这些宏, 而不是直接使用 cp 的优势是它们能够确保目标文件的属主和权限正确。 第一个宏, COPYTREE_BIN 将所有安装的文件视为可执行文件, 因而适合安装文件到 PREFIX/bin。 第二个宏, COPYTREE_SHARE, 则不会设置可执行权限, 因此适合于将文件安装到 PREFIX/share 下。
post-install: ${MKDIR} ${EXAMPLESDIR} (cd ${WRKSRC}/examples/ && ${COPYTREE_SHARE} \* ${EXAMPLESDIR})
这个例子将原作者提供的整个 examples 目录复制到您 port 指定的安装示范文件的位置。
post-install: ${MKDIR} ${DATADIR}/summer (cd ${WRKSRC}/temperatures/ && ${COPYTREE_SHARE} "June July August" ${DATADIR}/summer/)
这个例子将把夏季的三个月的数据, 复制到 DATADIR 中的 summer 子目录。
经由设置 COPYTREE_* 宏的第三个参数, 您还可以为 find 指定额外的参数。 例如, 如果希望安装除了 Makefile 之外的其他所有文件, 可以使用下述命令。
post-install: ${MKDIR} ${EXAMPLESDIR} (cd ${WRKSRC}/examples/ && \ ${COPYTREE_SHARE} \* ${EXAMPLESDIR} "! -name Makefile")
需要注意的是, 这些宏并不能自动将所安装的文件加到 pkg-plist 中, 您还是需要自行列出它们。
如果您的软件包含了标准的联机手册和 info 手册以外的文档, 而且您认为它们对用户会有用, 请把这些文档安装到 PREFIX/share/doc 下。 和前面类似, 这也可以在 post-install target 中完成。
为您的 port 建立一个新的目录。 这个目录的名字应该反映它是属于哪个 port 的。 通常建议使用 PORTNAME。 不过, 如果您认为不同版本的 port 可能会同时安装, 也可以用完整的 PKGNAME。
另外, 应该让是否安装取决于变量 NOPORTDOCS 的设置, 这样用户就能够在 /etc/make.conf 中禁止安装它。 例如:
post-install: .if !defined(NOPORTDOCS) ${MKDIR} ${DOCSDIR} ${INSTALL_MAN} ${WRKSRC}/docs/xvdocs.ps ${DOCSDIR} .endif
这里是一些便于使用的变量, 以及它们在 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。
注意: NOPORTDOCS 只控制将要安装到 DOCSDIR 的那些文档, 而不应影响标准的联机手册以及 info 手册的安装。 安装到 DATADIR 和 EXAMPLESDIR 的文件则相应地受 NOPORTDATA 和 NOPORTEXAMPLES 控制。
这些变量也会被导出到 PLIST_SUB 中。 只要可能, 它们的值就将在那里以相对于 PREFIX 的路径形式出现。 也就是说, share/doc/PORTNAME 在装箱单中默认情况下会替换掉 %%DOCSDIR%%, 等等。 (更多的 pkg-plist 代换可以在 这里 找到。)
所有非无条件安装的文档文件和目录, 都应在 pkg-plist 出现, 并且使用 %%PORTDOCS%% 前缀, 例如:
%%PORTDOCS%%%%DOCSDIR%%/AUTHORS %%PORTDOCS%%%%DOCSDIR%%/CONTACT %%PORTDOCS%%@dirrm %%DOCSDIR%%
如果不希望在 pkg-plist 中逐个列举文档文件, port 也可以将 PORTDOCS 设置为一组文件及其 shell glob 模式, 通过这种方式来加入到最终的装箱单中。 这些名字应是相对于 DOCSDIR 的。 因此, 使用了 PORTDOCS, 并将文档安装到非标准位置的 port, 应相应地设置 DOCSDIR。 如果有在 PORTDOCS 中列出目录, 或者这一变量中的 glob 模式匹配到了目录, 则整个子树中的文件和目录, 都将被注册到最终的装箱单中。 如果定义了 NOPORTDOCS, 则 PORTDOCS 中定义的文件和目录将不被安装或加入装箱单。 是否安装文档到前面所说的 PORTDOCS 仍取决于 port 本身。 下面是一个典型的使用 PORTDOCS 的例子:
PORTDOCS= README.* ChangeLog docs/*
注意: 与 PORTDOCS 类似, 对应于 DATADIR 和 EXAMPLESDIR 的变量分别是 PORTDATA 和 PORTEXAMPLES。
您也可以使用 pkg-message 这个文件, 来在安装时显示一些信息。 参见 关于使用 pkg-message 的这一节 以了解进一步的详情。 需要说明的是, 并不需要把 pkg-message 加到 pkg-plist 中。
尽可能让 port 将它创建的文件, 放置到 PREFIX 中正确的位置。 一些 port 会把各式各样的东西混在一起, 并放到一个同名的目录中, 这是不对的。 另外, 许多 port 会把除了可执行文件、 头文件和联机手册之外的所有文件, 全都一股脑地放到 lib 中, 这在和 BSD 配合使用时会有问题。 多数文件, 应被放到下列位置之一: etc (安装/配置文件)、 libexec (由系统内部调用的可执行文件)、 sbin (为超级用户/管理员提供的可执行文件)、 info (用于 info 浏览器的文档) 或 share (平台无关的其它文件)。 请参见 hier(7) 以了解进一步的详情; 针对 /usr 的那些规则, 同样也适用于 /usr/local。 例外情况是那些需要和 USENET “news” 打交道的 port, 它们可以选择采用 PREFIX/news 作为文件的目的地。