当前位置:Linux教程 - Linux - autoconf手册(一)

autoconf手册(一)

autoconf手册(一)

Autoconf
Creating Automatic Configuration Scripts
Edition 2.13, for Autoconf version 2.13
December 1998
by David MacKenzie and Ben Elliston

--------------------------------------------------------------------------------
Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.

Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.

Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that this permission notice may be stated in a translation approved by the Free Software Foundation.

只要版权声明和本许可声明保留在所有副本中,您就被授权制作和发行本手册的原文副本。

只要整个最终派生工作按照与本手册相同的许可声明发行,您就被授权按照与发行原文相同的条件复制和发行本手册的修改版本。

除了本许可声明应该使用由基金会批准的译文之外,您被授权按照与上述修改版本相同的条件复制和发行本手册的其它语言的译文。
--------------------------------------------------------------------------------

本文档由王立翻译。 1999.12.16

译者在此声明:不对任何由译文错误或者对译文的误解承担任何责任。
--------------------------------------------------------------------------------

介绍
A physicist, an engineer, and a computer scientist were
discussing the nature of God.Surely a Physicist, said the
physicist, because early in the Creation, God made Light; and you
know, Maxwell''s equations, the dual nature of electro-magnetic
waves, the relativist consequences... An Engineer!, said the
engineer, because before making Light, God split the Chaos into
Land and Water; it takes a hell of an engineer to handle that big
amount of mud, and orderly separation of solids from
liquids... The computer scientist shouted: And the Chaos,
where do you think it was coming from, hmm?

---Anonymous

Autoconf是一个用于生成可以自动地配置软件源代码包以适应多种Unix类系统的 shell脚本的工具。由Autoconf生成的配置脚本在运行的时候与Autoconf是无关的,就是说配置脚本的用户并不需要拥有Autoconf。

由Autoconf生成的配置脚本在运行的时候不需要用户的手工干预;通常它们甚至不需要通过给出参数以确定系统的类型。相反,它们对软件包可能需要的各种特征进行独立的测试。(在每个测试之前,它们打印一个单行的消息以说明它们正在进行的检测,以使得用户不会因为等待脚本执行完毕而焦躁。)因此,它们在混合系统或者从各种常见Unix变种定制而成的系统中工作的很好。没有必要维护文件以储存由各个Unix变种、各个发行版本所支持的特征的列表。

对于每个使用了Autoconf的软件包,Autoconf从一个列举了该软件包需要的,或者可以使用的系统特征的列表的模板文件中生成配置脚本。在shell代码识别并响应了一个被列出的系统特征之后,Autoconf允许多个可能使用(或者需要)该特征的软件包共享该特征。如果后来因为某些原因需要调整shell代码,就只要在一个地方进行修改;所有的配置脚本都将被自动地重新生成以使用更新了的代码。

Metaconfig包在目的上与Autoconf很相似,但它生成的脚本需要用户的手工干预,在配置一个大的源代码树的时候这是十分不方便的。不象Metaconfig脚本,如果在编写脚本时小心谨慎, Autoconf可以支持交叉编译(cross-compiling)。

Autoconf目前还不能完成几项使软件包可移植的工作。其中包括为所有标准的目标自动创建``Makefile''文件,包括在缺少标准库函数和头文件的系统上提供替代品。目前正在为在将来添加这些特征而工作。

对于在C程序中的#ifdef中使用的宏的名字,Autoconf施加了一些限制(参见预处理器符号索引)。

Autoconf需要GNU m4以便于生成脚本。它使用了某些UNIX版本的m4 所不支持的特征。它还会超出包括GNU m4 1.0在内的某些m4版本的内部限制。你必须使用GNU m4的1.1版或者更新的版本。使用1.3版或者更新的版本将比1.1 或1.2版快许多。

关于从版本1中升级的详情,参见从版本1中升级。关于Autoconf的开发历史,参见Autoconf的历史。对与Autoconf有关的常见问题的回答,参见关于Autoconf的问题。

把关于Autoconf的建议和bug报告发送到bug-gnu-utils@prep.ai.mit.edu。请把你通过运行``autoconf --version''而获得的Autoconf的版本号包括在内。

创建configure脚本
由Autoconf生成的配置脚本通常被称为configure。在运行的时候,configure 创建一些文件,在这些文件中以适当的值替换配置参数。由configure创建的文件有:

