注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

亮丽

一直想安静的过着安静的日子,安静的爱着爱我的人

 
 
 

日志

 
 
 
 

Linux下Makefile自动生成  

2008-03-16 20:52:38|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 

分类:Linux

2007.11.8 16:28 作者:tmsonhust | 评论:0 | 阅读:276

                                

       作为Linux下的程序开发人员,大家对Makefile一定不会陌生,而且一般情况下,大家都是通过手动来写一个简单的Makefile,而且只要符合其中的规则,每个人都可以写出自己的Makefile,而且大多是不一样的。通常,对于一个比较小的程序,我们也习惯了这样自己去写。但是,如果有朝一日,你进入一个大的项目时,有成百上千的文件需要编译时,你还会采取这种手动书写的方式吗?或者有朝一日,你的开发环境改变了,变成了Unix或者其他的系统,你自己写的Makefile还能够兼容吗?为了解决这一系列问题,有了Automake,它的出现,让Makefile的自动生成成为了可能。这时,大家再也不需要去写一系列的编译指令了,而取而代之的是指定一些预定义的宏,只需要合理的设置好就OK了。本文的目的就是讲一下如何来自动生成Makefile。

1.所使用到的工具

           ◇GNU Autoconf

        ◇GNU Automake

      ◇GNU m4

      ◇perl

      ◇GNU Libtool(如果你需要产生shared library)

       Autoconf是一个用来生成可以自动配置软件源码包,用以适应多种UNIX类系统的shell脚本工具,其中autoconf需要用到m4,便于生成脚本。

       Automake是一个从Makefile.am文件自动生成Makefile.in的工具。为了生成Makefile.in,automake需要用到perl,由于automake创建的发布完全遵循GUN标准,所以在创建中不需要perl。

       Libtool是一个方便生成各种程序库的工具。

       要查询自己的系统上是否装有上述工具,可以使用which命令,一般的系统上都会有的。

 

2.要知道的一点知识

       Automake目前支持三种目录模式:flat,shallow和deep。

       在flat模式中,所有文件都位于同一个目录中,也就是所有源文件,头文件以及其他库文件都位于当前目录中,且没有子目录。

       在shallow模式中,主要的源代码都存储在顶层目录中,其他部分则存储在子目录中。

       在deep模式中,所有源代码都存储在子目录中,顶层目录主要包含配置信息,也就是说所有源文件以及自己写的头文件位于当前目录的子目录中,而且当前目录里没有任何源文件。

       很显然,deep模式是最复杂的,flat模式虽然简单但是不便于管理,我们在实际中用到的最多的也就是deep模式。下面我们针对flat模式和deep模式各举一个例子。两个例子用到的文件都相同,只是采用了不同的存储方式,一个是在project1下直接存放main.c,greeting.c和greeting.h三个文件,是为flat模式,一个是在project2下有2个子目录src和include,其中src中存放的是main.c和greeting.c,include中存放的是greeting.h,是为deep模式。很显然采用deep模式,层次结构一目了然。

 

3.flat模式的例子

       下面详细的介绍流程,很可惜图片上传不了,只能将就一下了。

①      运行autoscan,生成configure.scan文件,该文件是后面需要的configure.in文件的雏形。运行之后发现工程目录下多出了2个文件:autoscan.log和configure.scan。

②      重命名configure.scan为configure.in得到我们需要的文件类型,修改configure.in,在其中添加AC_INIT(hello,1.0,tmsonhust@sina.com)和AM_INIT_AUTOMAKE,在AC_OUTPUT后面加上(Makefile),其他的可以去掉。

③    运行aclocal

④    运行autoconf

⑤      创建Makefile.am文件,添加如下内容:   AUTOMAKE_OPTIONS=foreignbin_PROGRAMS=hellohello_SOURCES=main.cgreeting.c

greeting.h。  

⑥    运行automake –-add-missing

⑦    运行./configure

⑧    运行make

    ⑨./hello  

4.deep模式的例子

    具体流程跟上面的差不多,只是Makefile.am有一点不同,除了在工程目录下有一个以外,在需要编译的子目录里也同样必须有。因而在我们这个例子里要写2个Makefile.am。具体操作这里就不在赘述了。

    ①运行autoscan,生成configure.scan文件,该文件是后面需要的configure.in文件的雏形。

