Path: blob/main/documentation/content/zh-cn/books/porters-handbook/pkg-files/_index.adoc
18099 views
---
title: 第 8 章 pkg-* 文件
prev: books/porters-handbook/plist
next: books/porters-handbook/testing
showBookMenu: true
weight: 8
params:
path: "/books/porters-handbook/pkg-files/"
---
[[pkg-files]]
= [.filename]#pkg-*# 文件
:doctype: book
:toc: macro
:toclevels: 1
:icons: font
:sectnums:
:sectnumlevels: 6
:sectnumoffset: 8
:partnums:
:source-highlighter: rouge
:experimental:
:images-path: books/porters-handbook/
ifdef::env-beastie[]
ifdef::backend-html5[]
:imagesdir: ../../../../images/{images-path}
endif::[]
ifndef::book[]
include::shared/authors.adoc[]
include::shared/mirrors.adoc[]
include::shared/releases.adoc[]
include::shared/attributes/attributes-{{% lang %}}.adoc[]
include::shared/{{% lang %}}/teams.adoc[]
include::shared/{{% lang %}}/mailing-lists.adoc[]
include::shared/{{% lang %}}/urls.adoc[]
toc::[]
endif::[]
ifdef::backend-pdf,backend-epub3[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]
endif::[]
ifndef::env-beastie[]
toc::[]
include::../../../../../shared/asciidoctor.adoc[]
endif::[]
前面有一些没有提及的关于 [.filename]#pkg-*# 文件的技巧, 它们可以方便地完成许多任务。
[[porting-message]]
== [.filename]#pkg-message# (安装预编译包时显示的消息文件)
如果您需要在安装时显示一条消息给用户, 可以把这消息放在 [.filename]#pkg-message# 中。 这一特性通常可以用于在 man:pkg_add[1] 之后显示一些附加的安装步骤, 或显示关于授权的信息。
当需要显示一些编译开关或警告时, 请使用 `ECHO_MSG`。 [.filename]#pkg-message# 文件只是为显示安装后的执行操作指导使用的。 类似地, 还需要留意 `ECHO_MSG` 和 `ECHO_CMD` 之间的区别。 前一个是在屏幕上显示消息性的文字, 而后一个则用于在执行命令时使用管道。
下面是用到了这两个宏的例子 [.filename]#shells/bash2/Makefile#:
[.programlisting]
....
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
....
[NOTE]
====
[.filename]#pkg-message# 文件, 并不需要明确地加到 [.filename]#pkg-plist# 中。 此外, 在用户使用 port 而不是 package 来安装软件时, 它并不会被显示出来。 因此如果需要的话, 您应该在 `post-install` target 中指定显示它。
====
[[pkg-install]]
== [.filename]#pkg-install# (安装预编译包时执行的脚本文件)
如果您的 port 需要在预编译的安装包通过 man:pkg_add[1] 安装时执行一些命令, 则应通过 [.filename]#pkg-install# 脚本来完成。 这个脚本会自动地加入 package, 并被 man:pkg_add[1] 执行两次: 第一次是 `${SH} pkg-install ${PKGNAME} PRE-INSTALL` 而第二次是 `${SH} pkg-install ${PKGNAME} POST-INSTALL`。 `$2` 可被用来检测脚本运行的模式。 环境变量 `PKG_PREFIX` 将设置为 package 的安装目录。 请参见 man:pkg_add[1] 以了解更进一步的细节。
[NOTE]
====
在使用 `make install` 时这个脚本不会被自动运行。 如果需要运行它, 则必须在您的 port 中的 [.filename]#Makefile# 里明确地予以调用, 其方法是加入类似 `PKG_PREFIX=${PREFIX} ${SH} ${PKGINSTALL} ${PKGNAME} PRE-INSTALL` 这样的命令。
====
[[pkg-deinstall]]
== [.filename]#pkg-deinstall# (卸载时执行的脚本文件)
这一脚本将在 package 被卸载时执行。
此脚本会被 man:pkg_delete[1] 执行两次。 第一次是 `${SH} pkg-deinstall ${PKGNAME} DEINSTALL` 而第二次则是 `${SH} pkg-deinstall ${PKGNAME} POST-DEINSTALL`。
[[pkg-req]]
== [.filename]#pkg-req# (安装预编译包时检测是否应执行操作的脚本文件)
如果您的 port 需要确定它是否应被安装, 可以创建 [.filename]#pkg-req#"requirements" 脚本。 它会在安装/卸载时自动运行, 以决定操作是否应被实施。
这个脚本会在使用 man:pkg_add[1] 安装时以 `pkg-req ${PKGNAME} INSTALL` 的命令行执行。 卸载时, 它将由 man:pkg_delete[1] 以 `pkg-req ${PKGNAME} DEINSTALL` 的命令行执行。
[[pkg-names]]
== 改变 [.filename]#pkg-*# 文件的名字
所有 [.filename]#pkg-*# 文件的名字, 皆系采用变量予以定义, 因此在需要时可以在您的 [.filename]#Makefile# 中加以改变。 当您需要在多个 port 之间共享某些 [.filename]#pkg-*# 文件, 或需要写入某些文件时就非常有用了。 (参见 在 <<porting-wrkdir,`WRKDIR`>> 以外的地方写文件, 以了解为什么直接将变更写入 [.filename]#pkg-*# 子目录是个糟糕的主意)
下面是一组变量以及它们的默认值 (`PKGDIR` 默认情况下是 `${MASTERDIR}`。)
[.informaltable]
[cols="1,1", frame="none", options="header"]
|===
| 变量
| 默认值
|`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 时正确地复制到 [.filename]#/var/db/pkg# 目录。
[[using-sub-files]]
== 使用 `SUB_FILES` 和 `SUB_LIST`
`SUB_FILES` 和 `SUB_LIST` 这两个变量可以用来在 port 文件中使用某些动态的值, 例如 [.filename]#pkg-message# 中的 installation `PREFIX`。
用 `SUB_FILES` 变量, 可以指定需要自动进行修改的文件列表。 在 `SUB_FILES` 中的每一个 _文件_, 在 `FILESDIR` 目录中都必须有一个对应的 [.filename]#文件.in#。 修改后的版本将保存在 `WRKDIR`。 在 `USE_RC_SUBR` (或已经过时的 `USE_RCORDER`) 中定义的文件会自动加入到 `SUB_FILES` 中。 对于 [.filename]#pkg-message#、 [.filename]#pkg-install#、 [.filename]#pkg-deinstall# and [.filename]#pkg-req#, 对应的 Makefile 变量会被自动设置, 以指向处理过的版本。
`SUB_LIST` 这个变量的内容是一系列 `VAR=VALUE` 对。 `SUB_FILES` 所列出的文件中所有的 `%%VAR%%` 都将被替换为 `VALUE`。 系统自动定义了一些常用的替换对, 包括: `PREFIX`、 `LOCALBASE`、 `DATADIR`、 `DOCSDIR`, 以及 `EXAMPLESDIR`。 替换结果中所有以 `@comment` 开头的行, 都将在变量替换之后被删去。
下面的例子中, 将把 [.filename]#pkg-message# 中的 `%%ARCH%%` 替换为系统所运行的架构名称:
[.programlisting]
....
SUB_FILES= pkg-message
SUB_LIST= ARCH=${ARCH}
....
注意, 在上述例子中, `FILESDIR` 里必须有 [.filename]#pkg-message.in# 这个文件。
下面是一个正确的 [.filename]#pkg-message.in# 例子:
[.programlisting]
....
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.
....