使用automake 与 autoconf 自动生成 Makefile

来源:互联网 发布:中信淘宝信用卡怎么样 编辑:程序博客网 时间:2024/05/16 17:51

转自:http://blog.sina.com.cn/s/blog_50151e570100vgtk.html


刚开始的时候,一直在使用automake 和 autoconf生成Makefile,然后编译这个工具,一直想把自己了解的记录下来,今天做了个简单的实验,趁这个机会,把一些东西写在这里,并尽可能的说清楚这个工具的使用原理。

      先从实验开始说

简单实验

     编写一个简单的文件,autotest.c,内容如下:
         #include <stdio.h>
         int main(int argc,char** argv){
              printf("If you look this print on your screen , it is work\n");
              return 0;
         }

     1) 运行autoscan命令,这个命令会扫描你在当前目录下的源代码文件,然后会生成一个扫描的报告,这个报告会告诉你必要的配置,文件名为 :configure.scan。其实这个文件也没什么神秘的,它的大致应该如下:
             # Process this file with autoconf to produce a configure script.
             AC_PREREQ(2.59)
             AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
             AC_CONFIG_SRCDIR([config.h.in])
             AC_CONFIG_HEADER([config.h])
             # Checks for programs.
             AC_PROG_CC
             # Checks for libraries.
             # FIXME: Replace `main' with a function in `-lpthread':
             AC_CHECK_LIB([pthread], [main])
             # Checks for header files.
             # Checks for typedefs, structures, and compiler characteristics.
             # Checks for library functions.
             AC_OUTPUT
      有人把这个文件的内容总结为,
              AC_INIT   // 一定是以这个开头的
                 测试程序
                 测试函数库
                 测试头文件
                 测试类型定义
                 测试结构
                 测试编译器特性
                 测试库函数
                 测试系统调用
             AC_OUTPUT // 一定是以这个结尾的。
      在本实验时,运行autoscan后,configure.scan的内容如下:
                # Process this file with autoconf to produce a configure script.

                AC_PREREQ(2.59)
                AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
                AC_CONFIG_SRCDIR([hello.c])
                AC_CONFIG_HEADER([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_CONFIG_FILES([Makefile])
                AC_OUTPUT

    2)在运行了autoscan命令之后,将configure.scan文件改成configure.in文件,内容也要相应的修改,在本实验中,修改后如下:
              AC_INIT(autotest.c)  // 该宏的作用是用于说明源代码的路径。
              AM_INIT_AUTOMAKE(autotest,1.0)   //这个宏用于指定产生软件的名称和版本号 automake命令需要用到这个宏所必需的宏。
              AC_PROG_CC // 这个宏会检查系统可用的编译器
              ........不作什么改变。。。。。。。。。。。
              AC_OUTPUT(Makefile)   // 这个宏设定configure脚本所要产生的文件,我们是想通过Makefile.am产生Makefile文件。

    3)然后执行 aclocal 命令,这是由于autoconf需要用到m4文件,调用aclocal主要用于生成aclocal.m4文件。
    4)调用autoconf ,autoconf是专门用于产生 configure脚本的工具,它处理configure.in文件中的宏,然后根据宏生成特定的脚本。
这时该命令,将configure.in和aclocal.m4 作为输入文件,输出文件是configure ,这个文件就是我们后面在配置调用的文件。    按照一般的开源要求,目录下还要有几个其它的文件,分别是NEWS, README,AUTHORS,ChangeLog这几个文件,只要分别touch一下就行了。

    5)编译当然需要编译我们自己的源文件,这个时候要编写一个Makefile.am指导如果编译。在当前目录下建立一个文件Makefile.am,内容如下:(如果有其它编译选项或者是编译连接需求,可以在Makefile.am里面指定,这个文件由automake使用),我这里只是简单的测试automake,所以Makefile.am文件很简单
     bin_PROGRAMS = autotest
     autotest_SOURCES = autotest.c

   6)执行
automake --add-missing,这个命令以Makefile.am和configure.in作为输入,输出文件是Makefile.in。如果这时出错,有可能是libtool没有配置,如下操作配置:
     
 libtoolize --automake --debug --copy –force
       或:
      libtoolize --automake  
   7)此时就基本完成了,接下来只需要调用./configure 命令,就可以看到输出Makefile文件了。然后make完成编译,此时在目录下面应该就有了 autotest 可运行程序。

实验分析

 
  实验其实很简单,就只有一个文件,并且也只有两行代码,但是后面可以看到目录下生成了很多个文件。另外在这个过程中,有几个文件起到了关键的作用,下面就对这几个文件进行说明一下,分别是
    configure.in文件 :这个文件在autoconf和automake这两个命令调用的时候,都要用到。

    Makefile.am文件:这个文件告诉编译器,如何编译当前目录下的源文件。
    Makefile文件:这个文件由 configure 脚本执行后生成。

    以前收藏的一张图片,基本上表示了这个过程的关系:

     使用automake <wbr>与 <wbr>autoconf <wbr>自动生成 <wbr>Makefile



    好了,这样的话,实验就可以输出了.运行结果如下:
  
使用automake <wbr>与 <wbr>autoconf <wbr>自动生成 <wbr>Makefile

   关于Makefile.am文件的编写,将在后面的博客里,与大家分享,感谢关注。
0 0
原创粉丝点击