• Lerosua on Twitter

    t
  • 订阅

    抓虾
    google reader
    bloglines
    鲜果
  • 分类目录

  • 功能

  • « | Main | »

    autotool简约指南

    By lerosua | 三月 19, 2009

    写项目最烦的一项就是写Makefile,虽然有autoconf/automake这套工具。但我一直不会搞,因为几次屡屡出错,损失了信心。一看到它就头大,感觉特别复杂。
    不过这几天坚定信心,勇创难关,终于初窥门径。本文不打算教你啥原理,只是按步就班指导一下步骤。因为网上的原理教程多的是。但怕自己忘记操作的步骤,所以记下来.

    众所周所automake支持三种目录层次:flat、shallow和deep。以下例子是deep的,因为这才是项目最常用到的结构(不知道是啥去找文章看看)
    1.首先建立自己的源码目录,foo, foo下有src目录,src目录下才是真正的源码 foo.c

    leros@leros-desktop:/tmp$ ls foo/
    src
    leros@leros-desktop:/tmp$ ls foo/src/
    foo.c
    leros@leros-desktop:/tmp$ cat foo/src/foo.c
    #include <stdio.h>
    int main(int argc, char *argv[])
    {
            printf("test autoconf\n");
     
            return 0;
    }

    2.进入foo目录执行autoscan,扫描生成configure.scan

    leros@leros-desktop:/tmp/foo$ autoscan
    leros@leros-desktop:/tmp/foo$ ls
    autoscan.log  configure.scan  src

    3.把configure.scan改名为configure.in,然后修改内容

      4 AC_PREREQ(2.61)
      5 AC_INIT(foo,1.0,lerosua@lerosua.org)
      6 AC_CONFIG_SRCDIR([src/foo.c])
      7 AC_CONFIG_HEADER([config.h])
      8 AM_INIT_AUTOMAKE(foo,1.0)
      9
     10 # Checks for programs.
     11 AC_PROG_CC
     12
     13 # Checks for libraries.
     14
     15 # Checks for header files.
     16
     17 # Checks for typedefs, structures, and compiler characteristics.
     18
     19 # Checks for library functions.
     20
     21 AC_OUTPUT([Makefile
     22                 src/Makefile])

    基本上添加了 AM_INIT_AUTOMAKE(foo,1.0)这行,还有改软件名和版本号,及最后AC_OUTPUT生成的文件。(和一些教程不同的是,这里没有把AC_CONFIG_HEADER([config.h])改成AM_CONFIG_HEADER([config.h]),我改了但会造成生成config.h出错,所以这里没改)

    4.新建必要的文件

    $touch NEWS README ChangeLog AUTHORS

    将/usr/share/automake-1.X/目录下的depcomp和complie文件拷贝到本目录下,如果不复制,则会生成相应的链接文件,我想可能不利于移植,因为大家的automake的版本未必相同

    5.建立Makefile.am, src/Makefile.am。

    leros@leros-desktop:/tmp/foo$ cat Makefile.am
    SUBDIRS=src
    leros@leros-desktop:/tmp/foo$ cat src/Makefile.am
    bin_PROGRAMS=foo
    foo_SOURCES=foo.c

    有多个源文件也只需要写进foo_SOURCES里就可

    6.运行命令:

    leros@leros-desktop:/tmp/foo$ autoheader
    leros@leros-desktop:/tmp/foo$ autoconf
    leros@leros-desktop:/tmp/foo$ automake -a

    至此,构建基本上完成。
    7.即可编译:

     ./configure &amp;&amp;make &amp;&amp; sudo make install

    8.看看最后的成果:

    leros@leros-desktop:/tmp/foo$ ls
    aclocal.m4      ChangeLog     COPYING     Makefile     NEWS
    AUTHORS         config.h.in   depcomp     Makefile.am  README
    autom4te.cache  configure     INSTALL     Makefile.in  src
    autoscan.log    configure.in  install-sh  missing      stamp-h1

    总结一下,要编译的文件主要是configure.in , Makefile.am, src/Makefile.am,其它则是生成的文件。按步就班,其实也不是太复杂。另外额外的功能慢慢查及学习吧。

    Topics: Linux Note | 3 Comments »

    3 Responses to “autotool简约指南”

    1. TualatriX Says:
      三月 19th, 2009 at 2:03 下午

      不错,很好的教学文章,之前也为这个头痛过。

    2. lerosua Says:
      三月 23rd, 2009 at 11:56 上午

      呵呵,谢谢,等理解深入了再发布进化版本

    3. pypcjs Says:
      十月 26th, 2010 at 12:36 上午

      补充一下,autoconf之前要执行一下aclocal,要不会有如下错误:
      error: possibly undefined macro: AM_INIT_AUTOMAKE
      If this token and others are legitimate, please use m4_pattern_allow.
      See the Autoconf documentation.