zoukankan      html  css  js  c++  java
  • automake autoconf 学习笔记(转载)

    不知为什么,看英文资料总是记不住,看过就忘,还是记下来的好. 所以Linux的中文版无论对谁都是很重要的.

    通俗地说:
    automake 用于 Makefile.am ->Makefile.in
    autoconf 用于 configure.ac ->configure 

    configure 用于 Makfile.in -> Makefile

    注: configure.ac 以前也称 configuer.in,但和 Makefile.in 容易混淆.

    autoscan 是个很不错的工具,它自动检查当前目录(或者指定的目录)下的源代码,生成
    configure.scan 指出哪些功能是需要检测的. configure.scan 可以作为 configure.ac 的模板.附上 autoscan man page的第一段:
    Examine  source  files  in  the  directory  tree rooted at SRCDIR, or the 
    current directory if none is given.  Search the  source files for common 
    portability problems, check for incompleteness of `configure.ac',  and  create  a  file  `configure.scan' which is a preliminary `configure.ac' for that 
    package.

    automake  与 autoconf 的关系很紧密,理由也很简单, autoconf 生成的configure脚本部分功能是替换 Makefile.in 里的变量以生成 Makefile (按 autoconf 文档的说法是:实例化Makfile.in),configure 可以实例化任何文件,一般都是 .in 后缀的。

    以下是 SMTH_BBS 顶层目录里的 configure.ac 


    AC_INIT(smthbbs, 2.0dev, SYSOP@smth.org)
    AM_INIT_AUTOMAKE([foreign dist-bzip2])  //configure.ac里用了 automake 的宏
                                         //automake 根据 Makfile.am 生成 Makefile.in
                                         //要读于 configure.ac ,此处 automake初始化
    AC_CANONICAL_TARGET
    case "${host}" in
      i*86-*-freebsd*)
            OSTYPE="FREEBSD"
            ;;      
      *-*-solaris*) 
            OSTYPE="SOLARIS"
            LIBS="$LIBS -lnsl -lsocket"
            ;;  
      *-*-sunos*)
            OSTYPE="SUNOS"
            LIBS="$LIBS -lnsl -lsocket"
            ;;  
      *-*-linux*)        
            OSTYPE="LINUX"
            ;;  
      *-*-cygwin*)        
            OSTYPE="CYGWIN"
            LIBS="$LIBS -lcygipc"
            ;;  
      *)        
            OSTYPE="GENERIC"
            ;;        
    esac              
    CFLAGS="$CFLAGS -D$OSTYPE"

    //确保源代码目录的完整性,通过检查当前目录是否包含 config.h.in
    AC_CONFIG_SRCDIR([config.h.in])
    //生成 config.h 头文件,其它就是实例化 config.h.in  
    //运行autoheader 命令会根据此指令生成 config.h.in
    AM_CONFIG_HEADER(config.h)

    //设定 prefix 的默认值
    AC_PREFIX_DEFAULT(/home/bbs)

    m4_include(config.icc)


    // --enable-innbbsd 参数
    AC_ARG_ENABLE(innbbsd,
    [  --enable-innbbsd
                    enable innbbsd  support(need innbbsd package)],
    [
            if test "$enableval" = "yes" ; then
                    if test -d innbbsd; then
                        //实例化innbbsd 下的 Makfile.in生成 Makefile,
                        //并运行 linkinnd.sh转链接。
                           AC_CONFIG_FILES(innbbsd/Makefile
                                        innbbsd/linkinnd.sh)
                        BBSSUBDIRS="$BBSSUBDIRS innbbsd"
                    else
                            AC_MSG_ERROR([can't find innbbsd package,please get it first!])
                    fi
            fi
    ])

    //--enable-ssh 参数
    AC_ARG_ENABLE(ssh,
    [  --enable-ssh
                    enable ssh bbsd  support(need sshbbsd package)],
    [
            if test "$enableval" = "yes" ; then
                    if test -d sshbbsd; then
                        //在 sshbbsd 目录下运行 configure 命令
                        //而不是实例化 Makefile. sshbbsd 有相对的独立性
                            AC_CONFIG_SUBDIRS(sshbbsd)
                BBSSUBDIRS="$BBSSUBDIRS sshbbsd"
                    else
                            AC_MSG_ERROR([can't find sshbbsd package,please get it first!])
                    fi
            fi
    ])

    if [ test -z "$enable_www" ]; then
            enable_www=yes
    fi

    //--enable-www 
    AC_ARG_ENABLE(www,
    [  --enable-www
            enable web support(need bbs2www package)],
    [
            if test "$enableval" = "yes" ; then
                    if test -d bbs2www; then
                //实例化 bbs2www目录的Makefile 及 config.m4 文件 
               AC_CONFIG_FILES([bbs2www/Makefile
                                 bbs2www/lib/Makefile
                                 bbs2www/phplib/Makefile
                                 bbs2www/phplib/config.m4])
                BBSSUBDIRS="$BBSSUBDIRS bbs2www"
                    else
                            AC_MSG_ERROR([can't find bbs2www package,please get it first!])
                    fi
                    CONFIG_HAVE_WWW=1
            else
                    CONFIG_HAVE_WWW=0
            fi
    ])

    //替换各 *.in 文件中的 @CONFIG_HAVE_WWW@ 变量 
    AC_SUBST(CONFIG_HAVE_WWW)
    AC_SUBST(BBSSUBDIRS)


    m4_include(bbs2www.in)

    //一些由 autoscan 自动生成的check
    # Checks for header files.
    AC_HEADER_DIRENT
    AC_HEADER_STDC
    AC_HEADER_SYS_WAIT
    AC_CHECK_HEADERS([arpa/inet.h fcntl.h limits.h malloc.h netdb.h netinet/in.h sgtty.h stdlib.h string.h sys/file.h sys/ioctl.h sys/param.h sys/socket.h sys/time.h termio.h termios.h unistd.h utime.h])

    # Checks for typedefs, structures, and compiler characteristics.
    AC_HEADER_STAT
    AC_C_CONST
    AC_C_INLINE
    AC_TYPE_MODE_T
    AC_TYPE_OFF_T
    AC_TYPE_PID_T
    AC_TYPE_SIZE_T
    AC_HEADER_TIME
    AC_STRUCT_TM
    AC_CHECK_TYPES([struct utimbuf],[],[],[#include <utime.h>])

    AC_CHECK_SIZEOF(int *)
    AC_CHECK_SIZEOF(long long int)
    AC_CHECK_SIZEOF(long int)
    AC_CHECK_SIZEOF(int)
    AC_CHECK_SIZEOF(int64)
    AC_CHECK_SIZEOF(int32)

    # Checks for library functions.
    AC_CONFIG_LIBOBJ_DIR(lib)
    AC_FUNC_ALLOCA
    AC_FUNC_FORK
    AC_FUNC_GETLOADAVG
    AC_PROG_GCC_TRADITIONAL
    AC_FUNC_MALLOC
    AC_FUNC_MEMCMP
    AC_FUNC_MKTIME
    AC_FUNC_MMAP
    AC_FUNC_SETPGRP
    AC_FUNC_SETVBUF_REVERSED
    AC_TYPE_SIGNAL
    AC_FUNC_STAT
    AC_FUNC_STRFTIME
    AC_FUNC_UTIME_NULL
    AC_FUNC_VPRINTF
    AC_CHECK_FUNCS([alarm atexit bzero dup2 ftruncate getcwd gethostbyaddr gethostbyname gethostname inet_ntoa isascii memchr memset mkdir munmap rmdir select socket strcasecmp strcasestr strchr strdup strerror strncasecmp strpbrk strrchr strstr strtol utime memmem flock inet_aton inet_pton isblank])
    AC_CHECK_TYPES(bool)
    AC_CHECK_TYPES(sig_t,,,[#include <signal.h>])

    dnl Select Error language
    //--enable-site 
    AC_ARG_ENABLE(site,
    [  --enable-site=sitename
                              select site special files (see site dir) ],
    [
        BBSSITE=$enableval
    ],[BBSSITE="smth"
    SITEDIR=site])
    if test -f $srcdir/site/$BBSSITE.c; then
            SITEDIR=site
    else
      if test -f $srcdir/sites/$BBSSITE.c; then
            SITEDIR=sites
      else
            AC_MSG_ERROR([ERROR! Unknown site $BBSSITE, see site/])
      fi
    fi

    //替换各 *.in 文件中的@BBSSITE@ 变量
    AC_SUBST(BBSSITE)

    # Checks for programs.
    AC_PROG_CXX
    AC_PROG_AWK
    AC_PROG_CC
    AC_PROG_LIBTOOL
    AC_PROG_INSTALL
    AC_PROG_LN_S
    AC_PROG_MAKE_SET
    AC_PROG_RANLIB
    AC_PROG_YACC
    m4_include(config.lib)

    # Checks for libraries.

    //作文件的软链接。当 libBBS 及site目录的源文件链入 src 目录
    AC_CONFIG_LINKS(libBBS/site.c:$SITEDIR/$BBSSITE.c
                    libBBS/site.h:$SITEDIR/$BBSSITE.h
                    src/site.c:$SITEDIR/$BBSSITE.c
                    src/site.h:$SITEDIR/$BBSSITE.h
                    libBBS/default.c:$SITEDIR/default.c
                    libBBS/default.h:$SITEDIR/default.h
                    src/default.c:$SITEDIR/default.c
                    src/default.h:$SITEDIR/default.h
                    )

    cd libBBS; for i in *.[[ch]] ; do 
    AC_CONFIG_LINKS(src/$i:libBBS/$i)
    done
    cd ..

    ORIGIN_LIBTOOL=$LIBTOOL
    AC_SUBST(ORIGIN_LIBTOOL)
    AC_SUBST(SED)
    abssrcdir=`cd $srcdir && pwd`
    LIBTOOL="$abssrcdir/wrapper.sh"
    //替换 *.in文件中的 @abssrcdir@ 变量
    AC_SUBST(abssrcdir)

    //实例化
    AC_CONFIG_FILES([Makefile
                     libBBS/Makefile
                     libsystem/Makefile
                     rzsz/Makefile
                     daemon/Makefile
                     mail2bbs/Makefile
                     local_utl/Makefile
                     service/Makefile
                     service/pip/Makefile
                     service/worker/Makefile
                     service/personaldns/Makefile
                     src/bbsconfig.h
                     src/Makefile])
    AC_CONFIG_FILES(wrapper.sh, chmod +x wrapper.sh)
    AC_OUTPUT 
  • 相关阅读:
    PAT (Advanced Level) 1080. Graduate Admission (30)
    PAT (Advanced Level) 1079. Total Sales of Supply Chain (25)
    PAT (Advanced Level) 1078. Hashing (25)
    PAT (Advanced Level) 1077. Kuchiguse (20)
    PAT (Advanced Level) 1076. Forwards on Weibo (30)
    PAT (Advanced Level) 1075. PAT Judge (25)
    PAT (Advanced Level) 1074. Reversing Linked List (25)
    PAT (Advanced Level) 1073. Scientific Notation (20)
    PAT (Advanced Level) 1072. Gas Station (30)
    PAT (Advanced Level) 1071. Speech Patterns (25)
  • 原文地址:https://www.cnblogs.com/niocai/p/2106158.html
Copyright © 2011-2022 走看看