第 8 章 pkg-* 文件

This translation may be out of date. To help with the translations please access the FreeBSD translations instance.

前面有一些没有提及的关于 pkg-* 文件的技巧, 它们可以方便地完成许多任务。

8.1. pkg-message (安装预编译包时显示的消息文件)

如果您需要在安装时显示一条消息给用户, 可以把这消息放在 pkg-message 中。 这一特性通常可以用于在 pkg_add(1) 之后显示一些附加的安装步骤, 或显示关于授权的信息。

当需要显示一些编译开关或警告时, 请使用 ECHO_MSGpkg-message 文件只是为显示安装后的执行操作指导使用的。 类似地, 还需要留意 ECHO_MSGECHO_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_FILESSUB_LIST

SUB_FILESSUB_LIST 这两个变量可以用来在 port 文件中使用某些动态的值, 例如 pkg-message 中的 installation PREFIX

SUB_FILES 变量, 可以指定需要自动进行修改的文件列表。 在 SUB_FILES 中的每一个 文件, 在 FILESDIR 目录中都必须有一个对应的 文件.in。 修改后的版本将保存在 WRKDIR。 在 USE_RC_SUBR (或已经过时的 USE_RCORDER) 中定义的文件会自动加入到 SUB_FILES 中。 对于 pkg-messagepkg-installpkg-deinstall and pkg-req, 对应的 Makefile 变量会被自动设置, 以指向处理过的版本。

SUB_LIST 这个变量的内容是一系列 VAR=VALUE 对。 SUB_FILES 所列出的文件中所有的 %%VAR%% 都将被替换为 VALUE。 系统自动定义了一些常用的替换对, 包括: PREFIXLOCALBASEDATADIRDOCSDIR, 以及 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%%/shared/examples/putsy/%%ARCH%%.conf into your home directory
as .putsy.conf and edit it.

Last modified on: March 9, 2024 by Danilo G. Baio