一个或者多个``Makefile''文件,在包的每个子目录中都有一个(参见 Makefile中的替换);
有时创建一个C头文件,它的名字可以被配置,该头文件包含一些#define命令(参见配置头文件);
一个名为``config.status''的shell脚本,在运行时,它将重新创建上述文件。(参见重新创建一个配置);
一个名为``config.cache''的shell脚本,它储存了许多测试的运行结果(参见缓存文件);
一个名为``config.log''的文件,它包含了由编译器生成的许多消息,以便于在configure出现错误时进行调试。
为了使用Autoconf创建一个configure脚本,你需要编写一个Autoconf的输入文件 ``configure.in''并且对它运行autoconf。如果你自行编写了特征测试以补充 Autoconf所提供的测试,你可能还要编写一个名为``aclocal.m4''的文件和一个名为 ``acsite.m4''的文件。如果你使用了包含#define指令的C头文件,你可能还要编写``acconfig.h'',并且你需要与软件包一同发布由Autoconf生成的文件 ``config.h.in''。

下面是一个说明了在配置中使用的文件是如何生成的图。运行的程序都标以后缀``*''。可能出现的文件被方括号(``[]'')括起来。autoconf和autoheader 还读取安装了的Autoconf宏文件(通过读取``autoconf.m4'')。

在准备发布软件包的过程中使用的文件:

你的源文件 --> [autoscan*] --> [configure.scan] --> configure.in

configure.in --. .------> autoconf* -----> configure
 +---+
[aclocal.m4] --+ ``---.
[acsite.m4] ---'' |
 +--> [autoheader*] -> [config.h.in]
[acconfig.h] ----. |
 +-----''
[config.h.top] --+
[config.h.bot] --''

Makefile.in -------------------------------> Makefile.in

在配置软件包的过程中使用的文件:

 .-------------> config.cache
configure* ------------+-------------> config.log
 |
[config.h.in] -. v.-> [config.h] -.
 +--> config.status* -+ +--> make*
Makefile.in ---''``-> Makefile ---''

编写``configure.in''
为了为软件包创建configure脚本,需要编写一个名为``configure.in'' 的文件,该文件包含了对那些你的软件包需要或者可以使用的系统特征进行测试的Autoconf宏的调用。现有的Autoconf宏可以检测许多特征; 对于它们的描述可以参见现有的测试。对于大部分其他特征,你可以使用Autconf模板宏以创建定制的测试;关于它们的详情,参见 编写测试。对于特别古怪或者特殊的特征,``configure.in'' 可能需要包含一些手工编写的shell命令。程序autoscan可以为你编写``configure.in'' 开个好头(详情请参见用autoscan创建``configure.in'')。

除了少数特殊情况之外,在``configure.in''中调用Autoconf宏的顺序并不重要。在每个``configure.in''中,必须在进行任何测试之间包含一个对AC_INIT的调用,并且在结尾处包含一个对AC_OUTPUT的调用(参见创建输出文件)。此外,有些宏要求其他的宏在它们之前被调用,这是因为它们通过检查某些变量在前面设定的值以决定作些什么。这些宏在独立的说明中给出(参见现有的测试),而且如果没有按照顺序调用宏,在生成configure时会向你发出警告。

为了提高一致性,下面是调用Autoconf宏的推荐顺序。通常,在本列表中靠后的项目依赖于表中靠前的项目。例如,库函数可能受到typedefs和库的影响。

AC_INIT(file)
checks for programs
checks for libraries
checks for header files
checks for typedefs
checks for structures
checks for compiler characteristics
checks for library functions
checks for system services
AC_OUTPUT([file...])

最好让每个宏调用在``configure.in''中占据单独的一行。大部分宏并不添加额外的新行;它们依赖于在宏调用之后的新行以结束命令。这种方法使得生成的configure脚本在不必添加大量的空行的情况下比较容易阅读。在宏调用的同一行中设置shell变量通常是安全的,这是因为shell允许出现没有用新行间隔的赋值。

在调用带参数的宏的时候,在宏名和左括号之间不能出现任何空格。如果参数被m4 引用字符``[''和``]''所包含,参数就可以多于一行。如果你有一个长行,比如说一个文件名列表,你通常可以在行的结尾使用反斜线以便在逻辑上把它与下一行进行连接(这是由shell实现的,Autoconf对此没有进行任何特殊的处理)。

有些宏处理两种情况:如果满足了某个给定的条件就做什么,如果没有满足某个给定的条件就做什么。在有些地方,你可能希望在条件为真的情况下作些事,在为假时什么也不作。反之亦然。为了忽略为真的情况,把空值作为参数action-if-found传递给宏。为了忽略为假的情况,可以忽略包括前面的逗号在内的宏的参数action-if-not-found。

