📄 autoconf.htm
字号:
<P></P>
<P>
<DL>
<DT><U>变量:</U> <B>FFLAGS</B>
<DD><A name=IDX55></A><A name=IDX56></A>为Fortran
77编译器提供的调试和优化选项。如果在运行<CODE>configure</CODE>时,在环境中没有设置本变量,那么它的缺省值就在你调用<CODE>AC_PROG_F77</CODE>时被设置(如果你没有调用<CODE>AC_PROG_F77</CODE>,它就为空)。
<CODE>configure</CODE>在编译程序以测试Fortran 77的特征时,使用本变量。 </DD></DL>
<P></P>
<P>
<DL>
<DT><U>变量:</U> <B>DEFS</B>
<DD><A name=IDX57></A><A
name=IDX58></A>传递给C编译器的<SAMP>`-D'</SAMP>选项。如果调用了<CODE>AC_CONFIG_HEADER</CODE>,<CODE>configure</CODE>就用
<SAMP>`-DHAVE_CONFIG_H'</SAMP>代替<SAMP>`@DEFS@'</SAMP>(参见<A
href="http://www.linuxforum.net/books/autoconf.html#SEC15">配置头文件</A>)。在<CODE>configure</CODE>进行它的测试时,本变量没有被定义,只有在创建输出文件时候才定义。关于如何检查从前的测试结果,请参见<A
href="http://www.linuxforum.net/books/autoconf.html#SEC54">设定输出变量</A>。
</DD></DL>
<P></P>
<P>
<DL>
<DT><U>变量:</U> <B>LDFLAGS</B>
<DD><A name=IDX59></A><A
name=IDX60></A>为连接器提供的Stripping(<SAMP>`-s'</SAMP>)选项和其他各种选项。如果在运行<CODE>configure</CODE>时,在环境中没有设置本变量,它的缺省值就是空。
<CODE>configure</CODE>在连接程序以测试C的特征时使用本变量。 </DD></DL>
<P></P>
<P>
<DL>
<DT><U>变量:</U> <B>LIBS</B>
<DD><A name=IDX61></A><A
name=IDX62></A>传递给连接器的<SAMP>`-l'</SAMP>和<SAMP>`-L'</SAMP>选项。 </DD></DL>
<P></P>
<H3><A href="http://www.linuxforum.net/books/autoconf.html#TOC13"
name=SEC13>创建目录</A></H3>
<P>你可以支持从一个软件包的一份源代码拷贝中为多种结构同时进行编译的功能。为每种结构生成的目标文件都在它们自己的目录中储存。 </P>
<P>为了支持这个功能,<CODE>make</CODE>用变量<CODE>VPATH</CODE>来寻找储存在源代码目录中的文件。 GNU
<CODE>make</CODE>和其他大部分近来的<CODE>make</CODE>程序都可以这样做。老版本的<CODE>make</CODE>
程序不支持<CODE>VPATH</CODE>;在使用它们的时候,源代码必须与目标代码处于同一个目录。 </P>
<P>为了支持<CODE>VPATH</CODE>,每个<TT>`Makefile.in'</TT>文件都应该包含下列两行: </P><PRE>srcdir = @srcdir@
VPATH = @srcdir@
</PRE>
<P>不要把<CODE>VPATH</CODE>设置成其他变量的值,比如说<SAMP>`VPATH =
$(srcdir)'</SAMP>,这是因为某些版本的<CODE>make</CODE>并不对<CODE>VPATH</CODE>的值进行变量替换。 </P>
<P>在<CODE>configure</CODE>生成<TT>`Makefile'</TT>的时候,它用正确的值对<CODE>srcdir</CODE>进行替换。
</P>
<P>除非在隐含规则中,不要使用<CODE>make</CODE>变量<CODE>$<</CODE>,它将被展开成到源代码目录的文件的路径(通过<CODE>VPATH</CODE>找到的)。(诸如<SAMP>`.c.o'</SAMP>的隐含规则用于说明如何从<TT>`.c'</TT>
文件创建<TT>`.o'</TT>文件)有些版本的<CODE>make</CODE>在隐含规则中不设置<CODE>$<</CODE>;它们被展开成空值。
</P>
<P><TT>`Makefile'</TT>命令行总是应该通过使用前缀<SAMP>`$(srcdir)/'</SAMP>来引用源代码文件。例如: </P><PRE>time.info: time.texinfo
$(MAKEINFO) $(srcdir)/time.texinfo
</PRE>
<H3><A href="http://www.linuxforum.net/books/autoconf.html#TOC14"
name=SEC14>自动地重新创建</A></H3>
<P>你可以在包的顶层目录中的<TT>`Makefile.in'</TT>文件中添加如下的规则,以使得在你更新了配置文件之后可以自动地更新配置信息。这个例子包括了所有可选的文件,例如<TT>`aclocal.m4'</TT>和那些与配置头文件有关的文件。从<TT>`Makefile.in'</TT>规则中忽略所有你的所不需要的文件。
</P>
<P>因为<CODE>VPATH</CODE>机制的限制,应该包含<SAMP>`${srcdir}/'</SAMP>前缀。 </P>
<P>在重新创建不改变<TT>`config.h.in'</TT>和<TT>`config.h'</TT>的内容的情况下,就不会改变这两个文件的时间标记,因此需要<TT>`stamp-'</TT>文件。这个特征避免了不必要的重新编译工作。你应该把文件<TT>`stamp-h.in'</TT>
包含在你的包的发布中,以便<CODE>make</CODE>能够把<TT>`config.h.in'</TT>看作是更新了的文件。在一些老的BSD系统中,<CODE>touch</CODE>或者任何可能导致空文件的命令不会更改时间标记,所以使用诸如<CODE>echo</CODE>
之类的命令。 </P><PRE>${srcdir}/configure: configure.in aclocal.m4
cd ${srcdir} && autoconf
# autoheader might not change config.h.in, so touch a stamp file.
${srcdir}/config.h.in: stamp-h.in
${srcdir}/stamp-h.in: configure.in aclocal.m4 acconfig.h \
config.h.top config.h.bot
cd ${srcdir} && autoheader
echo timestamp > ${srcdir}/stamp-h.in
config.h: stamp-h
stamp-h: config.h.in config.status
./config.status
Makefile: Makefile.in config.status
./config.status
config.status: configure
./config.status --recheck
</PRE>
<P>此外,你应该把<SAMP>`echo timestamp >
stamp-h'</SAMP>作为<VAR>extra-cmds</VAR>参数传递给<CODE>AC_OUTPUT</CODE>,以便<TT>`config.status'</TT>能够确认<TT>`config.h'</TT>是更新了的。关于<CODE>AC_OUTPUT</CODE>的详情,请参见
<A href="http://www.linuxforum.net/books/autoconf.html#SEC10">创建输出文件</A>。 </P>
<P>关于处理与配置相关的依赖性问题的更多例子,请参见<A
href="http://www.linuxforum.net/books/autoconf.html#SEC82">重新创建一个配置</A>。 </P>
<H2><A href="http://www.linuxforum.net/books/autoconf.html#TOC15"
name=SEC15>配置头文件</A></H2>
<P>在包测试的C预处理器符号比较多的时候,用于把<SAMP>`-D'</SAMP>传递给编译器的命令行就会变得很长。这导致了两个问题。一个是通过观察寻找<CODE>make</CODE>输出中的错误变得困难了。更严重的是,命令行可能超过某些操作系统的长度限制。作为把<SAMP>`-D'</SAMP>选项传递给编译器的替代办法,<CODE>configure</CODE>
脚本可以创建一个包含了<SAMP>`#define'</SAMP>指令的C头文件。宏<CODE>AC_CONFIG_HEADER</CODE>
选择了这种输出。它应该在<CODE>AC_INIT</CODE>之后立即调用。 </P>
<P>包应该在引入其他任何头文件之前<SAMP>`#include'</SAMP>配置头文件,以防止出现声明中的不一致性(例如,配置头文件可能重定义了<CODE>const</CODE>)。使用<SAMP>`#include
<config.h>'</SAMP>
并且把选项<SAMP>`-I.'</SAMP>(或者是<SAMP>`-I..'</SAMP>;或者是任何包含<TT>`config.h'</TT>
的目录)传递给C编译器,而不是使用<SAMP>`#include
"config.h"'</SAMP>。按照这种方式,即使源代码自行进行配置(可能是创建发布版本),其他创建目录也可以在没有找到<TT>`config.h'</TT>的情况下,从源代码目录进行配置。
</P>
<P>
<DL>
<DT><U>宏:</U> <B>AC_CONFIG_HEADER</B> <I>(<VAR>header-to-create</VAR> ...)</I>
<DD><A name=IDX63></A><A name=IDX64></A><A
name=IDX65></A>使得<CODE>AC_OUTPUT</CODE>创建出现在以空格分隔的列表<VAR>header-to-create</VAR>中的文件,以包含C预处理器<CODE>#define</CODE>语句,并在生成的文件中用<SAMP>`-DHAVE_CONFIG_H'</SAMP>
,而不是用<CODE>DEFS</CODE>的值,替换<SAMP>`@DEFS@'</SAMP>。常用在<VAR>header-to-create</VAR>
中的文件名是<TT>`config.h'</TT>。
<P></P>
<P>如果<VAR>header-to-create</VAR>给出的文件已经存在并且它的内容和<CODE>AC_OUTPUT</CODE>将要生成的内容完全一致,这些文件就保持不变。这样做就使得对配置的某些修改不会导致对依赖于头文件的目标文件进行不必要的重新编译。
</P>
<P>通常输入文件被命名为<TT>`<VAR>header-to-create</VAR>.in'</TT>;然而,你可以通过在<VAR>header-to-create</VAR>
之后添加由冒号分隔的输入文件列表来覆盖原输入文件名。例: <PRE>AC_CONFIG_HEADER(defines.h:defines.hin)
AC_CONFIG_HEADER(defines.h:defs.pre:defines.h.in:defs.post)
</PRE>
<P>这样做使得你的文件名能够被MS-DOS所接受,或者可以把模板(boilerplate)添加到文件的开头和/或结尾。 </P></DD></DL>
<P></P>
<H3><A href="http://www.linuxforum.net/books/autoconf.html#TOC16"
name=SEC16>配置头文件模板</A></H3>
<P>你的发布版本应该包含一个如你所望的最终的头文件那样的模板文件,它包括注释、以及<CODE>#define</CODE>
语句的缺省值。例如,假如你的<TT>`configure.in'</TT>进行了下列调用: </P><PRE>AC_CONFIG_HEADER(conf.h)
AC_CHECK_HEADERS(unistd.h)
</PRE>
<P>那么你就应该在<TT>`conf.h.in'</TT>中包含下列代码。在含有<TT>`unistd.h'</TT>的系统中,<CODE>configure</CODE>应该把0改成1。在其他系统中,这一行将保持不变。
</P><PRE>/* Define as 1 if you have unistd.h. */
#define HAVE_UNISTD_H 0
</PRE>
<P>如果你的代码使用<CODE>#ifdef</CODE>而不是<CODE>#if</CODE>来测试配置选项,缺省值就可能是取消对一个变量的定义而不是把它定义成一个值。在含有<TT>`unistd.h'</TT>的系统中,<CODE>configure</CODE>将修改读入的第二行
<SAMP>`#define HAVE_UNISTD_H 1'</SAMP>。在其他的系统中,(在系统预定义了那个符号的情况下)
<CODE>configure</CODE>将以注释的方式排除这一行。 </P><PRE>/* Define if you have unistd.h. */
#undef HAVE_UNISTD_H
</PRE>
<H3><A href="http://www.linuxforum.net/books/autoconf.html#TOC17"
name=SEC17>用<CODE>autoheader</CODE>创建<TT>`config.h.in'</TT></A></H3>
<P>程序<CODE>autoheader</CODE>可以创建含有C的<SAMP>`#define'</SAMP>语句的模板文件以供<CODE>configure</CODE>使用。如果<TT>`configure.in'</TT>调用了<CODE>AC_CONFIG_HEADER(<VAR>file</VAR>)</CODE>,<CODE>autoheader</CODE>就创建
<TT>`<VAR>file</VAR>.in'</TT>;如果给出了多文件参数,就使用第一个文件。否则,<CODE>autoheader</CODE>就创建
<TT>`config.h.in'</TT>。 </P>
<P>如果你为<CODE>autoheader</CODE>提供一个参数,它就使用给出的文件而不是<TT>`configure.in'</TT>,并且把头文件输出到标准输出中去,而不是输出到<TT>`config.h.in'</TT>。如果你把<SAMP>`-'</SAMP>作为参数提供给<CODE>autoheader</CODE>
,它就从标准输入中,而不是从<TT>`configure.in'</TT>中读出,并且把头文件输出到标准输出中去。 </P>
<P><CODE>autoheader</CODE>扫描<TT>`configure.in'</TT>并且找出它可能要定义的C预处理器符号。它从一个名为
<TT>`acconfig.h'</TT>的文件中复制注释、<CODE>#define</CODE>和<CODE>#undef</CODE>语句,该文件与Autoconf一同发布并且一同安装。如果当前目录中含有<TT>`acconfig.h'</TT>文件,它也会使用这个文件。如果你用<CODE>AC_DEFINE</CODE>
定义了任何附加的符号,你必须在创建的那个<TT>`acconfig.h'</TT>文件中包含附加的符号。对于由
<CODE>AC_CHECK_HEADERS</CODE>、<CODE>AC_CHECK_FUNCS</CODE>、<CODE>AC_CHECK_SIZEOF</CODE>或者
<CODE>AC_CHECK_LIB</CODE>定义的符号,<CODE>autoheader</CODE>生成注释和<CODE>#undef</CODE>语句,而不是从一个文件中复制它们,这是因为可能的符号是无限的。
</P>
<P><CODE>autoheader</CODE>创建的文件包含了大部分<CODE>#define</CODE>和<CODE>#undef</CODE>语句,以及相关的注释。如果<TT>`./acconfig.h'</TT>包含了字符串<SAMP>`@TOP@'</SAMP>,<CODE>autoheader</CODE>就把在包含<SAMP>`@TOP@'</SAMP>
的行之前的所有行复制到它生成的文件的开头。相似地,如果<TT>`./acconfig.h'</TT>包含了字符串<SAMP>`@BOTTOM@'</SAMP>,
<CODE>autoheader</CODE>就把那一行之后的所有行复制到它生成的文件的末尾。这两个字符串的任何一个都可以被忽略,也可以被同时忽略。 </P>
<P>产生相同效果的另一种办法是在当前目录中创建文件<TT>`<VAR>file</VAR>.top'</TT>(通常是<TT>`config.h.top'</TT>)和/或文件<TT>`<VAR>file</VAR>.bot'</TT>。如果它们存在,<CODE>autoheader</CODE>就把它们分别复制到它的输出的开头和末尾。不鼓励使用它们是因为它们的文件名含有两个点,并因此不能在MS-DOS中储存;它们在目录中多创建了两个文件。但如果你给出选项<SAMP>`--localdir=<VAR>dir</VAR>'</SAMP>以使用在其他目录中的<TT>`acconfig.h'</TT>,它们就为你提供了一种把定制的模板(boilerplate)放入各个独立的<TT>`config.h.in'</TT>中的方式。
</P>
<P><CODE>autoheader</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>和<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=IDX66></A>在目录<VAR>dir</VAR>中寻找安装的宏文件和<TT>`acconfig.h'</TT>。你还可以把环境变量<CODE>AC_MACRODIR</CODE>
设置成一个目录;本选项将覆盖该环境变量。
<DT><CODE>--version</CODE>
<DD>打印Autoconf的版本号并且退出。 </DD></DL>
<H2><A href="http://www.linuxforum.net/books/autoconf.html#TOC18"
name=SEC18>在子目录中配置其它包</A></H2>
<P>在大多数情况下,调用<CODE>AC_OUTPUT</CODE>足以在子目录中生成<TT>`Makefile'</TT>。然而,控制了多于一个独立包的<CODE>configure</CODE>脚本可以使用<CODE>AC_CONFIG_SUBDIRS</CODE>来为每个子目录中的其他包运行
<CODE>configure</CODE>脚本。 </P>
<P>
<DL>
<DT><U>宏:</U> <B>AC_CONFIG_SUBDIRS</B> <I>(<VAR>dir</VAR> ...)</I>
<DD><A name=IDX67></A><A name=IDX68></A><A
name=IDX69></A>使得<CODE>AC_OUTPUT</CODE>在每个以空格分隔的列表中给出的子目录<VAR>dir</VAR>中运行<CODE>configure</CODE>。如果没有发现某个给出的<VAR>dir</VAR>,不会作为错误报告,所以一个<CODE>configure</CODE>脚本可以配置一个大的源代码树中出现的任何一个部分。如果在给出的<VAR>dir</VAR>中包含了<TT>`configure.in'</TT>,但没有包含
<CODE>configure</CODE>,就使用由<CODE>AC_CONFIG_AUXDIR</CODE>找到的Cygnus
<CODE>configure</CODE>脚本。
<P></P>
<P>用与本<CODE>configure</CODE>脚本完全相同的命令行参数调用子目录中的<CODE>configure</CODE>脚本,如果需要,会有较小的修改(例如,为缓冲文件或者源代码目录调整相对路径)。本宏还把输出变量<CODE>subdirs</CODE>设置成目录列表<SAMP>`<VAR>dir</VAR>...'</SAMP>。<TT>`Makefile'</TT>规则可以使用该变量以确定需要进入那些子目录。这个宏可以多次调用。
</P></DD></DL>
<P></P>
<H2><A href="htt
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -