一定要使用由 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 中进行。 例如:
可以使用 file(1) 命令来检查所安装的可执行文件是否进行过脱模。
如果它没有给出 not stripped 的提示,
则表示已经做过脱模了。 另外,
strip(1) 不会对已经脱模过的文件重新脱模, 它会直接退出的。
有时, 会有需要安装大量的文件, 并保持其层次结构, 例如,
将整个目录结构从 WRKSRC 复制到 PREFIX 的目标目录。
针对这种情况, 系统提供了两个宏。 使用这些宏,
而不是直接使用 cp 的优势是它们能够确保目标文件的属主和权限正确。 第一个宏,
COPYTREE_BIN 将所有安装的文件视为可执行文件, 因而适合安装文件到
PREFIX/bin。
第二个宏, COPYTREE_SHARE, 则不会设置可执行权限,
因此适合于将文件安装到 PREFIX/share
下。
这个例子将原作者提供的整个
examples 目录复制到您 port 指定的安装示范文件的位置。
这个例子将把夏季的三个月的数据, 复制到
DATADIR 中的
summer 子目录。
经由设置 COPYTREE_* 宏的第三个参数,
您还可以为 find 指定额外的参数。
例如, 如果希望安装除了 Makefile 之外的其他所有文件,
可以使用下述命令。
需要注意的是, 这些宏并不能自动将所安装的文件加到
pkg-plist 中, 您还是需要自行列出它们。
如果您的软件包含了标准的联机手册和 info 手册以外的文档,
而且您认为它们对用户会有用, 请把这些文档安装到
PREFIX/share/doc 下。
和前面类似, 这也可以在
post-install target 中完成。
为您的 port 建立一个新的目录。
这个目录的名字应该反映它是属于哪个 port 的。 通常建议使用
PORTNAME。 不过, 如果您认为不同版本的 port
可能会同时安装, 也可以用完整的
PKGNAME。
另外, 应该让是否安装取决于变量
NOPORTDOCS 的设置, 这样用户就能够在
/etc/make.conf 中禁止安装它。 例如:
这里是一些便于使用的变量, 以及它们在
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%% 前缀, 例如:
如果不希望在 pkg-plist 中逐个列举文档文件, port
也可以将 PORTDOCS 设置为一组文件及其 shell glob
模式, 通过这种方式来加入到最终的装箱单中。
这些名字应是相对于 DOCSDIR 的。
因此, 使用了 PORTDOCS,
并将文档安装到非标准位置的 port, 应相应地设置
DOCSDIR。
如果有在 PORTDOCS 中列出目录,
或者这一变量中的 glob 模式匹配到了目录, 则整个子树中的文件和目录,
都将被注册到最终的装箱单中。 如果定义了 NOPORTDOCS, 则
PORTDOCS 中定义的文件和目录将不被安装或加入装箱单。
是否安装文档到前面所说的 PORTDOCS 仍取决于 port 本身。
下面是一个典型的使用 PORTDOCS 的例子:
与 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
作为文件的目的地。
本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.
如果对于FreeBSD有问题,请先阅读
文档,如不能解决再联系
<questions@FreeBSD.org>.
关于本文档的问题请发信联系
<doc@FreeBSD.org>.