你可以在文件``configure.in''中添加注释。注释以m4预定义宏dnl 开头,该宏丢弃在下一个新行之前的所有文本。这些注释并不在生成的configure脚本中出现。例如,把下面给出的行作为文件``configure.in''的开头是有好处的:

dnl Process this file with autoconf to produce a configure script.

用autoscan创建``configure.in''
程序autoscan可以帮助你为软件包创建``configure.in''文件。如果在命令行中给出了目录, autoscan就在给定目录及其子目录树中检查源文件,如果没有给出目录,就在当前目录及其子目录树中进行检查。它搜索源文件以寻找一般的移植性问题并创建一个文件``configure.scan'',该文件就是软件包的``configure.in''预备版本。

在把``configure.scan''改名为``configure.in''之前,你应该手工地检查它;它可能需要一些调整。 autoscan偶尔会按照相对于其他宏的错误的顺序输出宏,为此autoconf将给出警告;你需要手工地移动这些宏。还有,如果你希望包使用一个配置头文件,你必须添加一个对AC_CONFIG_HEADER的调用。(参见配置头文件)。可能你还必须在你的程序中修改或者添加一些#if 指令以使得程序可以与Autoconf合作。(关于有助于该工作的程序的详情,参见 用ifnames列举条件)。

autoscan使用一些数据文件,它们是随发布的Autoconf宏文件一起安装的,以便当它在包中的源文件中发现某些特殊符号时决定输出那些宏。这些文件都具有相同的格式。每一个都是由符号、空白和在符号出现时应该输出的Autoconf 宏。以``#''开头的行是注释。

只有在你安装了Perl的情况下才安装autoscan。 autoscan接受如下选项:

--help
打印命令行选项的概述并且退出。
--macrodir=dir
在目录dir中,而不是在缺省安装目录中寻找数据文件。你还可以把环境变量AC_MACRODIR设置成一个目录;本选项将覆盖该环境变量。
--verbose
打印它检查的文件名称以及在这些文件中发现的可能感兴趣的符号。它的输出可能很冗长。
--version
打印Autoconf的版本号并且退出。
用ifnames列举条件
在为一个软件包编写``configure.in''时,ifnames可以提供一些帮助。它打印出包已经在C预处理条件中使用的标识符。如果包已经被设置得具备了某些可移植性,该程序可以帮助你找到configure所需要进行的检查。它可能有助于补足由autoscan生成的``configure.in''中的某些缺陷。(参见用autoscan创建``configure.in'')。

ifnames扫描所有在命令行中给出的C源代码文件(如果没有给出,就扫描标准输入)并且把排序后的、由所有出现在这些文件中的#if、#elif、#ifdef或者#ifndef 命令中的标识符列表输出到标准输出中。它为每个标识符输出单独的一行,行中标识符之后是一个由空格分隔的、使用了该标识符的文件名列表。

ifnames接受如下选项:

--help
-h
打印命令行选项的概述并且退出。
--macrodir=dir
-m dir
在目录dir中,而不是缺省安装目录中寻找Autoconf宏文件。仅仅被用于获取版本号。你还可以把环境变量AC_MACRODIR设置成一个目录;本选项将覆盖该环境变量。
--version
打印Autoconf的版本号并且退出。
用autoconf创建configure
为了从``configure.in''生成configure,不带参数地运行程序autoconf。 autoconf用使用Autoconf宏的m4宏处理器处理``configure.in''。如果你为autoconf提供了参数,它读入给出的文件而不是``configure.in''并且把配置脚本输出到标准输出而不是configure。如果你给autoconf以参数``-'',它将从标准输入,而不是``configure.in''中读取并且把配置脚本输出到标准输出。

Autoconf宏在几个文件中定义。在这些文件中,有些是与Autconf一同发布的;autoconf首先读入它们。而后它在包含了发布的Autoconf宏文件的目录中寻找可能出现的文件``acsite.m4'',并且在当前目录中寻找可能出现的文件``aclocal.m4''。这些文件可以包含你的站点的或者包自带的Autoconf宏定义(详情请参见 编写宏)。如果宏在多于一个由autoconf读入了的文件中被定义,那么后面的定义将覆盖前面的定义。

autoconf接受如下参数:

