第 8 章 pkg-* 文件
前面有一些没有提及的关于 pkg-*
文件的技巧, 它们可以方便地完成许多任务。
8.1. pkg-message
(安装预编译包时显示的消息文件)
如果您需要在安装时显示一条消息给用户, 可以把这消息放在 pkg-message
中。 这一特性通常可以用于在 pkg_add(1) 之后显示一些附加的安装步骤, 或显示关于授权的信息。
当需要显示一些编译开关或警告时, 请使用 ECHO_MSG
。 pkg-message
文件只是为显示安装后的执行操作指导使用的。 类似地, 还需要留意 ECHO_MSG
和 ECHO_CMD
之间的区别。 前一个是在屏幕上显示消息性的文字, 而后一个则用于在执行命令时使用管道。
下面是用到了这两个宏的例子 shells/bash2/Makefile
:
update-etc-shells: @${ECHO_MSG} "updating /etc/shells" @${CP} /etc/shells /etc/shells.bak @( ${GREP} -v ${PREFIX}/bin/bash /etc/shells.bak; \ ${ECHO_CMD} ${PREFIX}/bin/bash) >/etc/shells @${RM} /etc/shells.bak
注意:
pkg-message
文件, 并不需要明确地加到 pkg-plist
中。 此外, 在用户使用 port 而不是 package 来安装软件时, 它并不会被显示出来。 因此如果需要的话, 您应该在 post-install
target 中指定显示它。
8.2. pkg-install
(安装预编译包时执行的脚本文件)
如果您的 port 需要在预编译的安装包通过 pkg_add(1) 安装时执行一些命令, 则应通过 pkg-install
脚本来完成。 这个脚本会自动地加入 package, 并被 pkg_add(1) 执行两次: 第一次是 ${SH} pkg-install ${PKGNAME} PRE-INSTALL
而第二次是 ${SH} pkg-install ${PKGNAME} POST-INSTALL
。 $2
可被用来检测脚本运行的模式。 环境变量 PKG_PREFIX
将设置为 package 的安装目录。 请参见 pkg_add(1) 以了解更进一步的细节。
注意:
在使用 make install
时这个脚本不会被自动运行。 如果需要运行它, 则必须在您的 port 中的 Makefile
里明确地予以调用, 其方法是加入类似 PKG_PREFIX=${PREFIX} ${SH} ${PKGINSTALL} ${PKGNAME} PRE-INSTALL
这样的命令。
8.3. pkg-deinstall
(卸载时执行的脚本文件)
这一脚本将在 package 被卸载时执行。
此脚本会被 pkg_delete(1) 执行两次。 第一次是 ${SH} pkg-deinstall ${PKGNAME} DEINSTALL
而第二次则是 ${SH} pkg-deinstall ${PKGNAME} POST-DEINSTALL
。
8.4. pkg-req
(安装预编译包时检测是否应执行操作的脚本文件)
如果您的 port 需要确定它是否应被安装, 可以创建 pkg-req
“requirements” 脚本。 它会在安装/卸载时自动运行, 以决定操作是否应被实施。
这个脚本会在使用 pkg_add(1) 安装时以 pkg-req ${PKGNAME} INSTALL
的命令行执行。 卸载时, 它将由 pkg_delete(1) 以 pkg-req ${PKGNAME} DEINSTALL
的命令行执行。
8.5. 改变 pkg-*
文件的名字
所有 pkg-*
文件的名字, 皆系采用变量予以定义, 因此在需要时可以在您的 Makefile
中加以改变。 当您需要在多个 port 之间共享某些 pkg-*
文件, 或需要写入某些文件时就非常有用了。 (参见 在 WRKDIR
以外的地方写文件, 以了解为什么直接将变更写入 pkg-*
子目录是个糟糕的主意)
下面是一组变量以及它们的默认值 (PKGDIR
默认情况下是 ${MASTERDIR}
。)
变量 | 默认值 |
---|---|
DESCR | ${PKGDIR}/pkg-descr |
PLIST | ${PKGDIR}/pkg-plist |
PKGINSTALL | ${PKGDIR}/pkg-install |
PKGDEINSTALL | ${PKGDIR}/pkg-deinstall |
PKGREQ | ${PKGDIR}/pkg-req |
PKGMESSAGE | ${PKGDIR}/pkg-message |
请修改这些变量, 而不是直接覆盖 PKG_ARGS
的值。 如果您改变了 PKG_ARGS
, 这些文件将无法在安装 port 时正确地复制到 /var/db/pkg
目录。
8.6. 使用 SUB_FILES
和 SUB_LIST
SUB_FILES
和 SUB_LIST
这两个变量可以用来在 port 文件中使用某些动态的值, 例如 pkg-message
中的 installation PREFIX
。
用 SUB_FILES
变量, 可以指定需要自动进行修改的文件列表。 在 SUB_FILES
中的每一个 文件
, 在 FILESDIR
目录中都必须有一个对应的 文件.in
。 修改后的版本将保存在 WRKDIR
。 在 USE_RC_SUBR
(或已经过时的 USE_RCORDER
) 中定义的文件会自动加入到 SUB_FILES
中。 对于 pkg-message
、 pkg-install
、 pkg-deinstall
and pkg-req
, 对应的 Makefile 变量会被自动设置, 以指向处理过的版本。
SUB_LIST
这个变量的内容是一系列 VAR=VALUE
对。 SUB_FILES
所列出的文件中所有的 %%VAR%%
都将被替换为 VALUE
。 系统自动定义了一些常用的替换对, 包括: PREFIX
、 LOCALBASE
、 DATADIR
、 DOCSDIR
, 以及 EXAMPLESDIR
。 替换结果中所有以 @comment
开头的行, 都将在变量替换之后被删去。
下面的例子中, 将把 pkg-message
中的 %%ARCH%%
替换为系统所运行的架构名称:
SUB_FILES= pkg-message SUB_LIST= ARCH=${ARCH}
注意, 在上述例子中, FILESDIR
里必须有 pkg-message.in
这个文件。
下面是一个正确的 pkg-message.in
例子:
Now it is time to configure this package. Copy %%PREFIX%%/share/examples/putsy/%%ARCH%%.conf into your home directory as .putsy.conf and edit it.