Configure,Makefile.am, Makefile.in, Makefile文件之间关系

参考博客:
http://blog.csdn.net/ixidof/article/details/5833383
http://jaguar13.iteye.com/blog/614427


一、Makefile 介绍
    Makefile是用于自动编译和链接的,一个工程有很多文件组成,每一个文件的改变都会导致工程的重新链接,但是不是所有的文件都需要重新编译,Makefile中记录有文件的信息,在make 时会决定在链接的时候需要重新编译哪些文件。

Makefile的宗旨就是:让编译器知道要编译一个文件需要依赖其他的哪些文件。当那些依赖文件有了改变,编译器会自动的发现最终的生成文件已经过时,而重新编译相应的模块。

Makefile的基本结构不是很复杂,但当一个程序开发人员开始写Makefile时,经常会怀疑自己写的是否符合惯例,而且自己写的 Makefile经常和自己的开发环境相关联,当系统环境变量或路径发生了变化后,Makefile 可能还要跟着修改。这样就造成了手工书写 Makefile 的诸多问题,automake恰好能很好地帮助我们解决这些问题。


使用automake,程序开发人员只需要写一些简单的含有预定义宏的文件,由autoconf根据一个宏文件生成configure,由automake根据另一个宏文件(makefile.am)生成Makefile.in,再使用configure依据Makefile.in来生成一个符合惯例的Makefile。下面我们将详细介绍Makefile的automake生成方法


二、使用autoconf和automake工具生成Makefile文件
     使用autoconf和automake两个工具来帮助我们自动地生成符合自由软件惯例的Makefile,这样就可以象常见的GNU程序一样,只要使用“./configure” ,“make” ,“make install” 就可以把程序安装到Linux系统中去了。这将特别适合想做开放源代码软件的程序开发人员。liunux系统包含用到的autoconf,automake工具。
     Makefile文件生成的流程如下图所示。黄色标注的为需要手动编写的文件。
          
Configure,Makefile.am, Makefile.in, Makefile文件之间关系_第1张图片
  
     编译流程:
(1)命令:$ autoscan
       autoscan 命令根据目录下的源代码生成configure.scan文件 ,拿它作为configure.in 的蓝本。将configure.scan 改重命名为configure.in ,并且编辑它
(2)命令: $ aclocal
                  $ autoconf
       执行命令aclocal 和autoconf ,分别会产生aclocal.m4 及configure 两个文件。
      aclocal根据configure.in文件的内容,自动生成aclocal.m4文件。aclocal是一个perl脚本程序,它的定义是:“aclocal - create aclocal.m4 by scanning configure.ac” 。
      autoconf 从configure.in 这个列举编译软件时所需要各种参数的模板文件中创建configure 。autoconf 需要GNU m4 宏处理器来处理aclocal.m4,生成configure脚本。m4 是一个宏处理器。将输入拷贝到输出,同时将宏展开。宏可以是内嵌的,也可以是用户定义的。除了可以展开宏,m4 还有一些内建的函数,用来引用文件,执行命令,整数运算,文本操作,循环等。m4 既可以作为编译器的前端,也可以单独作为一个宏处理器。
(3 )新建Makefile.am
(4)运行automake命令
命令:$ automake --add-missing
configure.in: installing `./install-sh'
configure.in: installing `./mkinstalldirs'
configure.in: installing `./missing'
Makefile.am: installing `./depcomp'
automake会根据Makefile.am文件产生一些文件,包含最重要的Makefile.in。
(5)执行configure生成Makefile
      命令:$ ./configure
(6)使用Makefile编译代码
      命令:$ make

你可能感兴趣的:(Configure,Makefile.am, Makefile.in, Makefile文件之间关系)