FreeBSD Porter 手册
上一页 | 第5章 　配置 Makefile | 下一页

# 5.14 安装文件

## 5.14.1 INSTALL_* 宏

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

- `INSTALL_PROGRAM` 是安装可执行二进制文件的命令。

- `INSTALL_SCRIPT` 是安装可执行脚本文件的命令。

- `INSTALL_KLD` 是用于安装可加载式内核模块的命令。 在某些平台上， 当对内核模块进行 strip 之后会导致一些问题， 因此您应使用这个宏而不是 `INSTALL_PROGRAM` 来安装内核模块。

- `INSTALL_DATA` 是安装可共享数据的命令。

- `INSTALL_MAN` 是安装联机手册和其他文档的命令 (注意它并不会执行压缩操作)。

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

## 5.14.2 对可执行文件做脱模 (strip) 操作

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

如果您需要对某一文件进行脱模， 但不希望使用 `INSTALL_PROGRAM` 宏， 则应使用 `${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` 中默认的展开方式：

- `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` 中。

## 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` 作为文件的目的地。

上一页 | 起始页 | 下一页
`CONFLICTS` (设置与其它包的冲突) | 上一级 | 特殊情况

若您有关于 FreeBSD ports 系统的问题， 请发送电子邮件至 <ports@FreeBSD.org>。
关于此文档的任何问题， 请致函 <doc@FreeBSD.org>。