如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
Makefile在Unix上写程式的人大概都碰过Makefile,尤其是用C来开发程式的人。用make来开发和编译程式的确很方便,可是要写出一个Makefile就不简单了。偏偏介绍Makefile的文件不多,GNUMake那份印出来要几百页的文件,光看完Overview就快阵亡了,难怪许多人闻Unix色变。本文将介绍如何利用GNUAutoconf及Automake这两套软体来协助我们『自动』产生Makefile档,并且让开发出来的软体可以像Apache,MySQL和常见的GNU软体一样,只要会``./configure'',``make'',``makeinstall''就可以把程式安装到系统中。如果您有心开发OpenSource的软体,或只是想在Unix系统下写写程式。希望这份介绍文件能帮助您轻松地进入UnixProgramming的殿堂。1.简介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之前,请先确认你的系统已经安装以下的软体:1.GNUAutomake2.GNUAutoconf3.GNUm44.perl5.GNULibtool(如果你需要产生sharedlibrary)我会建议你最好也使用GNUC/C++编译器、GNUMake以及其它GNU的工具程式来做为开发的环境,这些工具都是属於OpenSourceSoftware不仅免费而且功能强大。如果你是使用RedHatLinux可以找到所有上述软体的rpm档,FreeBSD也有现成的package可以直接安装,或着你也可以自行下载这些软体的原始档回来DIY。以下的范例是在RedHatLinux5.2+CLE2的环境下所完成的。3.一个简单的例子Automake所产生的Makefile除了可以做到程式的编译和连结,也已经把如何产生程式文件(如manualpage,info档及dvi档)的动作,还有把原始程式包装起来以供散的动作都考虑进去了,所以原始程式所存放的目录架构最好符合GNU的标准惯例,接下来我拿hello.c来做为例子。在工作目录下建立一个新的子目录``devel'',再在devel下建立一个``hello''的子目录,这个目录将作为我们存放hello这个程式及其相关档案的地方:%mkdirdevel%cddevel%mkdirhello%cdhello用编辑器写个hello.c档,#includeintmain(intargc,char**argv){printf(``Hello,GNU!\n'');return0;}接下来就要用Autoconf及Automake来帮我们产生Makefile档了,1.用autoscan产生一个configure.in的雏型,执行autoscan後会产生一个configure.scan的档案,我们可以用它做为configure.in档的蓝本。%autoscan%lsconfigure.scanhello.c2.编辑configure.scan档,如下所示,并且把它的档名改成configure.indnlProcessthisfilewithautoconftoproduceaconfigurescript.AC_INIT(hello.c)AM_INIT_AUTOMAKE(hello,1