Chinaunix首页 | 论坛 | 博客
  • 博客访问: 382516
  • 博文数量: 82
  • 博客积分: 1855
  • 博客等级: 上尉
  • 技术积分: 846
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-12 12:28
文章存档

2013年(3)

2012年(8)

2011年(71)

分类: LINUX

2011-10-13 11:59:22

automake 所产生的 Makefile 除了可以做到程序的自动编译和链接外,还可以用来生成各种文档(如manual pageinfo文件),可以将源代码文件包装起来以供发布。所以程序源代码所存放的目录结构最好符合GNU的标准惯例。下面以hello.c程序生成Makefile文件作为例子。

在当前目录下创建一个新的子目录devel,再在devel下建立一个名为hello的子目录。hello这个目录用于存放 hello.c这个程序及相关文件。命令如下:

[root@mci ~]# mkdir devel

[root@mci ~]# cd devel

[root@mci devel]# mkdir hello

[root@mci devel]# cd hello

使用以下命令新建一个源程序文件:

[root@mci devel]# vi hello.c

输入以下程序代码:

#include

 

int main(int argc, char** argv)

{

          printf("Welcome to use autoconf and automake\n");

          return 0;

}

Ø执行autoscan命令生成一个名为configure.scan文件:

[root@mci devel]#autoscan

[root@mci devel]#ls

autoscan.log configure.scan hello.c

Øconfigure.scan改名为configure.in

[root@mci devel]#mv configure.scan configure.in

Ø使用vi文本编辑器打开configure.in,将该文件修改为以下内容:

# Process this file with Autoconf to produce a configure script.

AC_INIT(hello.c)

AM_INIT_AUTOMAKE(hello, 1.0)

# 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)

Ø然后执行以下两个命令,分别生成aclocal.m4configure文件:

[root@mci devel]#aclocal

[root@mci devel]#autoconf

Ø使用命令“vi Makefile.am”创建一个名为Makefile.am的文件,并输入以下内容:

AUTOMAKE_OPTIONS= foreign

bin_PROGRAMS= hello

hello_SOURCES= hello.c

Ø执行命令“automake --add-missing”,automake 会根据Makefile.am 文件产生一些文件,其中包含最重要的Makefile.in

[root@mci devel]# automake --add-missing

Ø最后执行“./configure”命令生成Makefile文件

[root@mci devel]# ./configure

生成Makefile文件后,就可以执行“make”命令来编译hello.c程序,从而生成可执行程序hello。生成可执行程序hello后,执行。

[root@mci devel]#make

[root@mci devel]#./hello

Welcome to use autoconf and automake

 

在执行命令“automake --add-missing”、“./configure”、“make”时会有许多提示信息输出。只要输出中没有提示出现错误或找不到某文件,就说明命令执行是成功的。

 

归纳一下上个例子的流程。

1)在存放源代码的目录下执行autoscan命令生成configure.scan文件。

2)将configure.scan文件改名为configure.in,并对其默认配置进行修改。

3)执行aclocalautoconf两个命令,分别生成aclocal.m4configure文件。

4)创建一个名为Makefile.am的文件,并输入相应的内容。

5)执行automake --add-missing,它根据Makefile.am文件,生成Makefile.in

6)执行./configure脚本文件,它根据Makefile.in文件,生成最终的Makefile文件。

通过以上步骤,在源代码所在目录下自动生成了Makefile文件。

2.2.1  configure.in文件

autoconf是用来产生“configure”文件的工具。“configure”是一个Shell脚本,它可以自动设定一些编译参数使程序能够在不同平台上进行编译。autoconf读取configure.in 文件然后产生''configure''这个Shell脚本。

configure.in 文件的内容是一系列GNU m4 的宏,这些宏经autoconf处理后会变成检查系统特性的Shell脚本。configure.in文件中宏的顺序并没有特别的规定,但是每一个configure.in 文件必须以宏AC_INIT开头,以宏AC_OUTPUT结束。一般可先用autoscan这个工具扫描原始文件以产生一个configure.scan 文件,再对configure.scan 作些修改,从而生成 configure.in 文件

