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

📄 autobook_62.html

📁 Autoconf使用手册
💻 HTML
📖 第 1 页 / 共 2 页
字号:
<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: Beginnings of a configure.in for Small Project</TITLE><META NAME="description" CONTENT="Autoconf, Automake, and Libtool: Beginnings of a configure.in for Small Project"><META NAME="keywords" CONTENT="Autoconf, Automake, and Libtool: Beginnings of a configure.in for Small Project"><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="SEC62"></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_61.html#SEC61" onMouseover="img_act('prev')" onMouseout="img_inact('prev')"><IMG SRC="prev.png" BORDER="0" ALT="Back: syntax.c &#38; syntax.h" ALIGN="MIDDLE" NAME="prev"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_63.html#SEC63" onMouseover="img_act('next')" onMouseout="img_inact('next')"><IMG SRC="next.png" BORDER="0" ALT="Forward: A Sample Shell Application" 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_63.html#SEC63" onMouseover="img_act('back')" onMouseout="img_inact('back')"><IMG SRC="back.png" BORDER="0" ALT="FastBack: A Sample Shell Application" ALIGN="MIDDLE" NAME="back"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_52.html#SEC52" onMouseover="img_act('up')" onMouseout="img_inact('up')"><IMG SRC="up.png" BORDER="0" ALT="Up: A Simple Shell Builders Library" ALIGN="MIDDLE" NAME="up"></A></TD></TR><TR VALIGN="TOP" ALIGN="LEFT"><TD VALIGN="MIDDLE" ALIGN="LEFT"><A HREF="autobook_63.html#SEC63" onMouseover="img_act('forward')" onMouseout="img_inact('forward')"><IMG SRC="forward.png" BORDER="0" ALT="FastForward: A Sample Shell Application" 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> 9.2.3 Beginnings of a <TT>`configure.in'</TT> </H3><!--docid::SEC62::--><P>Now that I have some code, I can run <CODE>autoscan</CODE> to generate apreliminary<BR> <TT>`configure.in'</TT>.  <CODE>autoscan</CODE> will examine all ofthe sources in the current directory tree looking for common points ofnon-portability, adding macros suitable for detecting the discoveredproblems.  <CODE>autoscan</CODE> generates the following in<TT>`configure.scan'</TT>:</P><P><TABLE width=100%><tr><td>&nbsp;</td><td class=example bgcolor=#6688aa><br><pre># Process this file with autoconf to produce a configure script.AC_INIT(sic/eval.h)# Checks for programs.# Checks for libraries.# Checks for header files.AC_HEADER_STDCAC_CHECK_HEADERS(strings.h unistd.h)# Checks for typedefs, structures, and compiler characteristics.AC_C_CONSTAC_TYPE_SIZE_T# Checks for library functions.AC_FUNC_VPRINTFAC_CHECK_FUNCS(strerror)AC_OUTPUT()</pre></td></tr></table></P><P><BLOCKQUOTE>Since the generated <TT>`configure.scan'</TT> does not overwrite yourproject's <TT>`configure.in'</TT>, it is a good idea to run<CODE>autoscan</CODE> periodically even in established project sourcetrees, and compare the two files.  Sometimes <CODE>autoscan</CODE> willfind some portability issue you have overlooked, or weren't aware of.</BLOCKQUOTE><P>Looking through the documentation for the macros in this<TT>`configure.scan'</TT>,<BR> <CODE>AC_C_CONST</CODE> and <CODE>AC_TYPE_SIZE_T</CODE> willtake care of themselves (provided I ensure that <TT>`config.h'</TT> isincluded into every source file), and <CODE>AC_HEADER_STDC</CODE> and<CODE>AC_CHECK_HEADERS(unistd.h)</CODE> are already taken care of in<TT>`common.h'</TT>.</P><P><CODE>autoscan</CODE> is no silver bullet!  Even here in thissimple example, I need to manually add macros to check for the presenceof <TT>`errno.h'</TT>:</P><P><TABLE width=100%><tr><td>&nbsp;</td><td class=example bgcolor=#6688aa><br><pre>AC_CHECK_HEADERS(errno.h strings.h unistd.h)</pre></td></tr></table></P><P>I also need to manually add the Autoconf macro for generating<TT>`config.h'</TT>; a macro to initialise <CODE>automake</CODE> support; and amacro to check for the presence of <CODE>ranlib</CODE>.  These should goclose to the start of <TT>`configure.in'</TT>:</P><P><TABLE width=100%><tr><td>&nbsp;</td><td class=example bgcolor=#6688aa><br><pre>...AC_CONFIG_HEADER(config.h)AM_INIT_AUTOMAKE(sic, 0.5)AC_PROG_CCAC_PROG_RANLIB...</pre></td></tr></table></P><P>Recall that the use of <CODE>bzero</CODE> in <A HREF="autobook_55.html#SEC55">9.2.1.2 Memory Management</A> is notentirely portable.  The trick is to provide a <CODE>bzero</CODE> work-alike,depending on which functions Autoconf detects, by adding the followingtowards the end of <TT>`configure.in'</TT>:</P><P><TABLE width=100%><tr><td>&nbsp;</td><td class=example bgcolor=#6688aa><br><pre>...AC_CHECK_FUNCS(bzero memset, break)...</pre></td></tr></table></P><P>With the addition of this small snippet of code to <TT>`common.h'</TT>, Ican now make use of <CODE>bzero</CODE> even when linking with a C librarythat has no implementation of its own:</P><P><TABLE width=100%><tr><td>&nbsp;</td><td class=example bgcolor=#6688aa><br><pre></pre></td></tr></table></P><P>An interesting macro suggested by <CODE>autoscan</CODE> is<CODE>AC_CHECK_FUNCS(strerror)</CODE>.  This tells me that I need to provide areplacement implementation of <CODE>strerror</CODE> for the benefit ofarchitectures which don't have it in their system libraries.  This isresolved by providing a file with a fallback implementation for thenamed function, and creating a library from it and any others that<TT>`configure'</TT> discovers to be lacking from the system library on thetarget host.</P><P>You will recall that <TT>`configure'</TT> is the shell script the end userof this package will run on their machine to test that it has all thefeatures the package wants to use.  The library that is created will

⌨️ 快捷键说明

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