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


7.2.6 用户标准目标

所有 GNU 程序都应该在其 Makefile 中包含以下目标

all

编译整个程序。这应该是默认目标。此目标无需重新构建任何文档文件;Info 文件通常应包含在发行版中,而 DVI(和其他文档格式)文件仅在显式要求时才应生成。

默认情况下,Make 规则应使用 ‘-g’ 进行编译和链接,以便可执行程序具有调试符号。否则,当面对崩溃时您基本上无能为力,并且通常很难通过新的构建来重现崩溃。

install

编译程序并将可执行文件、库等复制到它们应该实际使用的文件名位置。如果有一个简单的测试来验证程序是否正确安装,则此目标应该运行该测试。

安装时不要剥离可执行文件。这有助于以后可能需要的调试,而且现在磁盘空间很便宜,动态加载器通常会确保调试部分在正常执行期间不被加载。需要剥离二进制文件的用户可以调用 install-strip 目标来完成此操作。

如果可能,请编写 install 目标规则,使其在 ‘make all’ 完成后不会修改构建程序的目录中的任何内容。这对于在一个用户名下构建程序并在另一个用户名下安装它很方便。

如果不存在,命令应创建所有要安装文件的目录。这包括指定为变量 prefixexec_prefix 的值以及所有需要的子目录。执行此操作的一种方法是使用如下所述的 installdirs 目标。

在安装 man page 的任何命令之前使用 ‘-’,这样 make 将忽略任何错误。这是为了防止某些系统没有安装 Unix man page 文档系统。

安装 Info 文件的方法是使用 $(INSTALL_DATA)(参见 命令变量)将它们复制到 $(infodir) 中,然后运行 install-info 程序(如果存在)。install-info 是一个程序,用于编辑 Info dir 文件,为给定的 Info 文件添加或更新菜单项;它是 Texinfo 包的一部分。

这是一个安装 Info 文件的示例规则,它还尝试处理一些其他情况,例如 install-info 不存在的情况。

do-install-info: foo.info installdirs
        $(NORMAL_INSTALL)
# Prefer an info file in . to one in srcdir.
        if test -f foo.info; then d=.; \
         else d="$(srcdir)"; fi; \
        $(INSTALL_DATA) $$d/foo.info \
          "$(DESTDIR)$(infodir)/foo.info"
# Run install-info only if it exists.
# Use 'if' instead of just prepending '-' to the
# line so we notice real errors from install-info.
# Use '$(SHELL) -c' because some shells do not
# fail gracefully when there is an unknown command.
        $(POST_INSTALL)
        if $(SHELL) -c 'install-info --version' \
           >/dev/null 2>&1; then \
          install-info --dir-file="$(DESTDIR)$(infodir)/dir" \
                       "$(DESTDIR)$(infodir)/foo.info"; \
        else true; fi

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

install-html
install-dvi
install-pdf
install-ps

这些目标安装 Info 格式以外的其他格式的文档;它们旨在由安装软件包的人员显式调用,如果需要该格式。GNU 倾向于使用 Info 文件,因此必须由 install 目标安装这些文件。

当您有许多文档文件要安装时,我们建议您通过安排这些目标安装在适当的安装目录(例如 htmldir)的子目录中来避免冲突和混乱。例如,如果您的软件包有多个手册,并且您希望安装具有多个文件的 HTML 文档(例如 makeinfo --html 的“拆分”模式输出),则您肯定需要使用子目录,否则不同手册中具有相同名称的两个节点将互相覆盖。

请使这些 install-format 目标调用 format 目标的命令,例如,通过使 format 成为依赖项。

uninstall

删除所有已安装的文件——‘install’ 和 ‘install-*’ 目标创建的副本。

此规则不应修改完成编译的目录,而仅修改安装文件的目录。

卸载命令分为三类,与安装命令相同。请参阅 安装命令分类

install-strip

类似于 install,但在安装时剥离可执行文件。在简单的情况下,此目标可以以简单的方式使用 install 目标

install-strip:
        $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' \
                install

但是,如果软件包同时安装脚本和实际可执行文件,则 install-strip 目标不能仅仅引用 install 目标;它必须剥离可执行文件,但不能剥离脚本。

install-strip 不应剥离为安装而复制的构建目录中的可执行文件。它应该只剥离已安装的副本。

通常,我们不建议剥离可执行文件,除非您确定程序没有错误。但是,可以合理地安装剥离的可执行文件以进行实际执行,同时将未剥离的可执行文件保存在其他地方,以防出现错误。

clean

删除当前目录中通常由构建程序创建的所有文件。如果这些文件由此 makefile 创建,也删除其他目录中的文件。但是,不要删除记录配置的文件。还要保留可以通过构建创建,但通常不会创建的文件,因为发行版中带有这些文件。无需删除使用 ‘mkdir -p’ 创建的父目录,因为它们可能无论如何都已存在。

如果 .dvi 文件不是发行版的一部分,则在此处删除它们。

distclean

删除当前目录中(或由此 makefile 创建)由配置或构建程序创建的所有文件。如果您已解压缩源代码并在未创建任何其他文件的情况下构建了程序,则 ‘make distclean’ 应仅保留发行版中的文件。但是,无需删除使用 ‘mkdir -p’ 创建的父目录,因为它们可能无论如何都已存在。

mostlyclean

