下一节: , 上一级: 管理发布   [目录][索引]


7.1 配置应该如何工作

每个 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 来猜测它。

允许使用其他选项来更详细地指定机器上存在的软件或硬件,包括或排除软件包的可选部分,或调整某些工具的名称或参数。

--enable-feature[=parameter]

配置软件包以构建和安装名为 feature 的可选用户级工具。这允许用户选择要包含哪些可选功能。如果默认构建,则提供 ‘no’ 的可选 parameter 应省略 feature

任何 ‘--enable’ 选项都不应导致一个功能替换另一个功能。任何 ‘--enable’ 选项都永远不应将一个有用的行为替换为另一个有用的行为。‘--enable’ 的唯一正确用法是用于是否构建程序的一部分或排除它。

--with-package

将安装软件包 package,因此请配置此软件包以与 package 一起使用。

package 的可能值包括 ‘gnu-as’(或 ‘gas’)、‘gnu-ld’、‘gnu-libc’、‘gdb’、‘x’ 和 ‘x-toolkit’。

不要使用 ‘--with’ 选项来指定用于查找某些文件的文件名。这超出了 ‘--with’ 选项的范围。

variable=value

将变量 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 脚本可以简单地忽略其大多数参数。


下一节: , 上一级: 管理发布   [目录][索引]