AutoconfCreatingAutomaticConfigurationScriptsEdition2.13,forAutoconfversion2.13December1998byDavidMacKenzieandBenElliston--------------------------------------------------------------------------------Permissionisgrantedtomakeanddistributeverbatimcopiesofthismanualprovidedthecopyrightnoticeandthispermissionnoticearepreservedonallcopies.Permissionisgrantedtocopyanddistributemodifiedversionsofthismanualundertheconditionsforverbatimcopying,providedthattheentireresultingderivedworkisdistributedunderthetermsofapermissionnoticeidenticaltothisone.Permissionisgrantedtocopyanddistributetranslationsofthismanualintoanotherlanguage,undertheaboveconditionsformodifiedversions,exceptthatthispermissionnoticemaybestatedinatranslationapprovedbytheFreeSoftwareFoundation.只要版权声明和本许可声明保留在所有副本中,您就被授权制作和发行本手册的原文副本。只要整个最终派生工作按照与本手册相同的许可声明发行,您就被授权按照与发行原文相同的条件复制和发行本手册的修改版本。除了本许可声明应该使用由基金会批准的译文之外,您被授权按照与上述修改版本相同的条件复制和发行本手册的其它语言的译文。--------------------------------------------------------------------------------本文档由王立翻译。1999.12.16译者在此声明:不对任何由译文错误或者对译文的误解承担任何责任。--------------------------------------------------------------------------------介绍Aphysicist,anengineer,andacomputerscientistwerediscussingthenatureofGod.SurelyaPhysicist,saidthephysicist,becauseearlyintheCreation,GodmadeLight;andyouknow,Maxwell'sequations,thedualnatureofelectro-magneticwaves,therelativistconsequences...AnEngineer!,saidtheengineer,becausebeforemakingLight,GodsplittheChaosintoLandandWater;ittakesahellofanengineertohandlethatbigamountofmud,andorderlyseparationofsolidsfromliquids...Thecomputerscientistshouted:AndtheChaos,wheredoyouthinkitwascomingfrom,hmm?---AnonymousAutoconf是一个用于生成可以自动地配置软件源代码包以适应多种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需要GNUm4以便于生成脚本。它使用了某些UNIX版本的m4所不支持的特征。它还会超出包括GNUm41.0在内的某些m4版本的内部限制。你必须使用GNUm4的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.inconfigure.in--..------autoconf*-----configure+---+[aclocal.m4]--+`---.[acsite.m4]---'|+--[autoheader*]-[config.h.in][acconfig.h]----.|+-----'[config.h.top]--+[config.h.bot]--'Makefile.in-------------------------------Makefile.in在配置软件包的过程中使用的文件:.-------------config.cacheconfigure*------------+-------------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)checksforprogramschecksforlibrarieschecksforheaderfileschecksfortypedefschecksforstructureschecksforcompilercharacteristicschecksforlibraryfunctionschecksforsystemservicesAC_OUTPUT([file...])最好让每个宏调用在`configure.in'中占据单独的一行。大部分宏并不添加额外的新行;它们依赖于在宏调用之后的新行以结束命令。这种方法使得生成的configure脚本在不必添加大量的空行的情况下比较容易阅读。在宏调用的同一行中设置shell变量通常是安全的,这是因为shell允许出现没有用新行间隔的赋值。在调用带参数的宏的时候,在宏名和左括号之间不能出现任何空格。如果参数被m4引用字符`['和`]'所包含,参数就可以多于一行。如果你有一个长