上一页:,上一级:Makefile 约定   [目录][索引]


7.2.7 安装命令类别

在编写 install 目标时,您必须将所有命令分为三个类别:普通命令、预安装命令和后安装命令。

普通命令将文件移动到其正确的位置,并设置它们的模式。它们不得更改任何文件,除非这些文件完全来自它们所属的软件包。

预安装和后安装命令可能会更改其他文件;特别是,它们可以编辑全局配置文件或数据库。

预安装命令通常在普通命令之前执行,而后安装命令通常在普通命令之后运行。

后安装命令最常见的用途是运行 install-info。这不能使用普通命令完成,因为它会更改一个并非完全且仅来自正在安装的软件包的文件(Info 目录)。它是一个后安装命令,因为它需要在安装软件包的 Info 文件的普通命令之后完成。

大多数程序不需要任何预安装命令,但我们保留此功能以防万一需要它。

要将 install 规则中的命令分为这三个类别,请在它们之间插入类别行。类别行指定后续命令的类别。

类别行由一个制表符和一个对特殊 Make 变量的引用组成,末尾可以有一个可选的注释。您可以使用的变量有三个,每个类别一个;变量名称指定类别。类别行在普通执行中是空操作,因为这三个 Make 变量通常是未定义的(并且您不应该在 makefile 中定义它们)。

以下是三个可能的类别行,每个类别行都附有说明其含义的注释

        $(PRE_INSTALL)     # Pre-install commands follow.
        $(POST_INSTALL)    # Post-install commands follow.
        $(NORMAL_INSTALL)  # Normal commands follow.

如果在 install 规则的开头不使用类别行,则所有命令在第一个类别行之前都被归类为普通命令。如果您不使用任何类别行,则所有命令都被归类为普通命令。

以下是 uninstall 的类别行

        $(PRE_UNINSTALL)     # Pre-uninstall commands follow.
        $(POST_UNINSTALL)    # Post-uninstall commands follow.
        $(NORMAL_UNINSTALL)  # Normal commands follow.

通常,预卸载命令将用于删除 Info 目录中的条目。

如果 installuninstall 目标有任何充当安装子程序的依赖项,那么您应该使用类别行开始每个依赖项的命令,并且也使用类别行开始主目标的命令。这样,您可以确保每个命令都被放置在正确的类别中,而不管实际运行的是哪个依赖项。

预安装和后安装命令不应运行除以下之外的任何程序

[ basename bash cat chgrp chmod chown cmp cp dd diff echo
expand expr false find getopt grep gunzip gzip
hostname install install-info kill ldconfig ln ls md5sum
mkdir mkfifo mknod mv printenv pwd rm rmdir sed sort tee
test touch true uname xargs yes

以这种方式区分命令的原因是为了制作二进制软件包。通常,二进制软件包包含所有需要安装的可执行文件和其他文件,并且有自己的安装方法——因此它不需要运行普通安装命令。但是,安装二进制软件包确实需要执行预安装和后安装命令。

构建二进制软件包的程序通过提取预安装和后安装命令来工作。以下是一种提取预安装命令的方法(需要 make-s 选项来抑制有关进入子目录的消息)

make -s -n install -o all \
      PRE_INSTALL=pre-install \
      POST_INSTALL=post-install \
      NORMAL_INSTALL=normal-install \
  | gawk -f pre-install.awk

其中文件 pre-install.awk 可以包含以下内容

$0 ~ /^(normal-install|post-install)[ \t]*$/ {on = 0}
on {print $0}
$0 ~ /^pre-install[ \t]*$/ {on = 1}

上一页:,上一级:Makefile 约定   [目录][索引]