Automake实例应用研究.docx

上传人:b****5 文档编号:12213541 上传时间:2023-04-17 格式:DOCX 页数:18 大小:43.98KB
下载 相关 举报
Automake实例应用研究.docx_第1页
第1页 / 共18页
Automake实例应用研究.docx_第2页
第2页 / 共18页
Automake实例应用研究.docx_第3页
第3页 / 共18页
Automake实例应用研究.docx_第4页
第4页 / 共18页
Automake实例应用研究.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

Automake实例应用研究.docx

《Automake实例应用研究.docx》由会员分享,可在线阅读,更多相关《Automake实例应用研究.docx(18页珍藏版)》请在冰豆网上搜索。

Automake实例应用研究.docx

Automake实例应用研究

目录

1Aotumake概论1

2使用Automake前的准备工作2

3Automake使用指南2

3.1autotools的工作原理2

3.2编写Makefile.am3

3.2.1Makefile.am规则3

3.2.2库的生成5

3.2.3可执行文件的生成6

3.3编写configure.in文件6

3.3.1在configure.in中定义外部变量6

3.3.2给configure配置自定义参数7

4Automake的应用——使用Automake生成Makefile8

4.1Makefile的用处8

4.2使用Automake生成Makefile的优势8

4.3Automake应用实例9

4.3.3执行aclocal和Autoconf10

4.3.4编辑Makefile.am文件 10

4.3.5执行Automake10

4.3.6执行./configure10

4.4使用已定义好的宏生成Makefile12

4.4.1编辑configure.in文件14

4.4.2编辑Makefile.am文件15

5结束语17

1Aotumake概论

在Unix上写程式的人大概都碰过Makefile,尤其是用C来开发程式的人。

用make来开发和编译程式的确很方便,可是要写出一个Makefile就不简单了。

偏偏介绍Makefile的文件不多,GNUMake那份印出来要几百页的文件,光看完Overview就快阵亡了,难怪许多人闻Unix色变。

本文将介绍如何利用GNUAutoconf及Automake这两套软件来协助我们『自动』产生Makefile档,并且让开发出来的软件可以像Apache,MySQL和常见的GNU软件一样,只要会./configure,make,makeinstall就可以把程式安装到系统中。

如果您有心开发OpenSource的软件,或只是想在Unix系统下写写程式。

希望这份介绍文件能帮助您轻松地进入UnixProgramming的殿堂。

Makefile基本上就是『目标』(target),『关连』(dependencies)和『动作』三者所组成的一连串规则。

而make就会根据Makefile的规则来决定如何编译(compile)和连结(link)程式。

实际上make可做的不只是编译和连结程式,例如FreeBSD的portcollection中,Makefile还可以做到自动下载原始程式套件,解压缩(extract),修补(patch),设定,然后编译,安装至系统中。

Makefile基本构造虽然简单,但是妥善运用这些规则就也可以变出许多不同的花招。

却也因此,许多刚开始学习写Makefile时会感到没有规范可循,每个人写出来的Makefile长得都不太一样,不知道从何下手,而且常常会受限於自己的开发环境,只要环境变数不同或路径改一下,可能Makefile就得跟着修改。

虽然有GNUMakefileConventions(GNUMakefile惯例)订出一些使用GNU程式设计时撰写Makefile的一些标准和规范,但是内容很长而且很复杂,并且经常做些调整,为了减轻程式设计师维护Makefile的负担,因此有Automake。

程式设计师只需写一些预先定义好的巨集(macro),交给Automake处理後会产生一个可供Autoconf使用的Makefile.in档。

再配合利用Autoconf产生的自动设定档configure即可产生一份符合GNUMakefile惯例的Makeifle了。

2使用Automake前的准备工作

在开始试着用Automake之前,请先确认你的系统已经安装以下的软件:

1.GNUAutomake

2.GNUAutoconf

3.GNUm4

4.perl

5.GNULibtool(如果你需要产生sharedlibrary)

我会建议你最好也使用GNUC/C++编译器、GNUMake以及其它GNU的工具程式来做为开发的环境,这些工具都是属于OpenSourceSoftware不仅免费而且功能强大。

如果你是使用RedHatLinux可以找到所有上述软件的rpm档,FreeBSD也有现成的package可以直接安装,或着你也可以自行下载这些软件的原始档回来DIY。

以下的范例是在RedHatLinux5.2+CLE2的环境下所完成的。

