AutoconfCreatingAutomaticConfigurationScriptsEdition2.13,forAutoconfversion2.13December1998byDavidMacKenzieandBenElliston目录介绍创建configure脚本o编写`configure.in'o用autoscan创建`configure.in'o用ifnames列举条件o用autoconf创建configureo用autoreconf更新configure脚本初始化和输出文件o寻找configure的输入文件o创建输出文件oMakefile中的替换预定义输出变量创建目录自动地重新创建o配置头文件配置头文件模板用autoheader创建`config.h.in'o在子目录中配置其它包o缺省的前缀oconfigure中的版本号现有的测试o对程序的选择对特定程序的检查对普通程序和文件的检查o库文件o库函数对特定函数的检查对普通函数的检查o头文件对特定头文件的检查对普通头文件的检查o结构o类型定义对特定类型定义的检查对普通类型定义的检查oC编译器的特征oFortran77编译器的特征o系统服务oUNIX变种编写测试o检验声明o检验语法o检验库o检查运行时的特征运行测试程序测试程序指南测试函数o可移植的Shell编程o测试值和文件o多种情况o对语言的选择测试的结果o定义C预处理器符号o设定输出变量o缓存结果缓存变量名缓存文件o打印消息编写宏o宏定义o宏名o引用o宏之间的依赖性首要的宏建议的顺序过时的宏手工配置o指定系统的类型o获取规范的系统类型o系统类型变量o使用系统类型站点配置o与外部软件一起工作o选择包选项o配置站点细节o在安装的时候改变程序的名称转换选项转换的例子转换的规则o设定站点缺省值运行configure脚本重新创建一个配置关于Autoconf的问题o发布configure脚本o为什么需要使用GNUm4?o我如何解开死结?o为什么不使用Imake?从版本1中升级o改变了的文件名o改变了的Makefileo改变了的宏o用autoupdate更新configureo改变了的结果o改变了的宏的编写Autoconf的历史o起源(Genesis)o出发(Exodus)o上路(Leviticus)o发展(Numbers)o现状(Deuteronomy)陈旧的宏名环境变量索引输出变量索引预处理器符号索引宏索引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'中