一定要使用由 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>.