当前位置:首页 > 嵌入式 > 嵌入式教程
[导读]在上一小节,读者已经了解到了make项目管理器的强大功能。的确,makefile可以帮助make完成它的使命,但要承认的是,编写makefile确实不是一件轻松的事,尤其对于一个较大的项目而言更是如此。那么,有没有一种轻松的手段生成makefile而同时又能让用户享受make的优越性呢?

3.6使用autotools

在上一小节,读者已经了解到了make项目管理器的强大功能。的确,makefile可以帮助make完成它的使命,但要承认的是,编写makefile确实不是一件轻松的事,尤其对于一个较大的项目而言更是如此。那么,有没有一种轻松的手段生成makefile而同时又能让用户享受make的优越性呢?本节要讲的autotools系列工具正是为此而设的,它只需用户输入简单的目标文件、依赖文件、文件目录等就可以轻松地生成makefile了,这无疑是广大用户所希望的。另外,这些工具还可以完成系统配置信息的收集,从而可以方便地处理各种移植性的问题。也正是基于此,现在Linux上的软件开发一般都用autotools来制作makefile,读者在后面的讲述中就会了解到。

3.6.1autotools使用流程

正如前面所言,autotools是系列工具,读者首先要确认系统是否装了以下工具(可以用which命令进行查看)。

n aclocal

n autoscan

n autoconf

n autoheader

n automake

使用autotools主要就是利用各个工具的脚本文件以生成最后的makefile。其总体流程是这样的。

n 使用aclocal生成一个“aclocal.m4”文件,该文件主要处理本地的宏定义;

n 改写“configure.scan”文件,并将其重命名为“configure.in”,并使用autoconf文件生成configure文件。

接下来,笔者将通过一个简单的hello.c例子带领读者熟悉autotools生成makefile的过程,由于在这过程中会涉及较多的脚本文件,为了更清楚地了解相互之间的关系,强烈建议读者实际动手操作以体会其整个过程。

1.autoscan

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

[root@localhostautomake]#autoscan

autom4te:configure.ac:nosuchfileordirectory

autoscan:/usr/bin/autom4tefailedwithexitstatus:1

[root@localhostautomake]#ls

autoscan.logconfigure.scanhello.c

由上述代码可知autoscan首先会尝试去读入“configure.ac”(同configure.in的配置文件)文件,此时还没有创建该配置文件,于是它会自动生成一个“configure.in”的原型文件“configure.scan”。

2.autoconf

configure.in是autoconf的脚本配置文件,它的原型文件“configure.scan”如下所示:

#-*-Autoconf-*-

#Processthisfilewithautoconftoproduceaconfigurescript.

AC_PREREQ(2.59)

#Thenextoneismodifiedbydavid

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

AC_INIT(hello,1.0)

#Thenextoneisaddedbydavid

AM_INIT_AUTOMAKE(hello,1.0)

AC_CONFIG_SRCDIR([hello.c])

AC_CONFIG_HEADER([config.h])

#Checksforprograms.

AC_PROG_CC

#Checksforlibraries.

#Checksforheaderfiles.

#Checksfortypedefs,structures,andcompilercharacteristics.

#Checksforlibraryfunctions.

AC_CONFIG_FILES([makefile])

AC_OUTPUT

下面对这个脚本文件进行解释。

n 以“#”号开始的行是注释。

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

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

n AM_INIT_AUTOMAKE是笔者另加的,它是automake所必备的宏,使automake自动生成makefile.in,也同前面一样,PACKAGE是所要产生软件套件的名称,VERSION是版本编号。

n AC_CONFIG_SRCDIR宏用来检查所指定的源码文件是否存在,以及确定源码目录的有效性。在此处源码文件为当前目录下的hello.c。

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

n AC_CONFIG_FILES宏用于生成相应的makefile文件。

n 中间的注释之间可以分别添加用户测试程序、测试函数库、测试头文件等宏定义。

接下来首先运行aclocal,生成一个“aclocal.m4”文件,该文件主要处理本地的宏定义。如下所示:

[root@localhostautomake]#aclocal

再接着运行autoconf,生成“configure”可执行文件。如下所示:

[root@localhostautomake]#autoconf

[root@localhostautomake]#ls

aclocal.m4autom4te.cacheautoscan.logconfigureconfigure.inhello.c

3.autoheader

接着使用autoheader命令,它负责生成config.h.in文件。该工具通常会从“acconfig.h”文件中复制用户附加的符号定义,因为这里没有附加符号定义,所以不需要创建“acconfig.h”文件。如下所示:

[root@localhostautomake]#autoheader

4.automake

这一步是创建makefile很重要的一步,automake要用的脚本配置文件是makefile.am,用户需要自己创建相应的文件。之后,automake工具转换成makefile.in。在该例中,笔者创建的文件为makefile.am,如下所示:

AUTOMAKE_OPTIONS=foreign

bin_PROGRAMS=hello

hello_SOURCES=hello.c

下面对该脚本文件的对应项进行解释。

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

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

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

