5.14 安装文件

5.14.1 INSTALL_* 宏

  一定要使用由 bsd.port.mk 提供的宏, 以确保在您自己的 *-install target 中能够以正确的属主和权限模式安装文件。

  这些宏展开后基本上都是包含适当参数的 install 命令。

5.14.2 对可执行文件和动态连接库做脱模 (strip) 操作

  除非不得不进行, 否则不要手工对可执行文件作脱模操作。 所有文件在安装时都应脱模, 但 INSTALL_PROGRAM 宏会在安装的同时对其进行脱模 (参见下一节的内容)。 INSTALL_LIB

  如果您需要对某一文件进行脱模, 但不希望使用 INSTALL_PROGRAMINSTALL_LIB 宏, 则应使用 ${STRIP_CMD} 来处理程序。 一般而言这应该在 post-install target 中进行。 例如:

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

  可以使用 file(1) 命令来检查所安装的可执行文件是否进行过脱模。 如果它没有给出 not stripped 的提示, 则表示已经做过脱模了。 另外, strip(1) 不会对已经脱模过的文件重新脱模, 它会直接退出的。

5.14.3 安装一个目录下的全部文件

  有时, 会有需要安装大量的文件, 并保持其层次结构, 例如, 将整个目录结构从 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 中, 您还是需要自行列出它们。

5.14.4 安装附加的文档

  如果您的软件包含了标准的联机手册和 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 中默认的展开方式:

注意: NOPORTDOCS 只控制将要安装到 DOCSDIR 的那些文档, 而不应影响标准的联机手册以及 info 手册的安装。 安装到 DATADIREXAMPLESDIR 的文件则相应地受 NOPORTDATANOPORTEXAMPLES 控制。

  这些变量也会被导出到 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 类似, 对应于 DATADIREXAMPLESDIR 的变量分别是 PORTDATAPORTEXAMPLES

您也可以使用 pkg-message 这个文件, 来在安装时显示一些信息。 参见 关于使用 pkg-message 的这一节 以了解进一步的详情。 需要说明的是, 并不需要把 pkg-message 加到 pkg-plist 中。

5.14.5 子目录

  尽可能让 port 将它创建的文件, 放置到 PREFIX 中正确的位置。 一些 port 会把各式各样的东西混在一起, 并放到一个同名的目录中, 这是不对的。 另外, 许多 port 会把除了可执行文件、 头文件和联机手册之外的所有文件, 全都一股脑地放到 lib 中, 这在和 BSD 配合使用时会有问题。 多数文件, 应被放到下列位置之一: etc (安装/配置文件)、 libexec (由系统内部调用的可执行文件)、 sbin (为超级用户/管理员提供的可执行文件)、 info (用于 info 浏览器的文档) 或 share (平台无关的其它文件)。 请参见 hier(7) 以了解进一步的详情; 针对 /usr 的那些规则, 同样也适用于 /usr/local。 例外情况是那些需要和 USENET “news” 打交道的 port, 它们可以选择采用 PREFIX/news 作为文件的目的地。

若您有关于 FreeBSD ports 系统的问题, 请发送电子邮件至 <[email protected]>。
关于此文档的任何问题, 请致函 <[email protected]>。