--help
-h
输出命令行选项的概述并且退出。
--localdir=dir
-l dir
在目录dir中,而不是当前目录中寻找包文件``aclocal.m4''。
--macrodir=dir
-m dir
在目录dir中寻找安装的宏文件。你还可以把环境变量AC_MACRODIR设置成一个目录;本选项将覆盖该环境变量。
--version
打印Autoconf的版本号并且退出。
用autoreconf更新configure脚本
如果你有大量由Autoconf生成的configure脚本,程序autoreconf可以保留你的一些工作。它重复地运行autoconf(在适当的情况下还运行autoheader)以重新创建以当前目录为根的目录树的Autoconf configure脚本和配置头文件。在缺省情况下,它只重新创建那些比对应的 ``configure.in''或者(如果出现)``aclocal.m4''要旧的文件。由于在文件没有被改变的情况下, autoheader并不改变它的输出文件的时间标记(timestamp)。这是为了使工作量最小化,修改时间标记是不必要的。如果你安装了新版本的Autoconf,你可以以选项``--force''调用autoreconf而重新创建 所有的文件。

如果你在调用autoreconf时给出选项``--macrodir=dir''或者 ``--localdir=dir'',它将把它们传递给autoconf和autoheader (相对路径将被正确地调整)。

在同一个目录树中,autoreconf不支持两个目录作为同一个大包的一部分(共享``aclocal.m4''和 ``acconfig.h''),也不支持每个目录都是独立包(每个目录都有它们自己的``aclocal.m4''和 ``acconfig.h'')。如果你使用了``--localdir'',它假定所有的目录都是同一个包的一部分。如果你没有使用 ``--localdir'',它假定每个目录都是一个独立的包,这条限制在将来可能被取消。

关于在configure脚本的源文件发生变化的情况下自动地重新创建它们的``Makefile''规则的细节,参见自动地重新创建。这种方法正确地处理了配置头文件模板的时间标记,但并不传递``--macrodir=dir''或者``--localdir=dir''。

autoreconf接受如下选项:

--help
-h
打印命令行选项的概述并且退出。
--force
-f
即使在``configure''脚本和配置头文件比它们的输入文件(``configure.in'',如果出现了``aclocal.m4'',也包括它)更新的时候,也要重新创建它们。
--localdir=dir
-l dir
让autoconf和autoheader在目录dir中,而不是在每个包含``configure.in'' 的目录中寻找包文件``aclocal.m4''和(仅指autoheader)``acconfig.h'' (但不包括``file.top''和``file.bot'')。
--macrodir=dir
-m dir
在目录dir中,而不是缺省安装目录中寻找Autoconf宏文件。你还可以把环境变量 AC_MACRODIR设置成一个目录;本选项将覆盖该环境变量。
--verbose
打印autoreconf运行autoconf(如果适当,还有autoheader)的每个目录的目录名。
--version
打印Autoconf的版本号并且退出。
初始化和输出文件
Autoconf生成的configure脚本需要一些关于如何进行初始化,诸如如何寻找包的源文件,的信息;以及如何生成输出文件的信息。本节叙述如何进行初始化和创建输出文件。

寻找configure的输入文件
所有configure脚本在作任何其他事情之前都必须调用AC_INIT。此外唯一必须调用的宏是 AC_OUTPUT(参见创建输出文件)。
宏: AC_INIT (unique-file-in-source-dir)
处理所有命令行参数并且寻找源代码目录。unique-file-in-source-dir是一些在包的源代码目录中文件; configure在目录中检查这些文件是否存在以确定该目录是否包含源代码。人们可能偶尔会用``--srcdir''给出错误的目录;这是一种安全性检查。详情请参见运行configure脚本。

对于需要手工配置或者使用install程序的包来说,虽然在缺省源代码位置在大部分情况下看起来是正确的,包还是可能需要通过调用AC_CONFIG_AUX_DIR来告诉 configure到那里去寻找一些其他的shell脚本。
宏: AC_CONFIG_AUX_DIR (dir)
在目录dir中使用``install-sh''、``config.sub''、``config.guess''和 Cygnus configure配置脚本。它们是配置中使用的辅助文件。dir既可以是绝对路径,也可以是相对于``srcdir''的相对路径。缺省值是在``srcdir''或者 ``srcdir/..''或者``srcdir/../..''中首先找到``install-sh'' 的目录。不对其他文件进行检查,以便使AC_PROG_INSTALL不会自动地发布其他辅助文件。它还要检查``install.sh'',但因为有些make程序包含了在没有``Makefile''的情况下从``install.sh''中创建``install''的规则,所以那个名字过时了。

创建输出文件
每个Autoconf生成的configure脚本必须以对AC_OUTPUT的调用结尾。它是一个创建作为配置结果的``Makefile''以及其他一些可能的文件的宏。此外唯一必须调用的宏是AC_INIT (参见寻找configure的输入文件)。
宏: AC_OUTPUT ([file... [, extra-cmds [, init-cmds]]])