上一页:标准目标,上一级:Makefile 约定 [目录][索引]
在编写 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 目录中的条目。
如果 install
或 uninstall
目标有任何充当安装子程序的依赖项,那么您应该使用类别行开始每个依赖项的命令,并且也使用类别行开始主目标的命令。这样,您可以确保每个命令都被放置在正确的类别中,而不管实际运行的是哪个依赖项。
预安装和后安装命令不应运行除以下之外的任何程序
[ 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 约定 [目录][索引]