还剩5页未读,继续阅读
文本内容:
使用和构建全过程autoconf automake Makefile作为下的程序开发人员,大家一定都遇到过用命令来编译自己写的Linux Makefile,make程序确实是很方便一般情况下,大家都是手工写一个简单如果要想写出一个符合自Makefile,由软件惯例的就不那么容易了Makefile在本文中,将给大家介绍如何使用和两个工具来帮助我们自动地生成符autoconf automake合自由软件惯例的,这样就可以象常见的程序一样,只要使用Makefile GNU”./configure”,“make”,“make instal”就可以把程序安装到Linux系统中去了这将特别适合想做开放源代码软件的程序开发人员,又或如果你只是自己写些小的程序,那么这个文章对你也会有很大Toy的帮助
一、介绍Makefile是用于自动编译和链接的,一个工程有很多文件组成,每一个文件的改变都会导Makefile致工程的重新链接,但是不是所有的文件都需要重新编译,中纪录有文件的信息,在Makefile时会决定在链接的时候需要重新编译哪些文件make的宗旨就是让编译器知道要编译一个文件需要依赖其他的哪些文件当那些依Makefile赖文件有了改变,编译器会自动的发现最终的生成文件已经过时,而重新编译相应的模块的基本结构不是很复杂,但当一个程序开发人员开始写时,经常会怀疑Makefile Makefile自己写的是否符合惯例,而且自己写的经常和自己的开发环境相关联,当系统环境变Makefile量或路径发生了变化后,可能还要跟着修改这样就造成了手工书写的诸多Makefile Makefile问题,恰好能很好地帮助我们解决这些问题automake使用,程序开发人员只需要写一些简单的含有预定义宏的文件,由根据automake autoconf一个宏文件生成由根据另一个宏文件生成再使用依configure,automake Makefile.in,configure据来生成一个符合惯例的下面我们将详细介绍的生Makefile.in MakefileMakefile automake成方法
二、使用的环境本文所提到的程序是基于发行版本,它包含了我们要用至的Linux FedoraCore release1ljautoconf,automake
三、从入手helloworld我们从大家最常使用的例子程序开始下面的过程如果简单地说来就是新建helloworld三个文件helloworld.cconfigure.inMakefile.am然后执行:aclocal;autoconf;automake-add-missing;./configure;make;./helloworld就可以看到被产生出来,而且可以将编译通过很简单吧,几条命Makefile helloworld.c令就可以做出一个符合惯例的感觉如何呀Makefile,现在开始介绍详细的过程、建目录1在你的工作目录下建一个目录,我们用它来存放程序及相关文件,helloworld helloworld如在下/home/my/build$mkdir helloword$cd helloworld、2helloworld.c然后用你自己最喜欢的编辑器写一个文件,如命令使用下hellowrokLc vihelloworld.c面的代码作为的内容heHoworld.cint mainintargc,char**argvprintfnHello,Linux World!\nn;return0;完成后保存退出现在在目录下就应该有一个你自己写的了helloworld helloworld.c、生成3configure我们使用命令来帮助我们根据目录下的源代码生成一个的模板文件autoscan configure.in命令$autoscan$lsconfigure.scan helloworld.c执行后在目录下会生成一个文件我们可以拿它作为hellowrold configure.scan,configure.in的蓝本现在将改名为并且编辑它,按下面的内容修改,去掉无关的语configure.scan configure.in,句内容开始===============================configure.in#Autoconf#Process thisfile withautoconf toproduce aconfigure script.AC」NITheHoworld・cAM_INIT_AUTOMAKEhelloworld,
1.0#Checks forprograms.AC_PROG_CC#Checks forlibraries.#Checks forheader files.#Checks fortypedefs,structures,and compilercharacteristics.#Checks forlibrary functions.AC_OUTPUTMakefile内容结束==============================configure.in然后执行命令和分别会产生及两个文件aclocal autoconf,aclocal.m4configure$aclocal$lsaclocal.m4configure.in helloworld.c$autoconf$lsaclocal.m4autom4te.cache configureconfigure.in helloworld.c大家可以看到内容是一些宏定义,这些宏经处理后会变成检查系统特configure.in autoconf性、环境变量、软件必须的参数的脚本shell是用来生成自动配置软件源代码脚本的工具脚本能独立于autoconf configureconfigure运行,且在运行的过程中,不需要用户的干预autoconf要生成文件,你必须告诉如何找到你所用的宏方式是使用程序configure autoconfaclocal来生成你的aclocaLm4根据文件的内容,自动生成文件是一个脚本程aclocal configure.in aclocaLm4aclocal perl序,它的定义是aclocal-create aclocal.m4by scanningconfigure.ac,9从这个列举编译软件时所需要各种参数的模板文件中创建autoconf configure.in configure需要宏处理器来处理生成脚本autoconf GNUm4aclocaLm4,configure是一个宏处理器将输入拷贝到输出,同时将宏展开宏可以是内嵌的,也可以是用m4户定义的除了可以展开宏,还有一些内建的函数,用来引用文件,执行命令,整数运算,m4文本操作,循环等既可以作为编译器的前端,也可以单独作为一个宏处理器m
4、新建4Makefile.am新建文件,命令Makefile.am$vi Makefile.am内容如下AUTOMAKE_OPTIONS=foreign bin_PROGRAMS=helloworldhelloworld_SOURCES=helloworld.c会根据你写的来自动生成中定义的宏和目automake Makefile.am Makefile.in Makefile.am标,会指导生成指定的代码例如,宏将导致编译和连接的目标被automake bin_PROGRAMS生成、运行5automake命令$automake-add-missingconfigure.in:installing./install-sh1configure.in:installing./mkinstalldirs1configure.in:installing./missing,Makefile.am:installing./depcomp会根据文件产生一些文件,包含最重要的automake Makefile.am Makefile.in、执行生成6configure Makefile$./condgurechecking fora BSD-compatible install.../usr/bin/install-cchecking whetherbuild environmentis sane...yeschecking forgawk...gawkchecking whethermake sets$MAKE...yeschecking forgcc...gccchecking forC compilerdefault output...a.outchecking whetherthe Ccompiler works...yeschecking whetherwe arecross compiling...nochecking forsuffix ofexecutables...checking forsuffix ofobject files...ochecking whetherwe areusing theGNU Ccompiler...yeschecking whethergcc accepts-g...yeschecking forgcc optionto acceptANSI C...none neededcheckingfor style of includeused bymake...GNUchecking dependencystyleofgcc...gcc3configure:creating./config.statusconfig.status:creating Makefileconfig.status:executing depfilescommands$Is-1Makefile-rw-rw-r-1yutao yutao15035Oct1510:40Makefile你可以看到,此时已经产生出来了Makefile、使用编译代码7Makefile$makeif gcc-DPACKAGE_NAME=m,-DPACKAGE-TARNAME=,,n-DPACKAGE_VERSION=,n-DPACKAGE_STRING=,n,-DPACKAGE_BUGREPORT=”-DPACKAGE=nhelloworldn-DVERSION=n
1.0n-L-I,-g-02-MT helloworld.o-MD-MP-MF.deps/helloworld.Tpon\-c-o helloworld.o test-fhelloworld.c11|echo.rhelloworld.c;\then mv-f n.deps/helloworld.Tpon n.deps/helloworld.Pon;\else rm-f n.deps/helloworld.Tpon;exit1;\figcc-g-02-o helloworldhelloworld.o运行helloworld$./helloworldHello,Linux World!这样就编译出来了,你如果按上面的步骤来做的话,应该也会很容易地编译出helloworld正确的文件你还可以试着使用一些其他的命令,如helloworld makemake clean,make install,看看它们会给你什么样的效果感觉如何?自己也能写出这么专业的老板make dist,Makefile,一定会对你刮目相看
四、深入浅出针对上面提到的各个命令,我们再做些详细的介绍、1autoscan是用来扫描源代码目录生成文件的可以用目录名做为参autoscan configure.scan autoscan数,但如果你不使用参数的话,那么将认为使用的是当前目录将扫描你所autoscan autoscan指定目录中的源文件,并创建行文件con gure.scan、2configure.scan包含了系统配置的基本选项,里面都是一些宏定义我们需要将它改名为configure.scanconfigure.in、3aclocal是一个脚本程序根据文件的内容,自动生成文aclocal perlaclocal configure.in aclocal.m4件的定义是aclocal aclocal-create aclocal.m4by scanningconflgure.ac^^、4autoconf是用来产生文件的是一个脚本,它能设置源程序来适应各种autoconf configureconfigure不同的操作系统平台,并且根据不同的系统来产生合适的从而可以使你的源代码能在Makefile,不同的操作系统平台上被编译出来文件的内容是一些宏,这些宏经过处理后会变成检查系统特性、环境configure.in autoconf变量、软件必须的参数的脚本文件中的宏的顺序并没有规定,但是你必须在shell configure.in所有宏的最前面和最后面分别加上」宏和宏AC NITACJ3UTPUT在中configure.ini#号表示注释,这个宏后面的内容将被忽略ACJNITFILE这个宏用来检查源代码所在的路径AM_INIT_AUTOMAKEPACKAGE,VERSION这个宏是必须的,它描述了我们将要生成的软件包的名字及其版本号是软件包的PACKAGE名字,是版本号当你使用命令时,它会给你生成一个类似的软件发行包,VERSION makedist其中就有对应的软件包的名字和版本号AC_PROG_CC这个宏将检查系统所用的编译器CAC_OUTPUTFILE这个宏是我们要输出的的名字Makefile我们在使用时,实际上还需要用到其他的一些宏,但我们可以用来帮我们自automake aclocal动产生执行后我们会得到文件aclocal aclocaLm4产生了和两个宏文件后,我们就可以使用来产生文件configure.in aclocal.m4autoconf configure了、5Makefile.am是用来生成行的,需要你手工书写中定义了一些内Makefile.am Makele.in Makefile.am容AUTOMAKE_OPTIONS这个是的选项在执行时,它会检查目录下是否存在标准软件包automake automakeGNU中应具备的各种文件,例如、、等文件我们将其设置成AUTHORS ChangeLogNEWS foreign时,会改用一般软件包的标准来检查automakebin_PROGRAMS这个是指定我们所要产生的可执行文件的文件名如果你要产生多个可执行文件,那么在各个名字间用空格隔开helloworld_SOURCES这个是指定产生时所需要的源代码如果它用到了多个源文件,那么请使用空“helloworld”格符号将它们隔开比如需要那么请写成helloworld.h,helloworld.c helloworld_SOURCES=helloworld.h helloworld.c如果你在定义了多个可执行文件,则对应每个可执行文件都要定义相对的bin_PROGRAMSfilename_SOURCES、6automake我们使用来产生automake-add-missing Makefile.in选项的定义是,它会让力口入--add-missing“add missingstandard filesto package”automake一个标准的软件包所必须的一些文件我们用产生出来的文件是符合惯例的,接下来我们只automakeMakefile.in GNU Makefile要执行这个脚本就可以产生合适的文件了configure shellMakefile、7Makefile在符合惯例的中,包含了一些基本的预先定义的操作GNU MakefielMakefilemake根据编译源代码,连接,生成目标文件,可执行文件Makefilemake clean清除上次的命令所产生的文件后缀为的文件及可执行文件make object“.o”make install将编译成功的可执行文件安装到系统目录中,一般为目录/usr/local/binmake dist产生发布软件包文件即这个命令将会将可执行文件及相关文件打distribution package包成一个压缩的文件用来作为发布软件的软件包它会在当前目录下生成一个名字类似tar.gz的文件和是我们在中定义“PACKAGE-VERSION.tar.gz”PACKAGE VERSION,configure.in的」AM NIT_AUTOMAKEPACKAGE,VERSIONmake distcheck生成发布软件包并对其进行测试检查,以确定发布包的正确性这个操作将自动把压缩包文件解开,然后执行命令,并且执行来确认编译不出现错误,最后提示你软件configure make,包已经准备好,可以发布了helloworld-
1.
0.tar.gz isready fordistributionmake distclean类似,但同时也将生成的文件全部删除掉,包括make cleanconfigure Makefile
五、结束语通过上面的介绍,你应该可以很容易地生成一个你自己的符合惯例的文件GNUMakefile及对应的项目文件如果你想写出更复杂的且符合惯例的,你可以参考一些开放代码的项目中的Makefile和文件,比如嵌入式数据库,单元测试configure.in Makefile.am sqlitecppunit。
个人认证
优秀文档
获得点赞 0