• automake/autoconf的简单例子


    参考文章1:http://loftor.com/archives/automake.html

    参考文章2:http://www.blogjava.net/huyi2006/articles/187908.html

    项目一 helloworld

    整个基础上仅有一个helloworld.c文件,功能也非常简单,只是向屏蔽输出一句hello。

    新建一个helloworld目录,然后在里面新建一个文件helloworld.c,内容为:

    #include <stdio.h>
    
    int main(int argc, char **agrv)
    {
        printf("Hello, Merlin
    ");
    
        return 0;
    }

    执行命令autoscan生成一个架构configure.scan,将其重新命名为configure.ac(新版本使用ac后缀名,不再使用in后缀),此时目录中含有以下文件

    merlin@tfAnalysis:~/t/hellworld$ ls
    autoscan.log  configure.ac  helloworld.c

    原configure.scan的内容为:

    #                                               -*- Autoconf -*-
    # Process this file with autoconf to produce a configure script.
    
    AC_PREREQ([2.69])
    AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])
    AC_CONFIG_SRCDIR([helloworld.c])
    AC_CONFIG_HEADERS([config.h])
    
    # Checks for programs.
    AC_PROG_CC
    
    # Checks for libraries.
    
    # Checks for header files.
    
    # Checks for typedefs, structures, and compiler characteristics.
    
    # Checks for library functions.
    
    AC_OUTPUT

    将其修改为以下样子:

    #                                               -*- Autoconf -*-
    # Process this file with autoconf to produce a configure script.
    
    AC_PREREQ([2.69])
    AC_INIT(helloworld, 0.1, tfa2012@foxmail.com)
    AC_CONFIG_SRCDIR(helloworld.c)
    #AC_CONFIG_HEADERS([config.h])
    AM_INIT_AUTOMAKE
    
    # Checks for programs.
    AC_PROG_CC
    
    # Checks for libraries.
    
    # Checks for header files.
    
    # Checks for typedefs, structures, and compiler characteristics.
    
    # Checks for library functions.
    
    AC_OUTPUT(Makefile)

    AC_CONFIG_SRCDIR(helloworld.c)的功能是在./configure时检测文件helloworld.c是否存在,从而检测源码的正确性。

    依次执行aclocal和autoconf两人个命令,此时文件夹中内容为:

    merlin@tfAnalysis:~/t/hellworld$ ls
    aclocal.m4  autom4te.cache  autoscan.log  configure  configure.ac  helloworld.c

    新建文件Makefile.am文件,并填写入以下内容:

    AUTOMAKE_OPTIONS = foreign
    bin_PROGRAMS = helloworld
    helloworld_SOURCES = helloworld.c

    执行automake --add-missing

    merlin@tfAnalysis:~/t/hellworld$ automake --add-missing
    configure.ac:11: installing './compile'
    configure.ac:8: installing './install-sh'
    configure.ac:8: installing './missing'
    Makefile.am: installing './depcomp'

    此时文件夹中内容为:

    merlin@tfAnalysis:~/t/hellworld$ ls
    aclocal.m4      compile       depcomp       Makefile.am
    autom4te.cache  configure     helloworld.c  Makefile.in
    autoscan.log    configure.ac  install-sh    missing

    这个时候就可以使用./configure来生成Makefile文件了

    merlin@tfAnalysis:~/t/hellworld$ ./configure 
    checking for a BSD-compatible install... /usr/bin/install -c
    checking whether build environment is sane... yes
    checking for a thread-safe mkdir -p... /bin/mkdir -p
    checking for gawk... gawk
    checking whether make sets $(MAKE)... yes
    checking whether make supports nested variables... yes
    checking for gcc... gcc
    checking whether the C compiler works... yes
    checking for C compiler default output file name... a.out
    checking for suffix of executables... 
    checking whether we are cross compiling... no
    checking for suffix of object files... o
    checking whether we are using the GNU C compiler... yes
    checking whether gcc accepts -g... yes
    checking for gcc option to accept ISO C89... none needed
    checking whether gcc understands -c and -o together... yes
    checking for style of include used by make... GNU
    checking dependency style of gcc... gcc3
    checking that generated files are newer than configure... done
    configure: creating ./config.status
    config.status: creating Makefile
    config.status: executing depfiles commands

    编译出来试试:

    merlin@tfAnalysis:~/t/hellworld$ make
    gcc -DPACKAGE_NAME="helloworld" -DPACKAGE_TARNAME="helloworld" -DPACKAGE_VERSION="0.1" -DPACKAGE_STRING="helloworld 0.1" -DPACKAGE_BUGREPORT="tfa2012@foxmail.com" -DPACKAGE_URL="" -DPACKAGE="helloworld" -DVERSION="0.1" -I.     -g -O2 -MT helloworld.o -MD -MP -MF .deps/helloworld.Tpo -c -o helloworld.o helloworld.c
    mv -f .deps/helloworld.Tpo .deps/helloworld.Po
    gcc  -g -O2   -o helloworld helloworld.o  
    merlin@tfAnalysis:~/t/hellworld$ ls
    aclocal.m4      config.log     depcomp       install-sh   missing
    autom4te.cache  config.status  helloworld    Makefile
    autoscan.log    configure      helloworld.c  Makefile.am
    compile         configure.ac   helloworld.o  Makefile.in
    merlin@tfAnalysis:~/t/hellworld$ ./helloworld 
    Hello, Merlin

    项目二 tfadc

     这个工程稍微复杂一些,具体的结构是这样子的:

    tfadc/

    scripts/

    src/

    cmdline.c

    confile.c

    main.c

    network.c

    db/

    include/

    tfadp/

    tfadp.c

    tfana/

    tfana.c

    在tfadc目录下面运行autoscan命令,此时获得的configure.scan需要修改成configure.ac,是以下样子:

    #                                               -*- Autoconf -*-
    # Process this file with autoconf to produce a configure script.
    
    AC_PREREQ([2.69])
    AC_INIT([tfadc], [0.2], [tfa2012@foxmail.com])
    AC_CONFIG_SRCDIR([config.h.in])
    AC_CONFIG_HEADERS([config.h])
    AM_INIT_AUTOMAKE
    
    # Checks for programs.
    AC_PROG_CC
    
    # Checks for libraries.
    
    # Checks for header files.
    AC_CHECK_HEADERS([netinet/in.h stdlib.h string.h])
    
    # Checks for typedefs, structures, and compiler characteristics.
    
    # Checks for library functions.
    AC_CHECK_FUNCS([bzero socket strerror])
    
    #AC_CONFIG_FILES([Makefile])
    AC_OUTPUT(
        Makefile
        src/Makefile
        )

    在tfadc目录下面新建一个Makefile.am,这里指示还有子目录为src,表明子目录中有Makefile.am文件:

    AUTOMAKE_OPTIONS = foreign
    
    SUBDIRS = src
    #EXTRA_DIST = doc/userguide

    新建另外一个文件src/Makefile.am,这里没有指示其还有子目录的Makefile.am,而是让如tfadp下的源码使用tfadp/tfadp.c这样的形式引入到本Makefile.am中来,这个时候需要在AUTOMAKE_OPTIONS中加入subdir-objects参数:

    AUTOMAKE_OPTIONS = foreign subdir-objects
    
    bin_PROGRAMS = tfadc
    tfadc_SOURCES = cmdline.c confile.c main.c network.c tfadp/tfadp.c tfana/tfana.c
    #tfadc_LDADD = db/db.a tfana/tfana.a

    如果想要把tfana中的文件编译成库文件的话,则需要在tfana中新建一个Makefile.am,那么上面的src/Makefile.am就需要添加一个SUBDIRS = tfana了,并且还需要修改src/Makefile.am加上tfadc_LDADD = tfana/tfana.a这一行。具体如何操作还需要看一看网上的例程(参数链接2)。

    添加完两个Makefile.am之后就可以使用automake --add-missing生成configure文件了,后面的步骤就简单了./configure && make...

    本文将持续完善,将在未来的实际项目时添加以下内容

    1 配置安装路径等选项

    2 添加配置选项(./configure --enable-xxx)

    3 如果软件有配置文件则如何拷贝到实际环境中

    4 静态库生成与动态库生成方法

  • 相关阅读:
    原生AJAX基础讲解及兼容处理
    JS子元素oumouseover触发父元素onmouseout
    IE6常见bug
    让IE6支持position:fixed的方法,CSS expression与JavaScript eval讲解
    Alpha通道
    网络游戏开发前的pixel像素画习作
    网络游戏开发其一(游戏美工)
    周内琐记
    地图重置与各项绘图优化
    四足机器人搭建尝试
  • 原文地址:https://www.cnblogs.com/tfanalysis/p/3967290.html
Copyright © 2020-2023  润新知