下一篇:标准目标,上一篇:DESTDIR, 上级:Makefile 约定 [目录][索引]
安装目录应该总是用变量命名,这样可以方便地安装到非标准位置。下面描述了这些变量的标准名称以及它们在 GNU 软件包中应该具有的值。它们基于标准文件系统布局;GNU/Linux 和其他现代操作系统中使用了它的变体。
安装程序在调用 make
时(例如,make prefix=/usr install)或 configure
时(例如,configure --prefix=/usr)应该覆盖这些值。GNU 软件包不应该尝试猜测系统上这些变量的适当值:请使用此处指定的默认设置,以便所有 GNU 软件包的行为都相同,从而使安装程序能够实现任何所需的布局。
所有安装目录及其父目录都应该在安装之前创建(如果需要)。
前两个变量设置安装的根目录。所有其他安装目录都应该是这两个目录的子目录,并且不应该直接将任何内容安装到这两个目录中。
prefix
用于构造下面列出的变量的默认值的前缀。prefix
的默认值应为 /usr/local。在构建完整的 GNU 系统时,前缀将为空,/usr 将是指向 / 的符号链接。(如果您正在使用 Autoconf,请将其写为 ‘@prefix@’。)
使用与构建程序时使用的 prefix
不同的值运行 ‘make install’ 不应该重新编译程序。
exec_prefix
用于构造下面列出的某些变量的默认值的前缀。exec_prefix
的默认值应为 $(prefix)
。(如果您正在使用 Autoconf,请将其写为 ‘@exec_prefix@’。)
通常,$(exec_prefix)
用于包含特定于计算机的文件(例如可执行文件和子例程库)的目录,而 $(prefix)
直接用于其他目录。
使用与构建程序时使用的 exec_prefix
不同的值运行 ‘make install’ 不应该重新编译程序。
可执行程序安装在以下目录之一中。
bindir
用于安装用户可以运行的可执行程序的目录。这通常应该是 /usr/local/bin,但请将其写为 $(exec_prefix)/bin。(如果您正在使用 Autoconf,请将其写为 ‘@bindir@’。)
sbindir
用于安装可以从 shell 运行,但通常仅对系统管理员有用的可执行程序的目录。这通常应该是 /usr/local/sbin,但请将其写为 $(exec_prefix)/sbin。(如果您正在使用 Autoconf,请将其写为 ‘@sbindir@’。)
libexecdir
用于安装由其他程序而不是用户运行的可执行程序的目录。此目录通常应该是 /usr/local/libexec,但请将其写为 $(exec_prefix)/libexec。(如果您正在使用 Autoconf,请将其写为 ‘@libexecdir@’。)
对于所有软件包,‘libexecdir’ 的定义都相同,因此您应该将其数据安装在其子目录中。大多数软件包将其数据安装在 $(libexecdir)/软件包名称/ 下,可能在其其他子目录中,例如 $(libexecdir)/软件包名称/机器/版本。
程序在其执行期间使用的数据文件分为两类。
这导致了六种不同的可能性。但是,我们希望避免使用与架构相关的文件,除了目标文件和库之外。使其他数据文件与架构无关会更简洁,而且通常并不难。
以下是 Makefile 应该使用的变量,用于指定将这些不同类型的文件放入的目录
只读且与架构无关的数据文件的目录树的根。这通常应该是 /usr/local/share,但请将其写为 $(prefix)/share。(如果您正在使用 Autoconf,请将其写为 ‘@datarootdir@’。) ‘datadir’ 的默认值基于此变量;‘infodir’、‘mandir’ 和其他也是如此。
用于安装此程序的特有的只读且与架构无关的数据文件的目录。这通常与 ‘datarootdir’ 位于同一位置,但是我们使用两个单独的变量,以便您可以在不更改 Info 文件、手册页等位置的情况下移动这些特定于程序的文件。
这通常应该是 /usr/local/share,但请将其写为 $(datarootdir)。(如果您正在使用 Autoconf,请将其写为 ‘@datadir@’。)
对于所有软件包,‘datadir’ 的定义都相同,因此您应该将其数据安装在其子目录中。大多数软件包将其数据安装在 $(datadir)/软件包名称/ 下。
用于安装与单台机器相关联的只读数据文件的目录——也就是说,用于配置主机的那些文件。邮件程序和网络配置文件、/etc/passwd 等都属于此处。此目录中的所有文件都应该是普通的 ASCII 文本文件。此目录通常应该是 /usr/local/etc,但请将其写为 $(prefix)/etc。(如果您正在使用 Autoconf,请将其写为 ‘@sysconfdir@’。)
此目录不是安装运行 ‘make’ 构建的可执行文件的正确位置——它们可能应该位于 $(libexecdir) 或 $(sbindir) 中。也不要在此处安装在正常使用过程中会被修改的文件(不包括其目的是更改系统配置的程序)。这些可能应该位于 $(localstatedir) 中。
用于安装程序在运行时修改的与架构无关的数据文件的目录。这通常应该是 /usr/local/com,但请将其写为 $(prefix)/com。(如果您正在使用 Autoconf,请将其写为 ‘@sharedstatedir@’。)
用于安装程序在运行时修改的,并且与一台特定机器相关联的数据文件的目录。用户永远不需要修改此目录中的文件来配置软件包的操作;请将此类配置信息放在单独的文件中,这些文件位于 $(datadir) 或 $(sysconfdir) 中。$(localstatedir) 通常应该是 /usr/local/var,但请将其写为 $(prefix)/var。(如果您正在使用 Autoconf,请将其写为 ‘@localstatedir@’。)
用于安装程序在运行时修改的,与一台特定机器相关联,并且不需要比程序执行时间更长的持久数据文件的目录——通常是长时间运行的,例如,直到下次重新启动。系统守护程序的 PID 文件是典型的用法。此外,除非在重新启动时,否则不应清理此目录,而通用的 /tmp (TMPDIR
) 可以随意清理。这通常应该是 /var/run,但请将其写为 $(localstatedir)/run。将其作为单独的变量允许在需要时使用 /run,例如。(如果您正在使用 Autoconf 2.70 或更高版本,请将其写为 ‘@runstatedir@’。)
这些变量指定了安装某些特定类型文件的目录(如果您的程序有这些文件)。每个 GNU 软件包都应该有 Info 文件,因此每个程序都需要 ‘infodir’,但并非所有程序都需要 ‘libdir’ 或 ‘lispdir’。
用于安装要由用户程序使用 C ‘#include’ 预处理器指令包含的头文件的目录。这通常应该是 /usr/local/include,但请将其写为 $(prefix)/include。(如果您正在使用 Autoconf,请将其写为 ‘@includedir@’。)
除了 GCC 之外,大多数编译器不会在目录 /usr/local/include 中查找头文件。因此,以这种方式安装头文件仅对 GCC 有用。有时这不是问题,因为某些库实际上只打算与 GCC 一起使用。但是,有些库旨在与其他编译器一起使用。它们应该将头文件安装在两个位置,一个由 includedir
指定,另一个由 oldincludedir
指定。
用于安装 ‘#include’ 头文件,以便与 GCC 以外的编译器一起使用的目录。这通常应该是 /usr/include。(如果您正在使用 Autoconf,则可以将其写为 ‘@oldincludedir@’。)
Makefile 命令应检查 oldincludedir
的值是否为空。如果为空,则不应尝试使用它;它们应该取消头文件的第二次安装。
除非该头文件来自同一软件包,否则软件包不应替换此目录中的现有头文件。因此,如果您的 Foo 软件包提供头文件 foo.h,则如果(1)那里没有 foo.h 或(2)存在的 foo.h 来自 Foo 软件包,则应将头文件安装在 oldincludedir
目录中。
要判断 foo.h 是否来自 Foo 软件包,请在文件中放置一个魔术字符串(注释的一部分),并使用 grep
查找该字符串。
用于安装此软件包的文档文件(Info 文件除外)的目录。默认情况下,它应该是 /usr/local/share/doc/您的软件包,但应将其写为 $(datarootdir)/doc/您的软件包。(如果您正在使用 Autoconf,请将其写为 ‘@docdir@’。)您的软件包 子目录(其中可能包含版本号)可防止具有常见名称的文件(例如 README)发生冲突。
用于安装此软件包的 Info 文件的目录。默认情况下,它应该是 /usr/local/share/info,但应将其写为 $(datarootdir)/info。(如果您正在使用 Autoconf,请将其写为 ‘@infodir@’。)为与现有实践兼容,infodir
与 docdir
是分开的。
用于安装特定格式的文档文件的目录。默认情况下,它们都应设置为 $(docdir)
。(如果您正在使用 Autoconf,请将其写为 ‘@htmldir@’、‘@dvidir@’ 等。)提供其文档多个翻译的软件包应将其安装在 ‘$(htmldir)/’ll、‘$(pdfdir)/’ll 等中,其中 ll 是区域设置缩写,例如 ‘en’ 或 ‘pt_BR’。
用于安装目标文件和目标代码库的目录。不要在此处安装可执行文件,它们可能应该放在 $(libexecdir) 中。libdir
的值通常应该是 /usr/local/lib,但请将其写为 $(exec_prefix)/lib。(如果您正在使用 Autoconf,请将其写为 ‘@libdir@’。)
用于安装此软件包中的任何 Emacs Lisp 文件的目录。默认情况下,它应该是 /usr/local/share/emacs/site-lisp,但应将其写为 $(datarootdir)/emacs/site-lisp。
如果您正在使用 Autoconf,请将默认值写为 ‘@lispdir@’。为了使 ‘@lispdir@’ 工作,您需要在您的 configure.ac 文件中添加以下几行
lispdir='${datarootdir}/emacs/site-lisp' AC_SUBST(lispdir)
用于安装此软件包特定于语言环境的消息目录的目录。默认情况下,它应该是 /usr/local/share/locale,但应该写成 $(datarootdir)/locale。(如果您正在使用 Autoconf,请将其写为 ‘@localedir@’。)此目录通常每个语言环境都有一个子目录。
Unix 风格的手册页安装在以下位置之一
用于安装此软件包的手册页(如果有)的顶层目录。它通常是 /usr/local/share/man,但您应该将其写为 $(datarootdir)/man。(如果您正在使用 Autoconf,请将其写为 ‘@mandir@’。)
用于安装第 1 节手册页的目录。将其写为 $(mandir)/man1。
用于安装第 2 节手册页的目录。将其写为 $(mandir)/man2
不要将任何 GNU 软件的主要文档设为手册页。请改为用 Texinfo 编写手册。手册页仅仅是为了在 Unix 上运行 GNU 软件的人而提供的,这只是一个次要的应用。
已安装手册页的文件名扩展名。这应该包含一个句点,后跟适当的数字;它通常应该是 ‘.1’。
已安装的第 1 节手册页的文件名扩展名。
已安装的第 2 节手册页的文件名扩展名。
如果软件包需要在手册的多个部分安装手册页,请使用这些名称代替 ‘manext’。
最后,您应该设置以下变量
正在编译的源代码的目录。此变量的值通常由 configure
shell 脚本插入。(如果您正在使用 Autoconf,请使用 ‘srcdir = @srcdir@’。)
例如
# Common prefix for installation directories. # NOTE: This directory must exist when you start the install. prefix = /usr/local datarootdir = $(prefix)/share datadir = $(datarootdir) exec_prefix = $(prefix) # Where to put the executable for the command 'gcc'. bindir = $(exec_prefix)/bin # Where to put the directories used by the compiler. libexecdir = $(exec_prefix)/libexec # Where to put the Info files. infodir = $(datarootdir)/info
如果您的程序将大量文件安装到用户指定的标准目录之一中,则将它们分组到该程序特定的子目录中可能很有用。如果这样做,您应该编写 install
规则来创建这些子目录。
不要期望用户在上面列出的任何变量的值中包含子目录名称。为安装目录使用统一的变量名称的想法是为了使用户能够为多个不同的 GNU 软件包指定完全相同的值。为了使这一点有用,所有软件包都必须设计成当用户这样做时能够合理地工作。
有时,并非所有这些变量都可能在当前版本的 Autoconf 和/或 Automake 中实现;但截至 Autoconf 2.60,我们认为所有这些变量都已经实现。当任何变量缺失时,这里的描述将作为 Autoconf 将要实现的功能规范。作为程序员,您可以要么使用 Autoconf 的开发版本,要么避免使用这些变量,直到发布支持它们的稳定版本。
下一篇:标准目标,上一篇:DESTDIR, 上级:Makefile 约定 [目录][索引]