3.Automake使用指南

Automake主要通过编辑Makefile.am来控制它的行为,下面就常用的三个Makefile.am配置做出说明。

3.1autotools的工作原理

autotools最终是为了生成Makefile,为此,需要使用到autotools系列工具的如下几个命令:

autoscan

aclocal

autoheader

autoconf

Automake

另外,还需要有两类输入文件:

configure.in和Makefile.am。

其中,configure.in是用来生成configure脚本的,configure脚本的作用主要有两个:

检测系统的环境,生成Makefile。

而Makefile.am则是生成Makefile的参数,它们之间是一一对应的。

一般来说,在一个工程中每个目录下都会有一个Makefile来管理当前目录下的文件。

所以,基本上每个目录中都需要编写一个Makefile.am,来描述当前目录下生成的Makefile的行为。

有了生成工具和输入文件,下面来看一下生成Makefile的流程,如下图所示:

需要说明的是autoscan工具的使用,autoscan检测当前目录下的所有文件,生成一个configure.scan,这个文件可以作为configure.in文件的雏形,在它的基础上稍做修改就可以作为configure.in文件来使用。

所以,autoscan工具只需要在工程创建时运行一次即可。

下面就来具体介绍两个输入文件的编写规则:

3.2编写Makefile.am

3.2.1Makefile.am规则

Makefile.am写起来相对简单,有共有5类规则,如下表

表3.2.1Makefile.am中的规则

文件类型

书写格式

可执行文件

bin_PROGRAMS=foo

foo_SOURCES=xxx.cxxxx.c

foo_LDADD=

foo_LDFLAGS=

foo_DEPENDENCIES=

静态库

lib_LIBRARIES=foo.a

foo_a_SOURCES=xxx.cxxxx.c

foo_a_LDADD=

foo_a_LIBADD=

foo_a_LDFLAGS=

动态库

lib_LTLIBRARIES=foo.la

foo_la_SOURCES=xxx.cxxxx.c

foo_la_LDADD=

foo_la_LIBADD=

foo_la_LDFLAGS=

头文件

include_HEADERS=foo.h

noinst_HEADERS=foo2.h

数据文件

data_DATA=data1data2

其中,生成动态库的同时还会自动生成一个静态库,所以在一般情况下都不直接使用静态库规则。

Makefile.am中还有一些可以直接使用的全局变量,表示所有目标所共享的一些属性,见下表:

表3.2.2Makefile.am中的变量

变量

含义

INCLUDES

编译时所需头文件

LDADD

链接时所需链接的库文件

LDFLAGS

链接时的选项

AM_CXXFLAGS

编译.cpp文件时的选项

AM_CFLAGS

编译.c文件时的选项

EXTRA_DIST

除源代码和一些默认的文件以外,其它需要打如发布包.tar.gz中的文件

SUBDIRS

在处理本目录之前要递归处理的子目录

top_srcdir

工程源码的最顶层目录

top_builddir

工程目标文件的最顶层目录

有了以上的规则和变量,我们可以完成最基本的Makefile.am编写,但在某些情况下,我们需要定义一些变量来控制工程中某些目标的生成:

比如库的版本号是不断变化的,需要定义一个变量来指代。

Makefile.am可以使用宏替换来实现这种功能,可以通过以下方式来引用一个宏:

@宏名@

这个宏的的定义是在configure.in中的,现在Makefile.am中所需要了解的规则和语法已经介绍完了,下面介绍一下如何使用这些规则来具体生成一个库和可执行程序。

3.2.2库的生成

要生成一个库,需要在Makefile.am中加入一套动态库规则(见表3.2.1),如现在要用hello1.cpp和hello2.cpp两个源文件生成动态库libhello.so,库的版本为1.0.10,库需要额外连接一个叫做libworld.so的库,我们可以这样写:

lib_LTLIBRARIES=hello.la

hello_la_SOURCES=hello1.cpphello2.cpp

hello_la_LIBADD=-lworld

hello_la_LDFLAGS=-version-info1.0.10

可以看到,在LIBADD规则中链接库文件的方法与使用g++编译时的相同。

但LDFLAGS规则中的属性就没有见过了。

实际上,这个参数是传给libtool生成库时使用的,除了-version-info这个参数之外,LDFLAGS编译库时还会经常使用下面两个参数:

-avoid-version生成不带版本号的库

-all-static生成为静态库

3.2.3可执行文件的生成

