来谈谈:autoconf和automake天生Makefile文件
在这里你会学到更多的知识,学习linux,更要学习一种geek的精神,python之禅中也说过:以总结分享为荣,以跪求其解为耻;引子 不管是在Linux仍是在Unix情况中,make都是一个十分主要的编译命令。不论是本人举行项目开辟仍是安装使用软件,我们都常常要用到make或makeinstall。使用make工具,我们能够将年夜型的开辟项目分化成为多个更容易于办理的模块,关于一个包含几百个源文件的使用程序,利用make和makefile工具就能够十拿九稳的理顺各个源文件之间纷纷庞大的互相干系。
可是假如经由过程查阅make的匡助文档来手工编写Makefile,对任何程序员都是一场应战。幸而有GNU供应的Autoconf及Automake这两套工具使得编写makefile不再是一个困难。
本文将先容怎样使用GNUAutoconf及Automake这两套工具来帮忙我们主动发生Makefile文件,而且闪开收回来的软件能够像年夜多半源码包那样,只需"./configure","make","makeinstall"就能够把程序安装到体系中。
摹拟需求
假定源文件按以下目次寄存,如所示,使用autoconf和automake天生makefile文件。
http://www.ckuyun.com/
文件目次布局
假定src是我们源文件目次,include目次寄存其他库的头文件,lib目次寄存用到的库文件,然后入手下手按模块寄存,每一个模块都有一个对应的目次,模块下再份子模块,如apple、orange。每一个子目次下又分core,include,shell三个目次,个中core和shell目次寄存.c文件,include的寄存.h文件,其他相似。
样例程序功效:基于多线程的数据读写回护。
工具简介
所必需的软件:autoconf/automake/m4/perl/libtool(个中libtool非必需)。
autoconf是一个用于天生能够主动地设置软件源码包,用以顺应多种UNIX类体系的shell剧本工具,个中autoconf必要用到m4,便于天生剧本。automake是一个从Makefile.am文件主动天生Makefile.in的工具。为了天生Makefile.in,automake还需用到perl,因为automake创立的公布完整遵守GNU尺度,以是在创立中不必要perl。libtool是一款便利天生各类程序库的工具。
今朝automake撑持三种目次条理:flat、shallow和deep。
1)flat指的是一切文件都位于统一个目次中。
就是一切源文件、头文件和其他库文件都位于以后目次中,且没有子目次。Termutils就是这一类。
2)shallow指的是次要的源代码都贮存在顶层目次,其他各个部分则贮存在子目次中。
就是次要源文件在以后目次中,而别的一些完成各部分功效的源文件位于各自分歧的目次。automake自己就是这一类。
3)deep指的是一切源代码都被贮存在子目次中;顶层目次次要包括设置信息。
就是一切源文件及本人写的头文件位于以后目次的一个子目次中,而以后目次里没有任何源文件。GNUcpio和GNUtar就是这一类。
flat范例是最复杂的,deep范例是最庞大的。不丢脸出,我们的摹拟需求恰是基于第三类deep型,也就是说我们要做应战性的事变:)。注:我们的测试程序是基于多线程的复杂程序。
天生Makefile的前因后果
起首进进project目次,在该目次下运转一系列命令,创立和修正几个文件,就能够天生切合该平台的Makefile文件,操纵历程以下:
1)运转autoscan命令
2)将configure.scan文件重定名为configure.in,并修正configure.in文件
3)在project目次下新建Makefile.am文件,并在core和shell目次下也新建makefile.am文件
4)在project目次下新建NEWS、README、ChangeLog、AUTHORS文件
5)将/usr/share/automake-1.X/目次下的depcomp和complie文件拷贝到本目次下
6)运转aclocal命令
7)运转autoconf命令
8)运转automake-a命令
9)运转./confiugre剧本
能够经由过程看生产生Makefile的流程,如图所示:
天生Makefile流程图
Configure.in的陈腔滥调文
当我们使用autoscan工具天生confiugre.scan文件时,我们必要将confiugre.scan重定名为confiugre.in文件。confiugre.in挪用一系列autoconf宏来测试程序必要的或用到的特征是不是存在,和这些特征的功效。
上面我们就来目击一下confiugre.scan的庐山真脸孔:
#Processthisfilewithautoconftoproduceaconfigurescript.
AC_PREREQ(2.59)
AC_INIT(FULL-PACKAGE-NAME,VERSION,BUG-REPORT-ADDRESS)
AC_CONFIG_SRCDIR()
AC_CONFIG_HE
1234下一页
对于linux命令,一定要学会用man和info去查他们的解释;
来谈谈:autoconf和automake天生Makefile文件
但不会命令而成为高手也是不可能的.这就好比学英语,什么语法都不懂,只捧着单词手册背单词是学不会英语的,但是没有单词词汇量英语水平也提不高的。ADER()</P> #Checksforprograms.
AC_PROG_CC
#Checksforlibraries.
#FIXME:Replace`mainwithafunctionin`-lpthread:
AC_CHECK_LIB(,)
#Checksforheaderfiles.
#Checksfortypedefs,structures,andcompilercharacteristics.
#Checksforlibraryfunctions.
AC_OUTPUT
每一个configure.scan文件都是以AC_INIT开首,以AC_OUTPUT停止。我们不难从文件中看出confiugre.in文件的一样平常结构:
AC_INIT测试程序测试函数库测试头文件测试范例界说测试布局测试编译器特征测试库函数测试体系挪用AC_OUTPUT
下面的挪用序次只是倡议性子的,但我们仍是激烈倡议不要随便改动对宏挪用的序次。
如今就入手下手修正该文件:
$mvconfigure.scanconfigure.in$vimconfigure.in
修正后的了局以下:
#-*-Autoconf-*-
#Processthisfilewithautoconftoproduceaconfigurescript.
AC_PREREQ(2.59)
AC_INIT(test,1.0,normalnotebook@126.com)
AC_CONFIG_SRCDIR()
AM_CONFIG_HEADER(config.h)
AM_INIT_AUTOMAKE(test,1.0)
#Checksforprograms.
AC_PROG_CC
#Checksforlibraries.
#FIXME:Replace`mainwithafunctionin`-lpthread:
AC_CHECK_LIB(,)
AC_PROG_RANLIB
#Checksforheaderfiles.
#Checksfortypedefs,structures,andcompilercharacteristics.
#Checksforlibraryfunctions.
AC_OUTPUT([Makefile
src/lib/Makefile
src/ModuleA/apple/core/Makefile
src/ModuleA/apple/shell/Makefile
])
个中要将AC_CONFIG_HEADER()修正为:AM_CONFIG_HEADER(config.h),并到场AM_INIT_AUTOMAKE(test,1.0)。因为我们的测试程序是基于多线程的程序,以是要到场AC_PROG_RANLIB,否则运转automake命令时会堕落。在AC_OUTPUT输出要创立的Makefile文件名。
因为我们在程序中利用了读写锁,以是必要对库文件举行反省,即AC_CHECK_LIB(,),该宏的寄义以下:
http://www.ckuyun.com/
个中,LIBS是link的一个选项,具体请参看后续的Makefile文件。因为我们在程序中利用了读写锁,以是我们测试pthread库中是不是存在pthread_rwlock_init函数。
因为我们是基于deep范例来创立makefile文件,以是我们必要在到处创立Makefile文件。即:project目次下,lib目次下,core和shell目次下。
Autoconf供应了良多内置宏来做相干的检测,限于篇幅干系,我们在这里对其他宏不做具体的注释,详细请参看参考文献1和参考文献2,也可参看autoconf信息页。
实战Makefile.am
Makefile.am是一种比Makefile更高条理的划定规矩。只需指定要天生甚么方针,它由甚么源文件天生,要安装到甚么目次等组成。
表一列出了可实行文件、静态库、头文件和数据文件,四种誊写Makefile.am文件个一样平常格局。
<P> 表1Makefile.am一样平常格局
关于可实行文件和静态库范例,假如只想编译,不想安装到体系中,能够用noinst_PROGRAMS取代bin_PROGRAMS,noinst_LIBRARIES取代lib_LIBRARIES。
上一页1234下一页
如果你只是想应付一下操作系统的课程,劝你最好别学,或者说不要指望能用的怎么样。
来谈谈:autoconf和automake天生Makefile文件
初学阶段只要把上课时候学习过的命令练熟就可以了.单靠学习各种命令而成为高手是不可能的。Makefile.am还供应了一些全局变量供一切的方针体利用:</P> 表2Makefile.am中可用的全局变量
在Makefile.am中只管利用绝对路径,体系预界说了两个基础路径:
表3Makefile.am中可用的路径变量
在上文中我们提到过安装路径,automake设置了默许的安装路径:
1)尺度安装路径
默许安装路径为:$(prefix)=/usr/local,能够经由过程./configure--prefix=<new_path>的办法来掩盖。
别的的预界说目次还包含:bindir=$(prefix)/bin,libdir=$(prefix)/lib,datadir=$(prefix)/share,sysconfdir=$(prefix)/etc等等。
2)界说一个新的安装路径
好比test,可界说testdir=$(prefix)/test,然后test_DATA=test1test2,则test1,test2会作为数据文件安装到$(prefix)//test目次下。
我们起首必要在工程顶层目次下(即project/)创立一个Makefile.am来指明包括的子目次:
SUBDIRS=src/libsrc/ModuleA/apple/shellsrc/ModuleA/apple/coreCURRENTPATH=$(shell/bin/pwd)INCLUDES=-I$(CURRENTPATH)/src/include-I$(CURRENTPATH)/src/ModuleA/apple/includeexportINCLUDES
因为每一个源文件城市用到不异的头文件,以是我们在最顶层的Makefile.am中包括了编译源文件时所用到的头文件,并导出,见蓝色部分代码。
我们将lib目次下的swap.c文件编译成libswap.a文件,被apple/shell/apple.c文件挪用,那末lib目次下的Makefile.am以下所示:
noinst_LIBRARIES=libswap.alibswap_a_SOURCES=swap.cINCLUDES=-I$(top_srcdir)/src/includ
仔细的读者大概就会问:怎样表1中给出的是bin_LIBRARIES,而这里是noinst_LIBRARIES?这是由于假如只想编译,而不想安装到体系中,就用noinst_LIBRARIES取代bin_LIBRARIES,关于可实行文件就用noinst_PROGRAMS取代bin_PROGRAMS。关于安装的情形,库将会安装到$(prefix)/lib目次下,可实行文件将会安装到${prefix}/bin。假如想安装该库,则Makefile.am示比方下:
bin_LIBRARIES=libswap.alibswap_a_SOURCES=swap.cINCLUDES=-I$(top_srcdir)/src/includeswapincludedir=$(includedir)/swapswapinclude_HEADERS=$(top_srcdir)/src/include/swap.h
最初两行的意义是将swap.h安装到${prefix}/include/swap目次下。
接上去,关于可实行文件范例的情形,我们将会商怎样写Makefile.am?关于编译apple/core目次下的文件,我们写成的Makefile.am以下所示:
noinst_PROGRAMS=testtest_SOURCES=test.ctest_LDADD=$(top_srcdir)/src/ModuleA/apple/shell/apple.o$(top_srcdir)/src/lib/libswap.atest_LDFLAGS=-D_GNU_SOURCEDEFS+=-D_GNU_SOURCE#LIBS=-lpthread
因为我们的test.c文件在链接时,必要apple.o和libswap.a文件,以是我们必要在test_LDADD中包括这两个文件。关于Linux下的旌旗灯号量/读写锁文件举行编译,必要在编译选项中指明-D_GNU_SOURCE。以是在test_LDFLAGS中指明。而test_LDFLAGS只是链接时的选项,编译时一样必要指明该选项,以是必要DEFS来指明编译选项,因为DEFS已有初始值,以是这里用+=的情势指明。从这里能够看出,Makefile.am中的语法与Makefile的语法分歧,也能够接纳前提表达式。假如你的程序还包括其他的库,除用AC_CHECK_LIB宏来指明外,还能够用LIBS来指明。
假如你只想编译某一个文件,那末Makefile.am怎样写呢?这个文件也很复杂,写法跟可实行文件的差未几,以下例所示:
noinst_PROGRAMS=appleapple_SOURCES=apple.cDEFS+=-D_GNU_SOURCE
我们这里只是棍骗automake,伪装要天生apple文件,让它为我们天生依附干系和实行命令。以是当你运转完automake命令后,然后修正apple/shell/下的Makefile.in文件,间接将LINK语句删除,即:
…….clean-noinstPROGRAMS:-test-z"$(noinst_PROGRAMS)"||rm-f$(noinst_PROGRAMS)apple$(EXEEXT):$(apple_OBJECTS)$(apple_DEPENDENCIES)@rm-fapple$(EXEEXT)#$(LINK)$(apple_LDFLAGS)$(a
上一页1234下一页
要明白学好linux不是一件一蹴而就的事,一定要能坚持使用它,特别是在使用初期。
来谈谈:autoconf和automake天生Makefile文件
学习linux,就意味着更快的开发效率,等更多关于软件本身或者说操作系统本身的理解。pple_OBJECTS)$(apple_LDADD)$(LIBS)…….</P> 经由过程上述处置,就能够到达我们的目标。从中不丢脸出为何要修正Makefile.in的缘故原由,而不是修正其他的文件。
</p>上一页1234
看不懂man文档的人.在linux中,命令可分为系统基本命令和应用程序命令.系统基本命令是所有的unix类系统都支持的命令,走到哪都不变,只要是unix类系统上就肯定有. 其实当你安装了一个完整的Linux系统后其中已经包含了一个强大的帮助,只是可能你还没有发现和使用它们的技巧。 学习Linux应具备的。[书籍+网络资源] 随着Linux技术的更加成熟、完善,其应用领域和市场份额继续快速增大。目前,其主要应用领域是服务器系统和嵌入式系统。然而,它的足迹已遍布各个行业,几乎无处不在。 清楚了解网络的基础知识,特别是在Linux下应用知识,如接入internet等等。 虽然大家都比较喜欢漂亮的mm,但是在学 linux 的过程中,还是要多和“男人”接触一下:P 遇到问题的时候,出来看说和上网查之外,就是要多用 linux 下的 man 命令找找帮助。 我们自学,就这个循环的过程中,我们学习了基本操作,用vi,shell,模拟内存的分配过程等一些OS管理。 得到到草率的回答或者根本得不到任何Linux答案。越表现出在寻求帮助前为解决问题付出的努力,你越能得到实质性的帮助。
页:
[1]