您的位置:首页 > 其它

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

2012-02-04 23:56 459 查看


1.autoscan(autoconf):扫描源代码以搜寻普通的可移植性问题,比如检查编译器,库,头文件等,生成文件configure.scan,它是configure.ac的一个雏形。

yoursourcefiles-->[autoscan*]-->[configure.scan]-->configure.ac
2.aclocal(automake):根据已经安装的宏,用户定义宏和acinclude.m4文件中的宏将configure.ac文件所需要的宏集中定义到文件aclocal.m4中。aclocal是一个perl脚本程序,它的定义是:“aclocal-createaclocal.m4byscanningconfigure.ac”
userinputfilesoptionalinputprocessoutputfiles
=================================================

acinclude.m4-----.
V
.-------,
configure.ac------------------------>|aclocal|
{usermacrofiles}->||------>aclocal.m4
`-------'
3.autoheader(autoconf):根据configure.ac中的某些宏,比如cpp宏定义,运行m4,声称config.h.in

userinputfilesoptionalinputprocessoutputfiles
=================================================

aclocal.m4-------.
|
V
.----------,
configure.ac----------------------->|autoheader|---->autoconfig.h.in
`----------'


4.automake:automake将Makefile.am中定义的结构建立Makefile.in,然后configure脚本将生成的Makefile.in文件转换为Makefile。如果在configure.ac中定义了一些特殊的宏,比如AC_PROG_LIBTOOL,它会调用libtoolize,否则它会自己产生config.guess和config.sub
userinputfilesoptionalinputprocessesoutputfiles
===================================================

.--------,
||--->COPYING
||--->INSTALL
||------>install-sh
||------>missing
|automake|------>mkinstalldirs
configure.ac----------------------->||
Makefile.am----------------------->||------>Makefile.in
||------>stamp-h.in
.---+|--->config.guess
|||--->config.sub
|`------+-'
||---->config.guess
|libtoolize|---->config.sub
||-------->ltmain.sh
||-------->ltconfig
`----------'


5.autoconf:将configure.ac中的宏展开,生成configure脚本。这个过程可能要用到aclocal.m4中定义的宏。
userinputfilesoptionalinputprocessesoutputfiles
===================================================

aclocal.m4,autoconfig.h.in-------.
V
.--------,
configure.ac----------------------->|autoconf|------>configure


6../configure的过程

.------------->[config.cache]
configure*--------------------------+------------->config.log
|
[config.h.in]-.v.-->[autoconfig.h]
+------->config.status*-+
Makefile.in---'`-->Makefile


7.make过程


[autoconfig.h]-.
+-->make*--->程序
Makefile---'


.---------,
config.site--->||
config.cache--->|configure|--->config.cache
|+-,
`-+-------'|
||---->config.status
config.h.in------->|config-|---->config.h
Makefile.in------->|.status|---->Makefile
||---->stamp-h
|+--,
.-+||
|`------+--'|
ltmain.sh------->|ltconfig|------->libtool
|||
`-+------'|
|config.guess|
|config.sub|
`------------'[code].--------,
Makefile------>||
config.h------>|make|
{projectsources}---------------->||-------->{projecttargets}
.-++--,
|`--------'|
|libtool|
|missing|
|install-sh|
|mkinstalldirs|
`-------------'


实例:

在/hello/目录下创建一个hello.c文件,并编译运行它:

#cd/hello/

(1)编写源文件hello.c:

#include<stdio.h>

intmain(intargc,char**argv)

{

printf("Hello,GNU!n");

return0;

}

[litao@vm0000131hello]$ll

total4

-rw-rw-r--1litaolitao68Aug1212:02hello.c

一、autoscan

[litao@vm0000131hello]$autoscan

autom4te:configure.ac:nosuchfileordirectory

autoscan:/usr/bin/autom4tefailedwithexitstatus:1

[litao@vm0000131hello]$ll

total8

-rw-rw-r--1litaolitao0Aug1212:03autoscan.log

-rw-rw-r--1litaolitao457Aug1212:03configure.scan

-rw-rw-r--1litaolitao68Aug1212:02hello.c

已经生成了configure.scan,autoscan.log文件

将configure.scan修改为configure.in,最后修改的内容如下:

[litao@vm0000131hello]$mvconfigure.scanconfigure.in

[litao@vm0000131hello]$vimconfigure.in

#-*-Autoconf-*-

#Processthisfilewithautoconftoproduceaconfigurescript.

AC_PREREQ(2.59)

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

AC_CONFIG_SRCDIR([hello.c])

#AC_CONFIG_HEADER([config.h])

AM_INIT_AUTOMAKE(hello,1.0)

#Checksforprograms.

AC_PROG_CC

#Checksforlibraries.

#Checksforheaderfiles.

#Checksfortypedefs,structures,andcompilercharacteristics.

#Checksforlibraryfunctions.

AC_OUTPUT(Makefile)

二、acloacl

[litao@vm0000131hello]$aclocal

生成aclocal.m4和autom4te.cache(生成aclocal.m4的过程中涉及到configure.in)

[litao@vm0000131hello]$ll

total44

-rw-rw-r--1litaolitao31120Aug1212:08aclocal.m4

drwxr-xr-x2litaolitao4096Aug1212:08autom4te.cache

-rw-rw-r--1litaolitao0Aug1212:03autoscan.log