要生成一个可执行文件,需要加入一套可执行文件的规则(见表3.2.1),与生成动态库的规则很类似。

下面我们要使用源文件main.cpp生成可执行文件main,该可执行文件需要链接上面生成的库libhello.so,我们可以这样写:

bin_PROGRAMS=main

main_SOURCES=main.cpp

main_LDADD=-lhello

main_LDFLAGS=-I./include

3.3编写configure.in文件

与Makefile.am相比,configure.in文件写起来更复杂,因为configure.in文件中可以使用的资源要远多与Makefile.am。

但通常情况下,我们都可以借助autoscan工具帮助我们生成一个configure.in的模版,在此基础上再完善就可以了。

所以,实际上我们只需要在configure.in中修改以下两个参数就可以了:

AC_INIT(package_name,package_version,owner_email)

AC_CONFIG_FILES([makefile1_path

makefile2_path])

AC_INIT()选项中指明了工程的名字,当前工程的版本号,工程所有者的邮箱。

AC_CONFIG_FILES()中指明了所有要生成的Makefile的相对路径,由于每个Makefile都需要一个Makefile.am作参数,所以该选项中Makefile的数量和路径应与当前工程中Makefile.am的状态一致。

在经过上面的修改之后,一个configure.in文件就基本可以使用了,但通常情况下,我们需要对它进行更多的配置。

3.3.1在configure.in中定义外部变量

在configure.in中定义变量与写shell脚本时定义变量的语法相同,如我们要定义一个值为nihao的变量hello,我们可以这样写:

hello=nihao

但使用这个变量的方法就有些不同了,比如我们要将hello这个变量赋给hi这个变量,我们可以这样写:

hi=”$hello”

如果这个变量需要被外部引用的话(如在3.2.1节中提到的Makefile.am引用configure.in中定义的变量),需要一个额外的选项来完成,如我们要将hello定义为外部变量,可以写成:

AC_SUBST(hello)

而Makefile.am中也就可以通过对它的引用来完成对某些可变因子的替换,在Makefile.am中的引用方法见3.2.1节。

3.3.2给configure配置自定义参数

对于一个已经生成好的configure,执行./configure--help命令可以看到该脚本所支持的所有参数,其中大部分是其自带的。

同样,我们可以通过对configure.in的配置来给它添加新的参数。

可以配置的参数种类有很多种,常用的有以下2种格式:

--enable-xxx和--disable-xxx

--with-xxx和--with-out-xxx

可以分别通过以下2个宏来定义这两个参数:

AC_ENABLE (feature,action-if-given, [action-if-not-given])

AC_ARG_WITH (package,help-string, [action-if-given], [action-if-not-given])

这两种格式基本上可以互换,下面就以AC_ARG_WITH()为例,说明如何给configure加上一个自定义参数。

假设我们要增加一个选项表示是否需要编译一个名为agent的模块,可以这样写:

BUILD_AGENT=no

AC_ARG_WITH([agent],

[AS_HELP_STRING([--with-agent],

[buildagent(defaultisno)])],

[BUILD_AGENT=yes],

[BUILD_AGENT=no])

iftest"x$BUILD_AGENT"="xyes";then#判断是否加上了该参数

#做出相应动作

fi

这样./configure就新添了两个选项--with-agent和--with-out-agent,通过这两个选项可以控制变量BUILD_AGENT的值,然后做出相应的动作。

4Automake的应用——使用Automake生成Makefile

 4.1Makefile的用处

Makefile基本上就是『目标』(target),『关联』(dependencies)和『动作』三者所组成的一系列规则。

而make就是根据Makefile的规则决定如何编译(compile)和连接(link)程序或者其它动作。

当然,Makefile可做的不只是编译和连接程序,例如FreeBSD的portcollection中,Makefile还可以做到自动下载远程程序,解压缩(extract),打补丁(patch),设定,然后编译,安装到系统中。

4.2使用Automake生成Makefile的优势

Makefile基本结构虽然很简单,但是妥善运用这些规则就可以变换出许多不同的花样。

却也因为这样,许多人刚开始学写Makefile时会觉得没有规范可以遵循,每个人写出来的Makefile都不大一样,不知道从哪里下手,而且常常会受到开发环境的限制,只要环境参数不同或者路径更改,可能Makefile就得跟着修改。