类似于 ‘clean’,但可以避免删除一些人们通常不想重新编译的文件。例如,GCC 的 ‘mostlyclean’ 目标不会删除 libgcc.a,因为重新编译它很少需要并且需要花费大量时间。

maintainer-clean

删除几乎所有可以使用此 Makefile 重建的内容。这通常包括 distclean 删除的所有内容,以及更多内容:Bison 生成的 C 源文件、标签表、Info 文件等等。

我们说“几乎所有内容”的原因是,即使可以使用 Makefile 中的规则重新生成 configure,运行命令 ‘make maintainer-clean’ 也不应删除 configure。更一般地,‘make maintainer-clean’ 不应删除为了运行 configure 然后开始构建程序而需要存在的任何内容。此外,无需删除使用 ‘mkdir -p’ 创建的父目录,因为它们可能无论如何都已存在。这些是唯一的例外;maintainer-clean 应该删除所有其他可以重建的内容。

maintainer-clean’ 目标旨在由软件包的维护者使用,而不是由普通用户使用。您可能需要特殊的工具来重建 ‘make maintainer-clean’ 删除的某些文件。由于这些文件通常包含在发行版中,因此我们不注意使它们易于重建。如果您发现需要再次解压缩完整发行版,请不要责怪我们。

为了帮助用户了解这一点,特殊 maintainer-clean 目标的命令应以以下两行开头

@echo 'This command is intended for maintainers to use; it'
@echo 'deletes files that may need special tools to rebuild.'
TAGS

更新此程序的标签表。

info

生成所需的任何 Info 文件。编写规则的最佳方法如下

info: foo.info

foo.info: foo.texi chap1.texi chap2.texi
        $(MAKEINFO) $(srcdir)/foo.texi

您必须在 Makefile 中定义变量 MAKEINFO。它应该运行 makeinfo 程序,该程序是 Texinfo 发行版的一部分。

通常,GNU 发行版带有 Info 文件,这意味着 Info 文件存在于源目录中。因此,Info 文件的 Make 规则应在源目录中更新它。当用户构建软件包时,通常 Make 不会更新 Info 文件,因为它们已经是最新的。

dvi
html
pdf
ps

生成给定格式的文档文件。这些目标应始终存在,但如果无法生成给定输出格式,则任何或所有目标都可以不执行任何操作。这些目标不应是 all 目标的依赖项;用户必须手动调用它们。

这是一个从 Texinfo 生成 DVI 文件的示例规则

dvi: foo.dvi

foo.dvi: foo.texi chap1.texi chap2.texi
        $(TEXI2DVI) $(srcdir)/foo.texi

您必须在 Makefile 中定义变量 TEXI2DVI。它应该运行程序 texi2dvi,该程序是 Texinfo 发行版的一部分。(texi2dvi 使用 TeX 完成实际的格式化工作。TeX 不与 Texinfo 一起分发。)或者,仅编写依赖项,并允许 GNU make 提供命令。

这是另一个示例,用于从 Texinfo 生成 HTML

html: foo.html

foo.html: foo.texi chap1.texi chap2.texi
        $(TEXI2HTML) $(srcdir)/foo.texi

同样,您将在 Makefile 中定义变量 TEXI2HTML;例如,它可能会运行 makeinfo --no-split --htmlmakeinfo 是 Texinfo 发行版的一部分)。

dist

为此程序创建一个发行版 tar 文件。应设置 tar 文件,以便 tar 文件中的文件名以子目录名称开头,该名称是它所属的发行版软件包的名称。此名称可以包含版本号。

例如,GCC 1.40 版的发行版 tar 文件解压缩到名为 gcc-1.40 的子目录中。

最简单的方法是创建一个适当命名的子目录,使用 lncp 将正确的文件安装到其中,然后 tar 该子目录。

使用 gzip 压缩 tar 文件。例如,GCC 1.40 版的实际发行版文件名为 gcc-1.40.tar.gz。支持其他免费压缩格式也可以。

dist 目标应显式依赖于发行版中的所有非源文件,以确保它们在发行版中是最新的。请参阅 制作发行版

check

执行自测(如果有)。用户必须在运行测试之前构建程序,但无需安装程序;您应该编写自测,使其在构建程序但未安装时工作。

以下目标建议作为传统名称,用于它们有用的程序中。

installcheck

执行安装测试(如果有)。用户必须在运行测试之前构建并安装程序。你不应该假设 $(bindir) 在搜索路径中。

installdirs

添加一个名为 'installdirs' 的目标来创建文件安装的目录及其父目录非常有用。有一个名为 mkinstalldirs 的脚本可以方便地完成此操作;你可以在 Gnulib 包中找到它。你可以使用像这样的规则

# Make sure all installation directories (e.g. $(bindir))
# actually exist by making them if necessary.
installdirs: mkinstalldirs
        $(srcdir)/mkinstalldirs $(bindir) $(datadir) \
                                $(libdir) $(infodir) \
                                $(mandir)

或者,如果你希望支持 DESTDIR(强烈建议),

# Make sure all installation directories (e.g. $(bindir))
# actually exist by making them if necessary.
installdirs: mkinstalldirs
        $(srcdir)/mkinstalldirs \
            $(DESTDIR)$(bindir) $(DESTDIR)$(datadir) \
            $(DESTDIR)$(libdir) $(DESTDIR)$(infodir) \
            $(DESTDIR)$(mandir)

此规则不应修改编译完成的目录。它应该只创建安装目录。


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