configure.in 文件中一些宏的含义如下。

Øl     #dnl#dnl后面的内容作为注释不会被处理,它们是注释的起始标志。

Øl     AC_INIT(FILE):该宏用来说明源代码所在路径,如上例中的AC_INIT(hello.c),表明源代码在当前目录下,名为hello.c

Øl     AM_INIT_AUTOMAKE(PACKAGE,VERSION):这个是后面运行automake命令所必需的宏,PACKAGE指明要产生软件的名称,VERSION 是其版本号。

Øl     AC_PROG_CC:检查系统可用的C编译器,若源代码是用C语言编写的就需要这个宏。

Øl     AC_OUTPUT(FILE):设置configure命令所要产生的文件。我们最终期望产生Makefile这个文件,因此一般将其设置为AC_OUTPUT(Makefile)

在运行automake命令时,还需要一些其他的宏,这些额外的宏由aclocal产生。执行aclocal会产生aclocal.m4文件,如果没有特别的要求,无需修改它。用 aclocal产生的宏将会提示automake如何动作。

另一个重要的文件是Makefile.amautomake根据configure.in中的宏并在perl的帮助下把Makefile.am转成Makefile.in文件。Makefile.am 文件定义所要产生的目标。

2.2.2  Makefile.am文件

Makefile.am文件中几个预定的选项的含义如下所示。

Øl     AUTOMAKE_OPTIONS:它用于设置automake的选项。automake 主要是帮助开发 GNU 软件的人员来维护软件,所以在执行automake 时,会检查目录下是否存在标准GNU软件中应具备的文件,例如“NEWS”、“AUTHOR”、“ChangeLog”等文件。设置为foreign 时,automake 会改用一般软件的标准来进行检查。

Øl     bin_PROGRAMS:定义要产生的可执行程序的文件名。如果要产生多个可执行文件,每个文件名用空白符隔开。

Øl     hello_SOURCES:定义“hello”这个可执行程序所需要的原始文件。如果“hello”这个程序是由多个原始文件产生的,必须把它所用到的所有原始文件都列出来,并以空白符隔开。假设“hello”还需要“hello.c”、“main.c”、“hello.h3个文件,则定义hello_SOURCES= hello.c main.c hello.h。如果定义多个可执行文件,则对每个可执行程序都要定义相应的filename_SOURCES,其中filename为要生成的可执行程序的文件名。

编辑好Makefile.am文件后,就可以使用命令automake --add-missing生成Makefile.in。加上--add-missing这个选项是用来提示automake加入包装一个软件所必需的文件,如果不使用该选项,automake可能会报告缺少了某些文件。automake产生出来的 Makefile.in文件是完全符合GNU Makefile规定的,只要执行 configure这个Shell脚本便可以产生合适的Makefile文件了。

2.2.3  如何使用产生的Makefile文件

执行configure脚本文件所产生的Makefile文件有几个预定的选项可供使用。

Øl     make all:产生设定的目标,即生成所有的可执行文件。使用make也可以达到此目的。

Øl     make clean:删除之前编译时生成的可执行文件及目标文件(形如*.o的中间文件)。

Øl     make distclean:除了删除可执行文件和目标文件以外,把configure所产生的 Makefile文件也清除掉。通常在发布软件前执行该命令。

Øl     make install:将使用make allmake命令产生的可执行文件以软件的形式安装到系统中。若使用bin_PROGRAMS宏,程序将会被安装到 /usr/local/bin下,否则安装到预定义的目录下。

Øl     make dist:将程序和相关的文档包装为一个压缩文档以供发布。执行完该命令,在当前目录下会产生一个名为PACKAGE-VERSION.tar.gz的文件。PACKAGE VERSION 这两个参数是来自configure.in文件中的AM_INIT_AUTOMAKE(PACKAGE,
VERSION)
。如在上个例子中执行make dist命令,会产生名为“hello-1.0.tar.gz”的文件。

l      make distcheck:与make dist类似,但是加入了检查包装以后的压缩文件是否正常。

阅读(870) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~