运行之后发现工程目录下多出了2个文件:autoscan.log和configure.scan。

    ②重命名configure.scan为configure.in得到我们需要的文件类型,同时修改configure.in,在其中添加AC_INIT(hello,1.0,tmsonhust@sina.com)和AM_INIT_AUTOMAKE,在AC_OUTPUT后面加上(Makefile),其他的可以除最开始的两句外可以去掉。

    ③运行aclocal

    ④运行autoconf

    ⑤创建Makefile.am文件,首先在工程目录下创建Makefile.am,内容如下:AUTOMAKE_OPTIONS=foreign,SUBFIRS=src.同时在src目录下创建Makefile.am,内容如下:AUTOMAKE_OPTIONS=foreign,bin_PROGRAMS=hello,hello_SOURCES=main.c greeting.c $(top_srcdir)/include/greeting.h 。

⑥运行automake –-add-missing

    ⑦运行./configure

    ⑧ 运行make

    ⑨./hello

 

5.一点分析

    下面针对上面提到的一些工具以及用到的宏做些详细的介绍。

1.autoscan

autoscan是用来扫描源代码目录生成configure.scan文件的。autoscan可以用目录名做为参数,但如果你不使用参数的话,那么autoscan将认为使用的是当前目录。autoscan将扫描你所指定目录中的源文件,并创建configure.scan文件。Configure.scan包含了系统配置的基本选项,里面都是一些宏定义,我们需要将它修改为configure.in。

2.aclocal

aclocal是一个perl 脚本程序。aclocal根据configure.in文件的内容,自动生成aclocal.m4文件。aclocal的定义是:“aclocal - create aclocal.m4 by scanning configure.ac”。

3.autoconf

autoconf是用来产生configure文件的。configure是一个脚本,它能设置源程序来适应各种不同的操作系统平台,并且根据不同的系统来产生合适的Makefile,从而可以使你的源代码能在不同的操作系统平台上被编译出来。

configure.in文件的内容是一些宏,这些宏经过autoconf 处理后会变成检查系统特性、环境变量、软件必须的参数的shell脚本。configure.in文件中的宏的顺序并没有规定,但是你必须在所有宏的最前面和最后面分别加上AC_INIT宏和AC_OUTPUT宏。

4.Makefile.am

Makefile.am是用来生成Makefile.in的,需要你手工书写。Makefile.am中定义了一些内容:

AUTOMAKE_OPTIONS

  这个是automake的选项。在执行automake时,它会检查目录下是否存在标准GNU软件包中应具备的各种文件,例如AUTHORS、ChangeLog、NEWS、README等文件。我们将其设置成foreign时,automake会改用一般软件包的标准来检查从而忽略掉这些。如果省略该选项的话,就应该在工程目录下新建上述5个文件,否则会报错。

    bin_PROGRAMS

  这个是指定我们所要产生的可执行文件的文件名。如果你要产生多个可执行文件,那么在各个名字间用空格隔开。

    hello_SOURCES

  这个是指定产生“hello”(可执行文件名)时所需要的源代码。如果它用到了多个源文件,使用空格符号将它们隔开。比如需要main.c,greeting.c和greeting.h,那么应写成:hello_SOURCES=main.c greeting.c greeting.h。

SUBDIRS

这个是用来指定对子目录下的文件进行编译的一个宏。

5.automake

我们使用automake --add-missing来产生Makefile.in。

  选项--add-missing的定义是“add missing standard files to package”,它会让automake加入一个标准的软件包所必须的一些文件。

  我们用automake产生出来的Makefile.in文件是符合GNU Makefile惯例的,接下来我们只要执行configure这个shell 脚本就可以产生合适的 Makefile 文件了。

6.Makefile

在符合GNU Makefiel惯例的Makefile中,包含了一些基本的预先定义的操作:

Make

根据Makefile编译源代码,连接,生成目标文件,可执行文件。

   make clean

   清除上次的make命令所产生的object文件(后缀为“.o”的文件)及可执行文件。

   make install

   将编译成功的可执行文件安装到系统目录中,一般为/usr/local/bin目录。

   make dist

   产生发布软件包文件(即distribution package)。这个命令将会将可执行文件及相关文件打包成一个tar.gz压缩的文件用来作为发布软件的软件包。它会在当前目录下生成一个名字类似“PACKAGE-VERSION.tar.gz”的文件。PACKAGE和VERSION,是我们在configure.in中定义的AM_INIT_AUTOMAKE(PACKAGE, VERSION)。

    make distcheck

    生成发布软件包并对其进行测试检查,以确定发布包的正确性。这个操作将自动把压缩包文件解开,然后执行configure命令,并且执行make,来确认编译不出现错误,最后提示你软件包已经准备好,可以发布了。

7.flat模式和deep模式的区别就在于deep模式顶层Makefile的写法不同,在deep模式中顶层的Makefile除了指定需要编译的子目录外不需要干任何其他事情。

 

  评论这张
 
阅读(352)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017