




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Makefile在Unix上写程式的人大概都碰过Makefile,尤其是用C来开发程式的 人。用make来开发和编译程式的确很方便,可是要写出一个Makefile 就不简单了。偏偏介绍Makefile的文件不多,GNUMake那份印出来要几 百页的文件,光看完Overview就快阵亡了,难怪许多人闻Unix色变。 本文将介绍如何利用GNUAutoconf及Automake这两套软体来协助我们 自动产生Makefile档,并且让开发出来的软体可以像Apache, MySQL和常见的GNU软体一样,只要会./configure,make, makeinstall就可以把程式安装到系统中。如果您有心开发Open Source的软体,或只是想在Unix系统下写写程式。希望这份介绍文件能 帮助您轻松地进入UnixProgramming的殿堂。 1.简介 Makefile基本上就是目标(target),关连(dependencies)和 动作三者所组成的一连串规则。而make就会根据Makefile的规则 来决定如何编译(compile)和连结(link)程式。实际上,make可做的 不只是编译和连结程式,例如FreeBSD的portcollection中, Makefile还可以做到自动下载原始程式套件,解压缩(extract),修补 (patch),设定,然後编译,安装至系统中。 Makefile基本构造虽然简单,但是妥善运用这些规则就也可以变出许多不 同的花招。却也因此,许多刚开始学习写Makefile时会感到没有规范可 循,每个人写出来的Makefile长得都不太一样,不知道从何下手,而且 常常会受限於自己的开发环境,只要环境变数不同或路径改一下,可能 Makefile就得跟着修改。虽然有GNUMakefileConventions(GNU Makefile惯例)订出一些使用GNU程式设计时撰写Makefile的一些标 准和规范,但是内容很长而且很复杂,并且经常做些调整,为了减轻程式 设计师维护Makefile的负担,因此有了Automake。 程式设计师只需写一些预先定义好的巨集(macro),交给Automake处理 後会产生一个可供Autoconf使用的Makefile.in档。再配合利用 Autoconf产生的自动设定档configure即可产生一份符合GNUMakefile 惯例的Makeifle了。 2.上路之前 在开始试着用Automake之前,请先确认你的系统已经安装以下的软体: 1.GNUAutomake 2.GNUAutoconf 3.GNUm4 4.perl 5.GNULibtool(如果你需要产生sharedlibrary) 我会建议你最好也使用GNUC/C+编译器、GNUMake以及其它GNU的 工具程式来做为开发的环境,这些工具都是属於OpenSourceSoftware 不仅免费而且功能强大。如果你是使用RedHatLinux可以找到所有上述 软体的rpm档,FreeBSD也有现成的package可以直接安装,或着你也 可以自行下载这些软体的原始档回来DIY。以下的范例是在RedHat Linux5.2+CLE2的环境下所完成的。 3.一个简单的例子 Automake所产生的Makefile除了可以做到程式的编译和连结,也已经把 如何产生程式文件(如manualpage,info档及dvi档)的动作,还有 把原始程式包装起来以供散的动作都考虑进去了,所以原始程式所存放 的目录架构最好符合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档了, 1.用autoscan产生一个configure.in的雏型,执行autoscan後会产 生一个configure.scan的档案,我们可以用它做为configure.in 档的蓝本。 %autoscan %ls configure.scanhello.c 2.编辑configure.scan档,如下所示,并且把它的档名改成 configure.in dnlProcessthisfilewithautoconftoproduceacon figurescript. AC_INIT(hello.c) AM_INIT_AUTOMAKE(hello,1.0) dnlChecksforprograms. AC_PROG_CC dnlChecksforlibraries. dnlChecksforheaderfiles. dnlChecksfortypedefs,structures,andcompilerch aracteristics. dnlChecksforlibraryfunctions. AC_OUTPUT(Makefile) 3.执行aclocal和autoconf,分别会产生aclocal.m4及configure两个档案 %aclocal %autoconf %ls aclocal.m4configureconfigure.inhello.c 4.编辑Makefile.am档,内容如下 AUTOMAKE_OPTIONS=foreign bin_PROGRAMS=hello hello_SOURCES=hello.c 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 6.最後执行./configure, %./configure creatingcache./config.cache checkingforaBSDcompatibleinstall./usr/bin/in stall-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-co mpiler.no checkingwhetherweareusingGNUC.yes checkingwhethergccaccepts-g.yes updatingcache./config.cache creating./config.status creatingMakefile 现在你的目录下已经产生了一个Makefile档,下个make指令就可 以开始编译hello.c成执行档,执行./hello和GNU打声招呼吧! %make gcc-DPACKAGE=hello-DVERSION=1.0-I.-I.-g-O2-che llo.c gcc-g-O2-ohellohello.o %./hello Hello!GNU! 你还可以试试makeclean,makeinstall,makedist看看 会有什麽结果。你也可以把产生出来的Makefile秀给你的老板,让他从 此对你刮目相看:-) 4.一探究竟 上述产生Makefile的过程和以往自行编写的方式非常不一样,舍弃传统 自行定义make的规则,使用Automake只需用到一些已经定义好的巨集 即可。我们把巨集及目标(target)写在Makefile.am档内,Automake 读入Makefile.am档後会把这一串已经定义好的巨集展开并且产生对应的 Makefile.in档,然後再由configure这个shellscript根据 Makefile.in产生适合的Makefile。 Figure1:利用autoconf及automake产生Makefile的流程 上图中表示在上一节范例中所要用的档案以及产生出来的档案,有星号 (*)者代表可执行档。在此范例中可藉由Autoconf及Automake工具所 产生的档案有configure.scan、aclocal.m4、configure、Makefile.in, 需要我们加入设定者为configure.in及Makefile.am。 4.1编辑configure.in档 Autoconf是用来产生configure档的工具。configure是一个 shellscript,它可以自动设定原始程式以符合各种不同平台上Unix系 统的特性,并且根据系统叁数及环境产生合适的Makefile档或是C的标 头档(headerfile),让原始程式可以很方便地在这些不同的平台上被编 译出来。Autoconf会读取configure.in档然後产生configure这个shellscript。 configure.in档的内容是一连串GNUm4的巨集,这些巨集经过 autoconf处理後会变成检查系统特徵的shellscript。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档了。 4.2编辑Makefile.am档 接下来我们要编辑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档了。 4.3使用Makefile 利用configure所产生的Makefile档有几个预设的目标可供使用,我们 只拿其中几个简述如下: makeall 产生我们设定的目标,即此范例中的执行档。只打make也可以,此 时会开始编译原始码,然後连结,并且产生执行档。 makeclean 清除之前所编译的执行档及目的档(objectfile,*.o)。 makedistclean 除了清除执行档和目的档外,也把configure所产生的Makefile 也清除掉。 makeinstall 将程式安装至系统中。如果原始码编译无误,且执行结果正确,便可 以把程式安装至系统预设的执行档存放路径。如果我们用 bin_PROGRAMS巨集的话,程式会被安装至/usr/local/bin这个目 录。 makedist 将程式和相关的档案包装成一个压缩档以供散播(distribution)。 执行完在目录下会产生一个以PACKAGE-VERSION.tar.gz为名称的档 案。PACKAGE和VERSION这两个变数是根据configure.in档中 AM_INIT_AUTOMAKE(PACKAGE,VERSION)的定义。在此范例中会产生 hello-1.0.tar.gz的档案。 makedistcheck 和makedist类似,但是加入检查包装後的压缩档是否正常。这个 目标除了把程式和相关档案包装成tar.gz档外,还会自动把这个压 缩档解开,执行configure,并且进行makeall的动作,确认编译 无误後,会显示这个tar.gz档已经准备好可供散播了。这个检查非 常有用,检查过关的套件,基本上可以给任何一个具备GNU发展环 境的人去重新编译。就hello-1.tar.gz这个范例而言,除了在Red HatLinux上,在FreeBSD2.2.x版也可以正确地重新编译。 要注意的是,利用Autoconf及Automake所产生出来的软体套件是可以 在没有安装Autoconf及Automake的环境上使用的,因为configure是 一个shellscript,它己被设计可以在一般Unix的sh这个shell下 执行。但是如果要修改configure.in及Makefile.am档再产生新的 configure及Makefile.in档时就一定要有Autoconf及Automake了。 5.相关讯息 Autoconf和Automake功能十分强大,你可以从它们所附的info档找到 详细的用法。你也可以从许多现存的GNU软体或OpenSource软体中找 到相关的configure.in或Makefile.am档,它们是学习Autoconf及 Automake更多技巧的最佳范例。 这篇简介只用到了Autoconf及Automake的皮毛罢了,如果你有心加入 OpenSource软体开发的行列,希望这篇文件能帮助你对产生Makefile 有个简单的依据。其它有关开发GNU程式或C程式设计及Makefile的 详细运用及技巧,我建议你从GNUCodingStandards3(GNU编码标准规 定)读起,里面包含了GNUMakefile惯例,还有发展GNU软体套件的标 准程序和惯例。这些GNU软体的线上说明文件可以在 /这个网站上找到。 6.结语 经由Autoconf及Automake的辅助,产生一个Makefile似乎不再像以 前那麽困难了,而使用Autoconf也
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 班组级安全培训重点内容课件
- 中国银行2025半结构化面试15问及话术山西地区
- 邮储银行2025延边朝鲜族自治州半结构化面试15问及话术
- 2025行业消费者洞察研究
- 邮储银行2025汕尾市小语种岗笔试题及答案
- 工商银行2025汕头市秋招笔试性格测试题专练及答案
- 建设银行2025萍乡市秋招英文面试题库及高分回答
- 建设银行2025白山市金融科技岗笔试题及答案
- 邮储银行2025数据分析师笔试题及答案黑龙江地区
- 农业银行2025云浮市秋招笔试EPI能力测试题专练及答案
- 黄石二中高一年级10月月考英语试卷含答案
- 第二章-食品标准化与标准的制定和编写课件
- 《陆上风电场工程设计概算编制规定及费用标准》(NB-T 31011-2019)
- SJ-T 11805-2022 人工智能从业人员能力要求
- 高职大学生心理健康教育 第四版 课件 第二单元 完善自我意识
- 电机与拖动(高职)全套教学课件
- 建筑质量事故分析全套教学课件
- 急诊科护士的突发事件应急处置
- 屋檐下的腊八粥
- 妇产科母乳喂养质量持续改进QCC品管圈PDCA案4例
- 固定管板式换热器检修要点
评论
0/150
提交评论