接下来可以使用automake命令来生成“configure.in”文件,在这里使用选项“-a”(或者“—adding-missing”)可以让automake自动添加一些必需的脚本文件。如下所示:

[root@localhostautomake]#automake–a(或者automake--add-missing)

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

configure.in:installing'./missing'

makefile.am:installing'depcomp'

[root@localhostautomake]#ls

aclocal.m4autoscan.logconfigure.inhello.cmakefile.ammissing

autom4te.cacheconfiguredepcompinstall-shmakefile.inconfig.h.in

可以看到,在automake之后就可以生成configure.in文件。

5.运行configure

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

[root@localhostautomake]#./configure

checkingforaBSD-compatibleinstall.../usr/bin/install-c

checkingwhetherbuildenvironmentissane...yes

checkingforgawk...gawk

checkingwhethermakesets$(MAKE)...yes

checkingforgcc...gcc

checkingforCcompilerdefaultoutputfilename...a.out

checkingwhethertheCcompilerworks...yes

checkingwhetherwearecrosscompiling...no

checkingforsuffixofexecutables...

checkingforsuffixofobjectfiles...o

checkingwhetherweareusingtheGNUCcompiler...yes

checkingwhethergccaccepts-g...yes

checkingforgccoptiontoacceptANSIC...noneneeded

checkingforstyleofincludeusedbymake...GNU

checkingdependencystyleofgcc...gcc3

configure:creating./config.status

config.status:creatingmakefile

config.status:executingdepfilescommands

可以看到,在运行configure时收集了系统的信息,用户可以在configure命令中对其进行方便的配置。在./configure的自定义参数有两种,一种是开关式(--enable-XXX或--disable-XXX),另一种是开放式,即后面要填入一串字符(--with-XXX=yyyy)参数。读者可以自行尝试其使用方法。另外,读者可以查看同一目录下的“config.log”文件,以方便调试之用。

到此为止,makefile就可以自动生成了。回忆整个步骤,用户不再需要定制不同的规则,而只需要输入简单的文件及目录名即可,这样就大大方便了用户的使用。autotools生成makefile的流程如图3.9所示。

图3.9autotools生成makefile的流程图

3.6.2使用autotools所生成的makefile

autotools生成的makefile除具有普通的编译功能外,还具有以下主要功能(感兴趣的读者可以查看这个简单的hello.c程序的makefile)。

1.make

键入make默认执行“makeall”命令,即目标体为all,其执行情况如下所示:

[root@localhostautomake]#make

ifgcc-DPACKAGE_NAME=""-DPACKAGE_TARNAME=""-DPACKAGE_VERSION=""-DPACKAGE_STRING=""-DPACKAGE_BUGREPORT=""-DPACKAGE="hello"-DVERSION="1.0"-I.-I.-g-O2-MThello.o-MD-MP-MF".deps/hello.Tpo"-c-ohello.ohello.c;

thenmv-f".deps/hello.Tpo"".deps/hello.Po";elserm-f".deps/hello.Tpo";exit1;fi

gcc-g-O2-ohellohello.o

此时在本目录下就生成了可执行文件“hello”,运行“./hello”能出现正常结果,如下所示:

[root@localhostautomake]#./hello

Hello!Autoconf!

2.makeinstall

此时,会把该程序安装到系统目录中去,如下所示:

[root@localhostautomake]#makeinstall

ifgcc-DPACKAGE_NAME=""-DPACKAGE_TARNAME=""-DPACKAGE_VERSION=""-DPACKAGE_STRING=""-DPACKAGE_BUGREPORT=""-DPACKAGE="hello"-DVERSION="1.0"-I.-I.-g-O2-MThello.o-MD-MP-MF".deps/hello.Tpo"-c-ohello.ohello.c;

thenmv-f".deps/hello.Tpo"".deps/hello.Po";elserm-f".deps/hello.Tpo";exit1;fi

gcc-g-O2-ohellohello.o

make[1]:Enteringdirectory'/root/workplace/automake'

test-z"/usr/local/bin"||mkdir-p--"/usr/local/bin"

/usr/bin/install-c'hello''/usr/local/bin/hello'

make[1]:Nothingtobedonefor'install-data-am'.

make[1]:Leavingdirectory'/root/workplace/automake'

此时,若直接运行hello,也能出现正确结果,如下所示:

[root@localhostautomake]#hello

Hello!Autoconf!

3.makeclean

此时,make会清除之前所编译的可执行文件及目标文件(objectfile,*.o),如下所示:

[root@localhostautomake]#makeclean

test-z"hello"||rm-fhello

rm-f*.o

4.makedist

此时,make将程序和相关的文档打包为一个压缩文档以供发布,如下所示:

[root@localhostautomake]#makedist

[root@localhostautomake]#lshello-1.0-tar.gz

hello-1.0-tar.gz

可见该命令生成了一个hello-1.0-tar.gz压缩文件。

由上面的讲述读者不难看出,autotools是软件维护与发布的必备工具,鉴于此,如今GUN的软件一般都是由automake来制作的。

想一想

对于automake制作的这类软件,应如何安装呢?

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