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

📄 autobook_207.html

📁 Autoconf使用手册
💻 HTML
字号:
<HTML><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><!-- Created on September, 12  2004 by texi2html 1.64 --><!-- Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)            Karl Berry  <karl@freefriends.org>            Olaf Bachmann <obachman@mathematik.uni-kl.de>            and many others.Maintained by: Olaf Bachmann <obachman@mathematik.uni-kl.de>Send bugs and suggestions to <texi2html@mathematik.uni-kl.de> --><HEAD><TITLE>Autoconf, Automake, and Libtool: Debugging with M4</TITLE><META NAME="description" CONTENT="Autoconf, Automake, and Libtool: Debugging with M4"><META NAME="keywords" CONTENT="Autoconf, Automake, and Libtool: Debugging with M4"><META NAME="resource-type" CONTENT="document"><META NAME="distribution" CONTENT="global"><META NAME="Generator" CONTENT="texi2html 1.64"><script language="Javascript"><!--    // Check the browser version.    function checkVersion() {      if (navigator.appVersion.charAt(0)>=3) return true;      if (navigator.appVersion.charAt(0)>=4) return true;      else return false;    }      if (checkVersion()) {             homeon = new Image();             homeon.src = "homeon.png";             homeoff = new Image();             homeoff.src = "home.png";             tocon = new Image();             tocon.src = "tocon.png";             tocoff = new Image();             tocoff.src = "toc.png";             indexon = new Image();             indexon.src = "indexon.png";             indexoff = new Image();             indexoff.src = "index.png";             helpon = new Image();             helpon.src = "helpon.png";             helpoff = new Image();             helpoff.src = "help.png";             backon = new Image();             backon.src = "backon.png";             backoff = new Image();             backoff.src = "back.png";             forwardon = new Image();             forwardon.src = "forwardon.png";             forwardoff = new Image();             forwardoff.src = "forward.png";             prevon = new Image();             prevon.src = "prevon.png";             prevoff = new Image();             prevoff.src = "prev.png";             nexton = new Image();             nexton.src = "nexton.png";             nextoff = new Image();             nextoff.src = "next.png";             upon = new Image();             upon.src = "upon.png";             upoff = new Image();             upoff.src = "up.png";         }     function img_act(imgName) {             if (checkVersion()) {             imgOn = eval(imgName + "on.src");             document [imgName].src = imgOn;             }     }     function img_inact(imgName) {             if (checkVersion()) {             imgOff = eval(imgName + "off.src");             document [imgName].src = imgOff;             }     }// --></SCRIPT></HEAD><BODY LANG="EN" BGCOLOR="#FFFFFF" TEXT="#000000" LINK="#6688AA" VLINK="#336688" ALINK="#808080"><A NAME="SEC207"></A><TABLE BORDER=0 CELLPADDING=0 CELLSPACING=10><TR VALIGN="TOP"><TD ALIGN="MIDDLE" WIDTH=50 BGCOLOR="#e6e6e6"><TABLE CELLPADDING=1 CELLSPACING=1 BORDER=0><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_206.html#SEC206" onMouseover="img_act('prev')" onMouseout="img_inact('prev')"><IMG SRC="prev.png" BORDER="0" ALT="Back: Syntactic conventions" ALIGN="MIDDLE" NAME="prev"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_208.html#SEC208" onMouseover="img_act('next')" onMouseout="img_inact('next')"><IMG SRC="next.png" BORDER="0" ALT="Forward: Writing Portable Bourne Shell" ALIGN="MIDDLE" NAME="next"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"> &nbsp; <TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_191.html#SEC191" onMouseover="img_act('back')" onMouseout="img_inact('back')"><IMG SRC="back.png" BORDER="0" ALT="FastBack: M4" ALIGN="MIDDLE" NAME="back"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_205.html#SEC205" onMouseover="img_act('up')" onMouseout="img_inact('up')"><IMG SRC="up.png" BORDER="0" ALT="Up: Writing macros within the GNU Autotools framework" ALIGN="MIDDLE" NAME="up"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_208.html#SEC208" onMouseover="img_act('forward')" onMouseout="img_inact('forward')"><IMG SRC="forward.png" BORDER="0" ALT="FastForward: Writing Portable Bourne Shell" ALIGN="MIDDLE" NAME="forward"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook.html#SEC_Top" onMouseover="img_act('home')" onMouseout="img_inact('home')"><IMG SRC="home.png" BORDER="0" ALT="Top: Autoconf, Automake, and Libtool" ALIGN="MIDDLE" NAME="home"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_toc.html#SEC_Contents" onMouseover="img_act('toc')" onMouseout="img_inact('toc')"><IMG SRC="toc.png" BORDER="0" ALT="Contents: Table of Contents" ALIGN="MIDDLE" NAME="toc"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_285.html#SEC285" onMouseover="img_act('index')" onMouseout="img_inact('index')"><IMG SRC="index.png" BORDER="0" ALT="Index: Index" ALIGN="MIDDLE" NAME="index"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_abt.html#SEC_About" onMouseover="img_act('help')" onMouseout="img_inact('help')"><IMG SRC="help.png" BORDER="0" ALT="About: About this document" ALIGN="MIDDLE" NAME="help"></A></TD></TR></TABLE></TD><TD ALIGN="LEFT"><H3> 21.5.2 Debugging with M4 </H3><!--docid::SEC207::--><P>After writing a new macro or a <TT>`configure.in'</TT> template, thegenerated <TT>`configure'</TT> script may not contain what you expect.Frequently this is due to a problem in quoting (see section <A HREF="autobook_197.html#SEC197">21.3.3 Quoting</A>), butthe interactions between macros can be complex.  When you consider thatthe arguments to GNU Autotools macros are often shell scripts, things canget rather hairy.  A number of techniques exist for helping you to debugthese kinds of problems.</P><P>Expansion problems due to over-quoting and under-quoting can bedifficult to pinpoint.  Autoconf half-heartedly tries to detect thiscondition by scanning the generated <TT>`configure'</TT> script for anyremaining invocations of the <CODE>AC_</CODE> and <CODE>AM_</CODE> families ofmacros.  However, this only works for the <CODE>AC_</CODE> and <CODE>AM_</CODE>macros and not for third party macros.</P><P>M4 provides a comprehensive facility for tracing expansions.  This makesit possible to see how macro arguments are expanded and how a macro isfinally expanded.  Often, this can be half the battle in discovering ifthe macro definition or the invocation is at fault.  Autoconf 2.15 willinclude this tracing mechanism.  To trace the generation of<TT>`configure'</TT>, Autoconf can be invoked like so:</P><P><TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>$ autoconf --trace=AC_PROG_CC</FONT></pre></td></tr></table></P><P>Autoconf provides fine control over which macros are traced and theformat of the trace output.  You should refer to the Autoconf manual forfurther details.</P><P>GNU <CODE>m4</CODE> also provides a debugging mode that can be helpful indiscovering problems such as infinite recursion.  This mode is activatedwith the <SAMP>`-d'</SAMP> option.  In order to pass options to <CODE>m4</CODE>,invoke Autoconf like so:</P><P><TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>$ M4='m4 -dV' autoconf</FONT></pre></td></tr></table></P><P>Another situation that can arise is the presence of shell syntax errorsin the generated <TT>`configure'</TT> script.  These errors are usuallyobvious, as the shell will abort <TT>`configure'</TT> when the syntax erroris encountered.  The task of then locating the troublesome shell code inthe input files can be potentially quite difficult.  If the erroneousshell code appears in <TT>`configure.in'</TT>, it should be easy tospot--presumably because you wrote it recently!  If the code is importedfrom a third party macro, though, it may only be present because youinvoked that macro.  A trick to help locate these kinds of errors is toplace some magic text (<CODE>__MAGIC__</CODE>) throughout <TT>`configure.in'</TT>:</P><P><TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>AC_INITAC_PROG_CC__MAGIC__MY_SUSPECT_MACRO__MAGIC__AC_OUTPUT(Makefile)</FONT></pre></td></tr></table></P><P>After <CODE>autoconf</CODE> has generated <TT>`configure'</TT>, you can searchthrough it for the magic text to determine the extremities of thesuspect macro.  If your erroneous code appears within the magic textmarkers, you've found the culprit!  Don't be afraid to hack up<TT>`configure'</TT>.  It can easily be regenerated.</P><P>Finally, due to an error on your part, <CODE>m4</CODE> may generate a<TT>`configure'</TT> script that contains semantic errors.  Something assimple as inverted logic may lead to a nonsense test result:</P><P><TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>checking for /etc/passwd... no</FONT></pre></td></tr></table></P><P>Semantic errors of this kind are usually easy to solve once you can spotthem.  A fast and simple way of tracing the shell execution is to usethe shell's <SAMP>`-x'</SAMP> and <SAMP>`-v'</SAMP> options to turn on its owntracing.  This can be done by explicitly placing the required <CODE>set</CODE>commands into <TT>`configure.in'</TT>:</P><P><TABLE><tr><td>&nbsp;</td><td class=smallexample><FONT SIZE=-1><pre>AC_INITAC_PROG_CCset -x -vMY_BROKEN_MACROset +x +vAC_OUTPUT(Makefile)</FONT></pre></td></tr></table></P><P>This kind of tracing is invaluable in debugging shell code containingsemantic errors.</P><P><A NAME="Writing Portable Bourne Shell"></A></TR></TABLE><BR>  <FONT SIZE="-1">This document was generatedby <I>Gary V. Vaughan</I> on <I>September, 12  2004</I>using <A HREF="http://www.mathematik.uni-kl.de/~obachman/Texi2html"><I>texi2html</I></A></BODY></HTML>

⌨️ 快捷键说明

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