-rw-rw-r--1litaolitao496Aug1212:08configure.in

-rw-rw-r--1litaolitao68Aug1212:02hello.c

三、antoconf

[litao@vm0000131hello]$autoconf

生成configure(根据configure.in,和aclocal.m4)

[litao@vm0000131hello]$ll

total168

-rw-rw-r--1litaolitao31120Aug1212:08aclocal.m4

drwxr-xr-x2litaolitao4096Aug1212:11autom4te.cache

-rw-rw-r--1litaolitao0Aug1212:03autoscan.log

-rwxrwxr-x1litaolitao122297Aug1212:11configure

-rw-rw-r--1litaolitao496Aug1212:08configure.in

-rw-rw-r--1litaolitao68Aug1212:02hello.c

四、编写Makefile.am:

AUTOMAKE_OPTIONS=foreign

bin_PROGRAMS=hello

hello_SOURCES=hello.c
五、automake

生成Makefile.in,depcomp,install-sh,和missing(根据Makefile.am,和aclocal.m4)

[litao@vm0000131hello]$automake

configure.in:requiredfile`./install-sh'notfound

configure.in:requiredfile`./missing'notfound

Makefile.am:requiredfile`./depcomp'notfound

[litao@vm0000131hello]$automake--add-missing

configure.in:installing`./install-sh'

configure.in:installing`./missing'

Makefile.am:installing`./depcomp'

[litao@vm0000131hello]$ll

total192

-rw-rw-r--1litaolitao31120Aug1212:08aclocal.m4

drwxr-xr-x2litaolitao4096Aug1212:14autom4te.cache

-rw-rw-r--1litaolitao0Aug1212:03autoscan.log

-rwxrwxr-x1litaolitao122297Aug1212:11configure

-rw-rw-r--1litaolitao496Aug1212:08configure.in

lrwxrwxrwx1litaolitao31Aug1212:16depcomp->/usr/share/automake-1.9/depcomp

-rw-rw-r--1litaolitao68Aug1212:02hello.c

lrwxrwxrwx1litaolitao34Aug1212:16install-sh->/usr/share/automake-1.9/install-sh

-rw-rw-r--1litaolitao69Aug1212:15Makefile.am

-rw-rw-r--1litaolitao16561Aug1212:16Makefile.in

lrwxrwxrwx1litaolitao31Aug1212:16missing->/usr/share/automake-1.9/missing

六、configure

生成Makefile,config.log,和config.status

生成makefile整个过程

configure.in:

configure.in文件内容是一系列GNUm4的宏,这些宏经autoconf处理后会变成检查系统特性的shellscripts。configure.in
内宏的顺序并没有特别的规定,但是每一个configure.in文件必須在所有宏前加入AC_INIT宏,然后在所有宏的最后加上AC_OUTPUT宏。可先用autoscan扫描原始文件以产生一个configure.scan文件,再对configure.scan做些修改成configure.in文件。在范例中所用到的宏如下:

dnl

这个宏后面的字不会被处理,可以视为注释

AC_INIT(FILE)

该宏用来检查源代码所在路径,autoscan会自动产生,一般无须修改它。

AM_INIT_AUTOMAKE(PACKAGE,VERSION)

这个是使用Automake所必备的宏,PACKAGE是所要产生软件套件的名称,VERSION是版本编号。

AC_PROG_CC

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

AC_OUTPUT(FILE)

设置configure所要产生的文件,若是Makefile,configure便会把它检查出来的结果带入Makefile.in文件后产生合适的Makefile。

实际上,这里使用Automake时,还需要一些其他的宏,这些额外的宏我们用aclocal来帮助产生。執行aclocal会产生aclocal.m4文件,如果无特别的用途,可以不需要修改它,用aclocal所产生的宏会告诉Automake如何动作。

有了configure.in及aclocal.m4两个文件以后,便可以执行autoconf来产生configure文件了。

Makefile.am

Automake会根据configure.in中的宏把Makefile.am转成Makefile.in文件。Makefile.am文件定义所要产生的目标:

AUTOMAKE_OPTIONS

设置automake的选项。

Automake主要是帮助开发GNU软件的人员来维护软件,所以在执行automake时,会检查目录下是否存在标准GNU软件中应具备的文件,例如'NEWS'、'AUTHOR'、'ChangeLog'等文件。设置foreign时,automake会改用一般软件的标准来检查。

bin_PROGRAMS

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

hello_SOURCES

定义'hello'这个执行程序所需要的原始文件。如果'hello'这个程序是由多个原始文件所产生,必須把它所用到的所有原始文件都列出来,以空白符隔开。假设'hello'还需要'hello.c'、'main.c'、'hello.h'
三个文件的话,则定义

hello_SOURCES=hello.cmain.chello.h

如果定义多个执行文件,则对每个执行程序都要定义相对的filename_SOURCES。

编辑好Makefile.am文件,就可以用automake--add-missing来产生Makefile.in。加上--add-missing选项来告诉automake顺便假如包装一个软件所必须的文件。Automake产生生出來的
Makefile.in文件是完全符合GNUMakefile的惯例,只要执行configure这个shellscript便可以产生合适的Makefile文件了。

form:
http://blog.chinaunix.net/space.php?uid=11861796&do=blog&id=2813607
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: