下一节: Makefile 约定, 上一级: 管理发布 [目录][索引]
每个 GNU 发行版都应该附带一个名为 configure
的 shell 脚本。此脚本接受参数,这些参数描述了您要为之编译程序的机器和系统类型。configure
脚本必须记录配置选项,以便它们影响编译。
这里的描述是 GNU 软件包中 configure
脚本接口的规范。许多软件包使用 GNU Autoconf(参见 Autoconf 中的简介)和/或 GNU Automake(参见 Automake 中的简介)来实现它,但您不必使用这些工具。您可以以任何您喜欢的方式实现它;例如,通过使 configure
成为一个完全不同的配置系统的包装器。
configure
脚本的另一种操作方式是将标准名称(如 config.h)链接到所选系统的正确配置文件。如果您使用此技术,则发行版不应包含名为 config.h 的文件。这是为了防止人们在未配置的情况下构建程序。
configure
可以做的另一件事是编辑 Makefile。如果您这样做,则发行版不应包含名为 Makefile 的文件。相反,它应包含一个 Makefile.in 文件,其中包含用于编辑的输入。同样,这是为了防止人们在未配置的情况下构建程序。
如果 configure
确实写入了 Makefile,那么 Makefile 应该有一个名为 Makefile 的目标,该目标会导致重新运行 configure
,并设置与上次设置相同的配置。configure
读取的文件应列为 Makefile 的依赖项。
从 configure
脚本输出的所有文件都应在开头添加注释,说明它们是使用 configure
自动生成的。这是为了防止用户试图手动编辑它们。
configure
脚本应写入一个名为 config.status 的文件,该文件描述了上次配置程序时指定的配置选项。此文件应是一个 shell 脚本,如果运行,将重新创建相同的配置。
configure
脚本应接受 ‘--srcdir=dirname’ 形式的选项,以指定查找源代码的目录(如果它不是当前目录)。这使得可以在单独的目录中构建程序,以便不修改实际的源目录。
如果用户未指定 ‘--srcdir’,则 configure
应该检查 . 和 .. 以查看是否可以找到源代码。如果它在这些位置之一找到源代码,它应该从那里使用它们。否则,它应该报告找不到源代码,并应以非零状态退出。
通常,支持 ‘--srcdir’ 的简单方法是在 Makefile 中编辑 VPATH
的定义。某些规则可能需要显式引用指定的源目录。为了使这成为可能,configure
可以在 Makefile 中添加一个名为 srcdir
的变量,其值恰好是指定的目录。
此外,‘configure’ 脚本应采用与大多数标准目录变量相对应的选项(请参阅目录变量)。这是列表
--prefix --exec-prefix --bindir --sbindir --libexecdir --sysconfdir --sharedstatedir --localstatedir --runstatedir --libdir --includedir --oldincludedir --datarootdir --datadir --infodir --localedir --mandir --docdir --htmldir --dvidir --pdfdir --psdir
configure
脚本还应接受一个参数,该参数指定要为其构建程序的系统类型。此参数应如下所示
cpu-company-system
例如,基于 Athlon 的 GNU/Linux 系统可能是 ‘i686-pc-linux-gnu’。
configure
脚本需要能够解码如何描述机器的所有合理的替代方案。因此,‘athlon-pc-gnu/linux’ 将是一个有效的别名。有一个名为 config.sub 的 shell 脚本,您可以用作子例程来验证系统类型并规范化别名。
configure
脚本还应采用选项 --build=buildtype,它应等效于纯 buildtype 参数。例如,‘configure --build=i686-pc-linux-gnu’ 等效于 ‘configure i686-pc-linux-gnu’。当未通过选项或参数指定构建类型时,configure
脚本通常应使用 shell 脚本 config.guess 来猜测它。
允许使用其他选项来更详细地指定机器上存在的软件或硬件,包括或排除软件包的可选部分,或调整某些工具的名称或参数。
配置软件包以构建和安装名为 feature 的可选用户级工具。这允许用户选择要包含哪些可选功能。如果默认构建,则提供 ‘no’ 的可选 parameter 应省略 feature。
任何 ‘--enable’ 选项都不应导致一个功能替换另一个功能。任何 ‘--enable’ 选项都永远不应将一个有用的行为替换为另一个有用的行为。‘--enable’ 的唯一正确用法是用于是否构建程序的一部分或排除它。
将安装软件包 package,因此请配置此软件包以与 package 一起使用。
package 的可能值包括 ‘gnu-as’(或 ‘gas’)、‘gnu-ld’、‘gnu-libc’、‘gdb’、‘x’ 和 ‘x-toolkit’。
不要使用 ‘--with’ 选项来指定用于查找某些文件的文件名。这超出了 ‘--with’ 选项的范围。
将变量 variable 的值设置为 value。这用于覆盖构建过程中命令或参数的默认值。例如,用户可以发出 ‘configure CFLAGS=-g CXXFLAGS=-g’ 以使用调试信息进行构建,而不使用默认优化。
像这样将变量指定为 configure
的参数
./configure CC=gcc
优于在环境变量中设置它们
CC=gcc ./configure
因为它有助于稍后使用 config.status 重新创建相同的配置。但是,应该支持这两种方法。
所有 configure
脚本都应接受所有“详细”选项和变量设置,无论它们是否对当前特定软件包产生任何影响。特别是,它们应该接受任何以 ‘--with-’ 或 ‘--enable-’ 开头的选项。这样,用户就可以使用一组选项一次配置整个 GNU 源代码树。
您会注意到 ‘--with-’ 和 ‘--enable-’ 类别很窄:它们没有为您可能想到的任何类型的选项提供位置。这是故意的。我们希望限制 GNU 软件中可能的配置选项。我们不希望 GNU 程序具有特有的配置选项。
执行部分编译过程的软件包可以支持交叉编译。在这种情况下,程序的主机和目标机器可能不同。
configure
脚本通常应将指定的系统类型视为主机和目标,从而生成一个适用于其运行的同一类型机器的程序。
要编译一个在与构建类型不同的主机类型上运行的程序,请使用 configure 选项 --host=hosttype,其中 hosttype 使用与 buildtype 相同的语法。主机类型通常默认为构建类型。
要配置交叉编译器、交叉汇编器或类似的东西,您应该使用 configure 选项 ‘--target=targettype’ 指定一个与主机不同的目标。 targettype 的语法与主机类型相同。因此,命令看起来像这样
./configure --host=hosttype --target=targettype
目标类型通常默认为主机类型。对于交叉操作没有意义的程序不需要接受 ‘--target’ 选项,因为为交叉操作配置整个操作系统不是有意义的操作。
某些程序具有自动配置自身的方法。如果您的程序设置为执行此操作,则 configure
脚本可以简单地忽略其大多数参数。
下一节: Makefile 约定, 上一级: 管理发布 [目录][索引]