虽然有GNUMakefileConventions(GNUMakefile惯例)制订出一些在进行GNU程序设计时写Makefile的一些标准和规范,但是其内容很长而且很复杂,并且经常作一些调整,为了减轻程序开发人员维护Makefile的负担,就出现了Automake。

利用Automake,编程者只需要写一些预先定义好的宏(macro),提交给Automake处理,就会产生一个可以供Autoconf使用的Makefile.in文件。

再配合使用Autoconf产生的自动配置文件configure即可产生一份符合GNUMakefile惯例的Makeifle了。

4.3Automake应用实例

Automake所产生的Makefile除了可以做到程序的编译和连接,也可以用来生成文档(如manualpage,info文件等),还可以有把源码文件包装起来以供发布,所以程序源代码所存放的目录结构最好符合GNU的标准惯例,接下来就用一个hello.c來做为例子。

在工作目录下建立一个新的子目录devel,再在devel下建立一个"hello"''的子目录,这个目录将作为存放hello这个程序及其相关文件的地方:

%mkdirdevel;cddevel;mkdirhello;cdhello

用编辑器写一个hello.c文件,

#include

intmain(intargc,char**argv)

{

printf(“Hello,GNU!

n”);

return0;

}

接下来就要用Autoconf及Automake來产生Makefile文件

4.3.1用autoscan产生configure.in的原型

执行autoscan后会产生一个configure.scan的文件,可以用它作为configure.in文件的蓝本。

 %autoscan

    %ls

    configure.scanhello.c

4.3.2编辑configure.scan文件

dnlProcessthisfilewithAutoconftoproduceaconfigurescript.

AC_INIT(hello.c)

AM_INIT_Automake(hello,1.0)

dnlChecksforprograms.

AC_PROG_CC

dnlChecksforlibraries.

dnlChecksforheaderfiles.

dnlChecksfortypedefs,structures,andcompilercharacteristics.

dnlChecksforlibraryfunctions.

AC_OUTPUT(Makefile)

4.3.3执行aclocal和Autoconf

分別会产生aclocal.m4及configure两个文件

%aclocal

%Autoconf

%ls

aclocal.m4configureconfigure.inhello.c

4.3.4编辑Makefile.am文件 

Automake_OPTIONS=foreign

bin_PROGRAMS=hello

hello_SOURCES=hello.c

 4.3.5执行Automake

add-missing,Automake会根据Makefile.am文件产生一些文件,包含最重要的Makefile.in

%Automake--add-missing

Automake:

configure.in:

installing`./install-sh''

Automake:

configure.in:

installing`./mkinstalldirs''

Automake:

configure.in:

installing`./missing''

 4.3.6执行./configure:

%./configure

creatingcache./config.cache

checkingforaBSDcompatibleinstall.../usr/bin/install-c

checkingwhetherbuildenvironmentissane...yes

checkingwhethermakesets${MAKE}...yes

checkingforworkingaclocal...found

checkingforworkingAutoconf...found

checkingforworkingAutomake...found

checkingforworkingautoheader...found

checkingforworkingmakeinfo...found

checkingforgcc...gcc

checkingwhethertheCcompiler(gcc)works...yes

checkingwhethertheCcompiler(gcc)isacross-compiler...no

checkingwhetherweareusingGNUC...yes

checkingwhethergccaccepts-g...yes

updatingcache./config.cache

creating./config.status

creatingMakefile

$ls

Makefileaclocal.m4config.statushello.cmkinstalldirs

Makefile.amconfig.cacheconfigureinstall-sh

Makefile.inconfig.logconfigure.inmissing

在目录下已经产生了一个Makefile文件,输入make指令就可以编译hello.c了

%make

gcc-DPACKAGE="hello"-DVERSION="1.0"-I.-I.-g-O2-chello.c

gcc-g-O2-ohellohello.o

你还可以试试“makeclean“,”makeinstall“,”makedist“:

[root@localhosthello]#makeclean

test-z"hello"||rm-fhello

rm-f*.ocore*.core

[root@localhosthello]#makeinstall

gcc-DPACKAGE="hello"-DVERSION="1.0"-I.-I.-g-O2-chello.c

gcc-g-O2-ohellohello.o

make[1]:

Enteringdirectory`/home/joe/devel/hello''

/bin/sh./mkinstalldirs/usr/local/bin

/usr/bin/install-chello/usr/local/bin/hello

make[1]:

Nothingtobedonefor`install-data-am''.

make[1]:

Leavi

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 其它课程

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1