天天看点

autotools工具自动生成Makefile

<b>autotools</b><b>的使用流程</b>

<b>&lt;?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /&gt;</b>

<b></b>

<b></b> 

autoscan-&gt;aclocal-&gt;autoconf-&gt; automake-&gt;configure

&lt;?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /&gt;

以helloworld为例加以说明:

<b>1</b><b>)新建</b><b>helloworld.c</b><b>,并修改代码如下:</b><b></b>

   int main(int argc,char** argv)

   {

        printf("hello world!");

   }

<b>2)autoscan:autoscan:</b><b>生成</b><b>configure.scan</b>

<b>3)</b><b>编辑</b><b>configure.scan,</b><b>并重命名为</b><b>configure.in</b>

  内容如下:

#      -*- Run autoconf -*-

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

AC_PREREQ(2.59)

#The next one is modified by sunq

#AC_INIT(FULL-PACKAGE-NAME,VERSION,BUG-REPORT-ADDRESS)

AC_INIT(hello,1.0)

# The next one is added by author

AM_INIT_AUTOMAKE(hello,1.0)

AC_CONFIG_SRCDIR([hello.c])

# 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

<b>4</b><b>)aclocal:生成aclocal.m4</b>

<b>5) autoconf:</b><b>生成configure</b>

<b>6)vim makefile.am</b><b>:</b>新建makefile.am并编辑内容如下:

  AUTOMAKE_OPTIONS=foreign

  bin_PROGRAMS=helloworld

  helloworld_SOURCES=helloworld.c

<b>7</b><b>)atuomake --add-missing:</b>生成makefile.in

<b>8</b><b>)./configure:</b>生成makefile

这样helloworld的makefile就生成了,make就可生成可执行程序了。

<b>autotools</b><b>各步详解:</b>

<b>1</b><b>.</b><b>autoscan</b>

它会在给定目录及其子目录树中检查源文件,若没有给出目录,就在当前目录及其子目录树中进行检查。它会搜索源文件以寻找一般的移植性问题并创建一个文件“configure.scan”,它是“configure.in”的原型文件.

<b>2.configure.in</b><b></b>

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

1)以“#”号开始的行为注释。

2)AC_PREREQ宏声明本文件要求的autoconf版本,如本例使用的版本2.59。

3) AC_INIT宏用来定义软件的名称和版本等信息,在本例中省略了BUG-REPORT-ADDRESS,一般为作者的e-mail。

4)M_INIT_AUTOMAKE是笔者另加的,它是automake所必备的宏,也同前面一样,PACKAGE是所要产生软件套件的名称,VERSION是版本编号。

5)AC_CONFIG_SRCDIR宏用来侦测所指定的源码文件是否存在,来确定源码目录的有效性。在此处为当前目录下的hello.c。

6)AC_CONFIG_HEADER宏用于生成config.h文件,以便autoheader使用。

7)AC_CONFIG_FILES宏用于生成相应的Makefile文件。

<b>4.aclocal</b>

它生成一个“aclocal.m4”文件,该文件主要处理本地的宏定义。

<b>5.autoconf</b>

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

<b>6.makefile.am</b>

<b>·</b>  其中的AUTOMAKE_OPTIONS为设置automake的选项。由于GNU对自己发布的软件有严格的规范,比如必须附带许可证声明文件COPYING等,否则automake执行时会报错。automake提供了三种软件等级:foreign、gnu和gnits,让用户选择采用,默认等级为gnu。在本例使用foreign等级,它只检测必须的文件。

·  bin_PROGRAMS定义要产生的执行文件名。如果要产生多个执行文件,每个文件名用空格隔开。

·  hello_SOURCES定义“hello”这个执行程序所需要的原始文件。如果”hello”这个程序是由多个原始文件所产生的,则必须把它所用到的所有原始文件都列出来,并用空格隔开。例如:若目标体“hello”需要“hello.c”、“sunq.c”、“hello.h”三个依赖文件,则定义hello_SOURCES=hello.c sunq.c hello.h。要注意的是,如果要定义多个执行文件,则对每个执行程序都要定义相应的file_SOURCES。

<b>7.automake - -add-missing</b>

生成“makefile.in”文件,在这里使用选项“—adding-missing”可以让automake自动添加有一些必需的脚本文件。

<b>8</b><b>.运行configure</b>

在这一步中,通过运行自动配置设置文件configure,把Makefile.in变成了最终的Makefile。

<b>automake</b><b>工具介绍</b>

automake是一个从文件Makefile.am自动生成Makefile.in的工具。每个Makefile.am基本上是一系列make的宏定义(make规则也会偶尔出现)。生成的Makefile.in也服从GNU Makefile标准。

典型的automake输入文件是一系列简单的宏定义。处理所有相关的文件并创建Makefile.in文件。在一个项目的每个目录中通常仅包含一个Makefile.am。

目前automake支持三种目录层次:平坦模式(flat)、混合模式(shallow)和深层模式(deep)。

(1)平坦模式指的是所有文件都位于同一个目录中。就是所有源文件、头文件及其他库文件都位于当前目录中,且没有子目录。

(2)混合模式指的是主要的源代码都存储在顶层目录,其他各个部分则存储在子目录中。也就是主要源文件在当前目录中,而其他一些实现各部分功能的源文件位于各自不同的目录。

(3)深层模式指的是所有源代码都被存储在子目录中;顶层目录主要包含配置信息。也就是所有源文件及程序员自己写的头文件都位于当前目录的一个子目录中,而当前目录里没有任何源文件。

在这三种支持的目录层次中,平坦模式类型是最简单的,深层模式类型是最复杂的。但是这些模式使用autoconf和automake所遵循的基本原则和流程是一样的。

<b>其他工具介绍</b>

(1)autoheader:能够产生供configure脚本使用的C #define语句模板文件。

(2)autom4te:对文件执行 GNU M4。

(3)autoreconf:如果有多个autoconf产生的配置文件,autoreconf可以保存一些相似的工作,它通过重复运行autoconf(以及在合适的地方运行autoheader)以重新产生autoconf配置脚本和配置头模板,这些文件保存在以当前目录为根的目录树中。

(4)autoscan:该程序可以用来为软件包创建configure.in文件。autoscan在以命令行参数中指定的目录为根(如果未给定参数,则以当前目录为根)的目录树中检查源文件。为软件包创建一个configure.scan文件,该文件就是configure.in的前身。

(5)autoupdate:该程序的作用是转换configure.in,从而使用新的宏名。

<b>相关链接:</b>

<a href="http://blog.ossxp.com/2010/04/954/">http://blog.ossxp.com/2010/04/954/</a>

<a href="http://hi.baidu.com/gouoooo/blog/item/ae52cf349f84ff87a61e129c.html">http://hi.baidu.com/gouoooo/blog/item/ae52cf349f84ff87a61e129c.html</a>