⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 autoconf.htm

📁 Makefile编程及相关资料的介绍与入门。很适合初学者的学习与借鉴
💻 HTM
📖 第 1 页 / 共 5 页
字号:
开个好头(详情请参见<A 
href="http://www.linuxforum.net/books/autoconf.html#SEC4">用<CODE>autoscan</CODE>创建<TT>`configure.in'</TT></A>)。 
</P>
<P>除了少数特殊情况之外,在<TT>`configure.in'</TT>中调用Autoconf宏的顺序并不重要。在每个<TT>`configure.in'</TT>中,必须在进行任何测试之间包含一个对<CODE>AC_INIT</CODE>的调用,并且在结尾处包含一个对<CODE>AC_OUTPUT</CODE>的调用(参见<A 
href="http://www.linuxforum.net/books/autoconf.html#SEC10">创建输出文件</A>)。此外,有些宏要求其他的宏在它们之前被调用,这是因为它们通过检查某些变量在前面设定的值以决定作些什么。这些宏在独立的说明中给出(参见<A 
href="http://www.linuxforum.net/books/autoconf.html#SEC21">现有的测试</A>),而且如果没有按照顺序调用宏,在生成<CODE>configure</CODE>时会向你发出警告。 
</P>
<P>为了提高一致性,下面是调用Autoconf宏的推荐顺序。通常,在本列表中靠后的项目依赖于表中靠前的项目。例如,库函数可能受到typedefs和库的影响。 
</P><PRE><CODE>AC_INIT(<VAR>file</VAR>)</CODE>
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
<CODE>AC_OUTPUT([<VAR>file...</VAR>])</CODE>
</PRE>
<P>最好让每个宏调用在<TT>`configure.in'</TT>中占据单独的一行。大部分宏并不添加额外的新行;它们依赖于在宏调用之后的新行以结束命令。这种方法使得生成的<CODE>configure</CODE>脚本在不必添加大量的空行的情况下比较容易阅读。在宏调用的同一行中设置shell变量通常是安全的,这是因为shell允许出现没有用新行间隔的赋值。 
</P>
<P>在调用带参数的宏的时候,在宏名和左括号之间不能出现任何空格。如果参数被<CODE>m4</CODE> 
引用字符<SAMP>`['</SAMP>和<SAMP>`]'</SAMP>所包含,参数就可以多于一行。如果你有一个长行,比如说一个文件名列表,你通常可以在行的结尾使用反斜线以便在逻辑上把它与下一行进行连接(这是由shell实现的,Autoconf对此没有进行任何特殊的处理)。 
</P>
<P>有些宏处理两种情况:如果满足了某个给定的条件就做什么,如果没有满足某个给定的条件就做什么。在有些地方,你可能希望在条件为真的情况下作些事,在为假时什么也不作。反之亦然。为了忽略为真的情况,把空值作为参数<VAR>action-if-found</VAR>传递给宏。为了忽略为假的情况,可以忽略包括前面的逗号在内的宏的参数<VAR>action-if-not-found</VAR>。 
</P>
<P>你可以在文件<TT>`configure.in'</TT>中添加注释。注释以<CODE>m4</CODE>预定义宏<CODE>dnl</CODE> 
开头,该宏丢弃在下一个新行之前的所有文本。这些注释并不在生成的<CODE>configure</CODE>脚本中出现。例如,把下面给出的行作为文件<TT>`configure.in'</TT>的开头是有好处的: 
</P><PRE>dnl Process this file with autoconf to produce a configure script.
</PRE>
<H2><A href="http://www.linuxforum.net/books/autoconf.html#TOC4" 
name=SEC4>用<CODE>autoscan</CODE>创建<TT>`configure.in'</TT></A></H2>
<P>程序<CODE>autoscan</CODE>可以帮助你为软件包创建<TT>`configure.in'</TT>文件。如果在命令行中给出了目录, 
<CODE>autoscan</CODE>就在给定目录及其子目录树中检查源文件,如果没有给出目录,就在当前目录及其子目录树中进行检查。它搜索源文件以寻找一般的移植性问题并创建一个文件<TT>`configure.scan'</TT>,该文件就是软件包的<TT>`configure.in'</TT>预备版本。 
</P>
<P>在把<TT>`configure.scan'</TT>改名为<TT>`configure.in'</TT>之前,你应该手工地检查它;它可能需要一些调整。 
<CODE>autoscan</CODE>偶尔会按照相对于其他宏的错误的顺序输出宏,为此<CODE>autoconf</CODE>将给出警告;你需要手工地移动这些宏。还有,如果你希望包使用一个配置头文件,你必须添加一个对<CODE>AC_CONFIG_HEADER</CODE>的调用。(参见<A 
href="http://www.linuxforum.net/books/autoconf.html#SEC15">配置头文件</A>)。可能你还必须在你的程序中修改或者添加一些<CODE>#if</CODE> 
指令以使得程序可以与Autoconf合作。(关于有助于该工作的程序的详情,参见 <A 
href="http://www.linuxforum.net/books/autoconf.html#SEC5">用<CODE>ifnames</CODE>列举条件</A>)。 
</P>
<P><CODE>autoscan</CODE>使用一些数据文件,它们是随发布的Autoconf宏文件一起安装的,以便当它在包中的源文件中发现某些特殊符号时决定输出那些宏。这些文件都具有相同的格式。每一个都是由符号、空白和在符号出现时应该输出的Autoconf 
宏。以<SAMP>`#'</SAMP>开头的行是注释。 </P>
<P>只有在你安装了Perl的情况下才安装<CODE>autoscan</CODE>。 <CODE>autoscan</CODE>接受如下选项: </P>
<DL compact>
  <DT><CODE>--help</CODE> 
  <DD>打印命令行选项的概述并且退出。 
  <DT><CODE>--macrodir=<VAR>dir</VAR></CODE> 
  <DD><A 
  name=IDX1></A>在目录<VAR>dir</VAR>中,而不是在缺省安装目录中寻找数据文件。你还可以把环境变量<CODE>AC_MACRODIR</CODE>设置成一个目录;本选项将覆盖该环境变量。 

  <DT><CODE>--verbose</CODE> 
  <DD>打印它检查的文件名称以及在这些文件中发现的可能感兴趣的符号。它的输出可能很冗长。 
  <DT><CODE>--version</CODE> 
  <DD>打印Autoconf的版本号并且退出。 </DD></DL>
<H2><A href="http://www.linuxforum.net/books/autoconf.html#TOC5" 
name=SEC5>用<CODE>ifnames</CODE>列举条件</A></H2>
<P>在为一个软件包编写<TT>`configure.in'</TT>时,<CODE>ifnames</CODE>可以提供一些帮助。它打印出包已经在C预处理条件中使用的标识符。如果包已经被设置得具备了某些可移植性,该程序可以帮助你找到<CODE>configure</CODE>所需要进行的检查。它可能有助于补足由<CODE>autoscan</CODE>生成的<TT>`configure.in'</TT>中的某些缺陷。(参见<A 
href="http://www.linuxforum.net/books/autoconf.html#SEC4">用<CODE>autoscan</CODE>创建<TT>`configure.in'</TT></A>)。 
</P>
<P><CODE>ifnames</CODE>扫描所有在命令行中给出的C源代码文件(如果没有给出,就扫描标准输入)并且把排序后的、由所有出现在这些文件中的<CODE>#if</CODE>、<CODE>#elif</CODE>、<CODE>#ifdef</CODE>或者<CODE>#ifndef</CODE> 
命令中的标识符列表输出到标准输出中。它为每个标识符输出单独的一行,行中标识符之后是一个由空格分隔的、使用了该标识符的文件名列表。 </P>
<P><CODE>ifnames</CODE>接受如下选项: </P>
<DL compact>
  <DT><CODE>--help</CODE> 
  <DD>
  <DT><CODE>-h</CODE> 
  <DD>打印命令行选项的概述并且退出。 
  <DT><CODE>--macrodir=<VAR>dir</VAR></CODE> 
  <DD>
  <DT><CODE>-m <VAR>dir</VAR></CODE> 
  <DD><A 
  name=IDX2></A>在目录<VAR>dir</VAR>中,而不是缺省安装目录中寻找Autoconf宏文件。仅仅被用于获取版本号。你还可以把环境变量<CODE>AC_MACRODIR</CODE>设置成一个目录;本选项将覆盖该环境变量。 

  <DT><CODE>--version</CODE> 
  <DD>打印Autoconf的版本号并且退出。 </DD></DL>
<H2><A href="http://www.linuxforum.net/books/autoconf.html#TOC6" 
name=SEC6>用<CODE>autoconf</CODE>创建<CODE>configure</CODE></A></H2>
<P>为了从<TT>`configure.in'</TT>生成<CODE>configure</CODE>,不带参数地运行程序<CODE>autoconf</CODE>。 
<CODE>autoconf</CODE>用使用Autoconf宏的<CODE>m4</CODE>宏处理器处理<TT>`configure.in'</TT>。如果你为<CODE>autoconf</CODE>提供了参数,它读入给出的文件而不是<TT>`configure.in'</TT>并且把配置脚本输出到标准输出而不是<CODE>configure</CODE>。如果你给<CODE>autoconf</CODE>以参数<SAMP>`-'</SAMP>,它将从标准输入,而不是<TT>`configure.in'</TT>中读取并且把配置脚本输出到标准输出。 
</P>
<P>Autoconf宏在几个文件中定义。在这些文件中,有些是与Autconf一同发布的;<CODE>autoconf</CODE>首先读入它们。而后它在包含了发布的Autoconf宏文件的目录中寻找可能出现的文件<TT>`acsite.m4'</TT>,并且在当前目录中寻找可能出现的文件<TT>`aclocal.m4'</TT>。这些文件可以包含你的站点的或者包自带的Autoconf宏定义(详情请参见 
<A 
href="http://www.linuxforum.net/books/autoconf.html#SEC59">编写宏</A>)。如果宏在多于一个由<CODE>autoconf</CODE>读入了的文件中被定义,那么后面的定义将覆盖前面的定义。 
</P>
<P><CODE>autoconf</CODE>接受如下参数: </P>
<DL compact>
  <DT><CODE>--help</CODE> 
  <DD>
  <DT><CODE>-h</CODE> 
  <DD>输出命令行选项的概述并且退出。 
  <DT><CODE>--localdir=<VAR>dir</VAR></CODE> 
  <DD>
  <DT><CODE>-l <VAR>dir</VAR></CODE> 
  <DD>在目录<VAR>dir</VAR>中,而不是当前目录中寻找包文件<TT>`aclocal.m4'</TT>。 
  <DT><CODE>--macrodir=<VAR>dir</VAR></CODE> 
  <DD>
  <DT><CODE>-m <VAR>dir</VAR></CODE> 
  <DD><A 
  name=IDX3></A>在目录<VAR>dir</VAR>中寻找安装的宏文件。你还可以把环境变量<CODE>AC_MACRODIR</CODE>设置成一个目录;本选项将覆盖该环境变量。 

  <DT><CODE>--version</CODE> 
  <DD>打印Autoconf的版本号并且退出。 </DD></DL>
<H2><A href="http://www.linuxforum.net/books/autoconf.html#TOC7" 
name=SEC7>用<CODE>autoreconf</CODE>更新<CODE>configure</CODE>脚本</A></H2>
<P>如果你有大量由Autoconf生成的<CODE>configure</CODE>脚本,程序<CODE>autoreconf</CODE>可以保留你的一些工作。它重复地运行<CODE>autoconf</CODE>(在适当的情况下还运行<CODE>autoheader</CODE>)以重新创建以当前目录为根的目录树的Autoconf 
<CODE>configure</CODE>脚本和配置头文件。在缺省情况下,它只重新创建那些比对应的 
<TT>`configure.in'</TT>或者(如果出现)<TT>`aclocal.m4'</TT>要旧的文件。由于在文件没有被改变的情况下, 
<CODE>autoheader</CODE>并不改变它的输出文件的时间标记(timestamp)。这是为了使工作量最小化,修改时间标记是不必要的。如果你安装了新版本的Autoconf,你可以以选项<SAMP>`--force'</SAMP>调用<CODE>autoreconf</CODE>而重新创建 
<EM>所有</EM>的文件。 </P>
<P>如果你在调用<CODE>autoreconf</CODE>时给出选项<SAMP>`--macrodir=<VAR>dir</VAR>'</SAMP>或者 
<SAMP>`--localdir=<VAR>dir</VAR>'</SAMP>,它将把它们传递给<CODE>autoconf</CODE>和<CODE>autoheader</CODE> 
(相对路径将被正确地调整)。 </P>
<P>在同一个目录树中,<CODE>autoreconf</CODE>不支持两个目录作为同一个大包的一部分(共享<TT>`aclocal.m4'</TT>和 
<TT>`acconfig.h'</TT>),也不支持每个目录都是独立包(每个目录都有它们自己的<TT>`aclocal.m4'</TT>和 
<TT>`acconfig.h'</TT>)。如果你使用了<SAMP>`--localdir'</SAMP>,它假定所有的目录都是同一个包的一部分。如果你没有使用 
<SAMP>`--localdir'</SAMP>,它假定每个目录都是一个独立的包,这条限制在将来可能被取消。 </P>
<P>关于在<CODE>configure</CODE>脚本的源文件发生变化的情况下自动地重新创建它们的<TT>`Makefile'</TT>规则的细节,参见<A 
href="http://www.linuxforum.net/books/autoconf.html#SEC14">自动地重新创建</A>。这种方法正确地处理了配置头文件模板的时间标记,但并不传递<SAMP>`--macrodir=<VAR>dir</VAR>'</SAMP>或者<SAMP>`--localdir=<VAR>dir</VAR>'</SAMP>。 
</P>
<P><CODE>autoreconf</CODE>接受如下选项: </P>
<DL compact>
  <DT><CODE>--help</CODE> 
  <DD>
  <DT><CODE>-h</CODE> 
  <DD>打印命令行选项的概述并且退出。 
  <DT><CODE>--force</CODE> 
  <DD>
  <DT><CODE>-f</CODE> 
  <DD>即使在<TT>`configure'</TT>脚本和配置头文件比它们的输入文件(<TT>`configure.in'</TT>,如果出现了<TT>`aclocal.m4'</TT>,也包括它)更新的时候,也要重新创建它们。 

  <DT><CODE>--localdir=<VAR>dir</VAR></CODE> 
  <DD>
  <DT><CODE>-l <VAR>dir</VAR></CODE> 
  <DD>让<CODE>autoconf</CODE>和<CODE>autoheader</CODE>在目录<VAR>dir</VAR>中,而不是在每个包含<TT>`configure.in'</TT> 
  的目录中寻找包文件<TT>`aclocal.m4'</TT>和(仅指<CODE>autoheader</CODE>)<TT>`acconfig.h'</TT> 
  (但不包括<TT>`<VAR>file</VAR>.top'</TT>和<TT>`<VAR>file</VAR>.bot'</TT>)。 
  <DT><CODE>--macrodir=<VAR>dir</VAR></CODE> 
  <DD>
  <DT><CODE>-m <VAR>dir</VAR></CODE> 
  <DD><A name=IDX4></A>在目录<VAR>dir</VAR>中,而不是缺省安装目录中寻找Autoconf宏文件。你还可以把环境变量 
  <CODE>AC_MACRODIR</CODE>设置成一个目录;本选项将覆盖该环境变量。 
  <DT><CODE>--verbose</CODE> 
  <DD>打印<CODE>autoreconf</CODE>运行<CODE>autoconf</CODE>(如果适当,还有<CODE>autoheader</CODE>)的每个目录的目录名。 

  <DT><CODE>--version</CODE> 
  <DD>打印Autoconf的版本号并且退出。 </DD></DL>
<H1><A href="http://www.linuxforum.net/books/autoconf.html#TOC8" 
name=SEC8>初始化和输出文件</A></H1>
<P>Autoconf生成的<CODE>configure</CODE>脚本需要一些关于如何进行初始化,诸如如何寻找包的源文件,的信息;以及如何生成输出文件的信息。本节叙述如何进行初始化和创建输出文件。 
</P>
<H2><A href="http://www.linuxforum.net/books/autoconf.html#TOC9" 
name=SEC9>寻找<CODE>configure</CODE>的输入文件</A></H2>
<P>所有<CODE>configure</CODE>脚本在作任何其他事情之前都必须调用<CODE>AC_INIT</CODE>。此外唯一必须调用的宏是 
<CODE>AC_OUTPUT</CODE>(参见<A 
href="http://www.linuxforum.net/books/autoconf.html#SEC10">创建输出文件</A>)。 </P>
<P>
<DL>
  <DT><U>宏:</U> <B>AC_INIT</B> <I>(<VAR>unique-file-in-source-dir</VAR>)</I> 
  <DD><A name=IDX5></A><A 
  name=IDX6></A>处理所有命令行参数并且寻找源代码目录。<VAR>unique-file-in-source-dir</VAR>是一些在包的源代码目录中文件; 
  <CODE>configure</CODE>在目录中检查这些文件是否存在以确定该目录是否包含源代码。人们可能偶尔会用<SAMP>`--srcdir'</SAMP>给出错误的目录;这是一种安全性检查。详情请参见<A 
  href="http://www.linuxforum.net/books/autoconf.html#SEC81">运行<CODE>configure</CODE>脚本</A>。 
  </DD></DL>
<P></P>
<P>对于需要手工配置或者使用<CODE>install</CODE>程序的包来说,虽然在缺省源代码位置在大部分情况下看起来是正确的,包还是可能需要通过调用<CODE>AC_CONFIG_AUX_DIR</CODE>来告诉 
<CODE>configure</CODE>到那里去寻找一些其他的shell脚本。 </P>
<P>
<DL>
  <DT><U>宏:</U> <B>AC_CONFIG_AUX_DIR</B> <I>(<VAR>dir</VAR>)</I> 
  <DD><A name=IDX7></A><A 
  name=IDX8></A>在目录<VAR>dir</VAR>中使用<TT>`install-sh'</TT>、<TT>`config.sub'</TT>、<TT>`config.guess'</TT>和 
  Cygnus 
  <CODE>configure</CODE>配置脚本。它们是配置中使用的辅助文件。<VAR>dir</VAR>既可以是绝对路径,也可以是相对于<TT>`<VAR>srcdir</VAR>'</TT>的相对路径。缺省值是在<TT>`<VAR>srcdir</VAR>'</TT>或者 
  <TT>`<VAR>srcdir</VAR>/..'</TT>或者<TT>`<VAR>srcdir</VAR>/../..'</TT>中首先找到<TT>`install-sh'</TT> 
  的目录。不对其他文件进行检查,以便使<CODE>AC_PROG_INSTALL</CODE>不会自动地发布其他辅助文件。它还要检查<TT>`install.sh'</TT>,但因为有些<CODE>make</CODE>程序包含了在没有<TT>`Makefile'</TT>的情况下从<TT>`install.sh'</TT>中创建<TT>`install'</TT>的规则,所以那个名字过时了。 
  </DD></DL>
<P></P>
<H2><A href="http://www.linuxforum.net/books/autoconf.html#TOC10" 
name=SEC10>创建输出文件</A></H2>
<P>每个Autoconf生成的<CODE>configure</CODE>脚本必须以对<CODE>AC_OUTPUT</CODE>的调用结尾。它是一个创建作为配置结果的<TT>`Makefile'</TT>以及其他一些可能的文件的宏。此外唯一必须调用的宏是<CODE>AC_INIT</CODE> 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -