




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
(CSDN)—什么是makeile?WiodwsWindow的IDErofessiona,makefle要懂。這好像現(xiàn)有這么的HTML編輯器但果你想成一個(gè)專,還是要了解HTMLUnixmaefilee,型、功能、模塊分別放在若干個(gè)中,makefile定義了一系列的規(guī)則來(lái)指定,哪些文件作,因?yàn)閙akefile就像一個(gè)S一樣,其中也可以執(zhí)行操作系統(tǒng)令。make,VisualC++的nmake,Linux下GNU的make??梢?jiàn),makefile都成為了一種在工程方面現(xiàn)在講述如何寫(xiě)makefile的文章比較少,這是寫(xiě)這篇文章的原因。當(dāng)然,不同產(chǎn)我僅對(duì)GNU的make進(jìn)行講述,我的環(huán)境是RedHatLinux8.0,make的版本是3.80。必竟,這個(gè)make是應(yīng)用最為廣泛的,也是用得最多的。而且其還是最遵循于IEEE1003.2-1992pas,首先要把源文件編譯成中間代碼文件,在Windows.obj,UNIXo文件,即ObjectFile,這個(gè)動(dòng)作叫做編譯(compile)。然后再把大量的ObjectFile合你需要告訴編譯器頭文件的所在位置(頭文件中應(yīng)該只是,而定義應(yīng)該放在C/C++文件或是OBJ文件)來(lái)我們的應(yīng)用程序。器并不管函數(shù)所在的源文件,函數(shù)的中間目標(biāo)文件(ObjectFile),在大多數(shù)時(shí)候,由于源文件太多,編譯生成的中間目標(biāo)文件太多,而在時(shí)需要明顯地中間目標(biāo)文件名,這對(duì)于編譯很不方便,所以,我們要給中間目標(biāo)文件打個(gè)包,在Windows下這種包叫“庫(kù)文件”(LibraryFile),也就是.lib文件,在UNIX下,是ArchiveFile,也就是.a文件。 給出一個(gè)警告,但可以生成ObjectFile。而在程序時(shí),器會(huì)在所有的ObjectFile中找尋函數(shù)的實(shí)現(xiàn),如果找不到,那到就會(huì)報(bào)錯(cuò)誤碼(LinkerError),在VC下,這種錯(cuò)誤一般是:Link2001錯(cuò)誤,意思說(shuō)是說(shuō),器未能找到函數(shù)的實(shí)現(xiàn)。你需要指定函數(shù)的ObjectFile.MakefilemakeMakefilemake命令需要怎么樣的去編譯和如果這個(gè)工程的某幾個(gè)C文件被修改,那么我們只編譯被修改的C文件,并目標(biāo)如果這個(gè)工程的頭文件被改變了,那么我們需要編譯了這幾個(gè)頭文件的C文target...:prerequisites...target也就是一個(gè)目標(biāo)文件,可以是ObjectFile,也可以是執(zhí)行文件。還可以是一個(gè)command也就是make需要執(zhí)行令。(任意的S命令是Makefile的規(guī)則。也就是Makefile中最的內(nèi)容。edit:main.okbd.ocommand.odisy.o\insert.osearch.ofiles.outils.occ-oeditmain.okbd.ocommand.odisy.o\insert.osearch.ofiles.outils.omain.o:main.cdefs.hcc-cmain.ckbd.o:kbd.cdefs.hcommand.hcc-ckbd.ccommand.o:command.cdefs.hcommand.hcc-ccommand.cdisy.o:disy.cdefs.hbuffer.hcc-cdisy.cinsert.o:insert.cdefs.hbuffer.hcc-cinsert.csearch.o:search.cdefs.hbuffer.hcc-csearch.cfiles.o:files.cdefs.hbuffer.hcommand.hcc-cfiles.cutils.o:utils.cdefs.hcc-cutils.ccleanrmeditmain.okbd.ocommand.odisy.o\insert.osearch.ofiles.outils.o 只要簡(jiǎn)單地執(zhí)行一下“makeclean”就可以了。(*.o),依賴文件(prerequisites)就是冒號(hào)后面的那些.c文件和.h文件。每一.o.oedit要以一個(gè)Tab鍵作為開(kāi)頭。記住,make并不管命令是怎么工作的,他執(zhí)行所定義會(huì)自動(dòng)執(zhí)行其后所定義令。要執(zhí)行其后令,就要在make命令后明顯得這個(gè) 3、如果edit文件不存在,或是edit.oedit5、當(dāng)然,你的C文件和H文件是存在的啦,于是make.o.o么make就會(huì)直接退出,并報(bào)錯(cuò),而對(duì)于所定義令的錯(cuò)誤,或是編譯不成功,make根本“makeclean”,以此來(lái)清除所有的目標(biāo)文件,以便重編譯。系后面所定義令),于是file.o的文件也是的啦,于是file.o的文件修改時(shí)間要 譯,并且,edit會(huì)被重。edit:main.okbd.ocommand.odisy.o\insert.osearch.ofiles.outils.occ-oeditmain.okbd.ocommand.o y.oinsert.osearch.ofiles.o[.o](clean)然,我們的akefilmakefiemakefie的易,在maefilemakefleC語(yǔ)言比如,我們一個(gè)變量,叫objects,OBJECTS,objs,OBJS,obj,或是OBJ,反正objects=main.okbd.ocommand.odisy.o\insert.osearch.ofiles.outils.oobjects=main.okbd.ocommand.odisy.o\insert.osearch.ofiles.outils.oedit:cc-oedit$(objects)main.o:main.cdefs.hcc-cmain.ckbd.o:kbd.cdefs.hcommand.hcc-ckbd.ccommand.o:command.cdefs.hcommand.hcc-ccommand.c y.o: y.cdefs.hcc-cdisinsert.o:insert.cdefs.hbuffer.hcc-cinsert.csearch.o:search.cdefs.hbuffer.hcc-csearch.cfiles.o:files.cdefs.hbuffer.hcommand.hcc-cfiles.cutils.o:utils.cdefs.hcc-cutils.ccleanrmedit.oobjects到一個(gè)whatever.o,那么whatever.c,就會(huì)是whatever.o的依賴文件。并且cc-cwhatever.cmakefile再也不用寫(xiě)得這么復(fù)雜。我們的是新objects=main.okbd.ocommand.odisy.o\insert.osearch.ofiles.outils.oedit:cc-oeditmain.o:kbd.o:defs.hcommand.hcommand.o:defs.hcommand.hdisy.o:defs.hbuffer.hinsert.o:defs.hbuffer.hsearch.o:defs.hbuffer.hfiles.o:defs.hbuffer.hcommand.hutils.o:defs.h.PHONY:cleanclean:rmedit objects=main.okbd.ocommand.odisy.o\insert.osearch.ofiles.outils.oedit:cc-oedit$(objects):kbd.ocommand.ofiles.o:disy.oinsert.osearch.ofiles.o:.PHONY:cleanclean:rmeditrmedit.PHONY:cleanclean:-rmedit前面,.PHONY意思表示clean是一個(gè)“偽目標(biāo)”,。而在rm命令前面加了一個(gè)小減Makefile書(shū)寫(xiě)者明顯,要生成的文件,文件的依賴文件,生成令。5、注釋。Mkefile只有行釋,和UIX的S一樣,注釋是“#”字這個(gè)就像C/Maefile f”和“--file”參數(shù),如:make-fMake.Linux或make--fileMake.AIX。三、其它的include在include[Tb]鍵開(kāi)始。ncludeMakefil:a.mk、.mk、c.k,還foo.mae,(bar)e.mk和.mk,includefoo.make*.mkincludefoo.makea.mkb.mkc.mke.mkmake命令開(kāi)始時(shí),會(huì)把找尋include所的其它Makefile,并把其內(nèi)容安置在當(dāng)前的 會(huì)繼續(xù)載入其它的文件,一旦完成makefile的,make會(huì)再重試這些沒(méi)有找到,或是不能的文件,如果還是不行,make才會(huì)出現(xiàn)一條致命信息。如果你想讓make不理那些無(wú)法的文件,而繼續(xù)執(zhí)行,你可以在include前加一個(gè)減號(hào)“-”。如:-include事,只是為了告訴大家,也許有時(shí)候你的Makefile出現(xiàn)了怪事,那么你當(dāng)前環(huán)境———foo.ofoo.cdefs.hfoo模塊cc-c-gfoo.c看到這個(gè)例子,各位應(yīng)該不是很陌生了,前面也已,foo.o是我們的目標(biāo),foo.c和defs.h是目標(biāo)所依賴的源文件,而只有一個(gè)命令“cccgfoo.c”(以Tab鍵開(kāi)頭)。targets:prerequisitestargets:prerequisites;commandprerequisies()標(biāo)文件要,那么目標(biāo)就認(rèn)為是過(guò)時(shí)的,認(rèn)為是需重生成。這個(gè)面已經(jīng)講過(guò)了。當(dāng)前用戶的$HOME下的test。而“~hchen/test”則表示用戶hchen的宿主下的test。(這些都是Unix下的小知識(shí)了,make也支持)而在Windows或是MS-DOS下,用戶沒(méi)有宿主,那么波浪號(hào)所指的則根據(jù)環(huán)境變量“HOME”而定。rm-fprint:*.clpr-p$?touchprintobjects=objects:=$(wildcard存放在不同的中。所以,當(dāng)make需要去找尋文件的依賴關(guān)系時(shí),你可以在文件前加上 VPATH= 1、vpathpattern> 2、vpath 3、 vpath%.h vpath%.cfoovpath%blishvpath%.c vpath%.cfoo:barvpath%blish rm*.o(以“makeclean”來(lái)使用該目.PHONY:“makeclean”這樣。于是整個(gè)過(guò)程可以這樣寫(xiě):.PHONY:cleanrm*.oall:prog1prog2.PHONY:prog1:prog1.occ-oprog1prog1.oprog2:cc-oprog2prog3:prog3.osort.occ-oprog3prog3.osort.o達(dá)到了我們一口氣生成多個(gè)目標(biāo)的目的?!?PHONY:all”了“all”這個(gè)目標(biāo)為“偽.PHONY:clelcleanobjclel:cleanobjcleandiffrmprogramcleanobjrmcleandiffrm“makeclean”將清除所有要被清除的文件?!癱leanobj”和“cleandiff”這兩個(gè)偽目標(biāo)有點(diǎn)像“子程序”的意思。我們可以輸入“makeclel”和“makecleanobj”和“makecleandiff”命令來(lái)達(dá)到清除不同種類文件的目的。bigoutputlittleoutput:generatetext.g-$(substoutput,,$@)>bigoutput:generatetext.g-big>bigoutputlittleoutput:text.ggeneratetext.g-little>其中,-$(substoutput,,$@)中的“$”表示執(zhí)行一個(gè)Makefile的函數(shù),函數(shù)名為<targets...>:<target-pattern>:<prereq-patternsobjects=foo.oall:$(objects):%.o:$(CC)-c$(CFLAGS)$<-o尾的目標(biāo),也就是“foo.obar.o”,也就是變量$object集合的模式,而依賴模式“%.c”則取模式“%.o”的“%”,也就是“foobar”,并為其加下“.c”的后綴,于是,我們的依賴目標(biāo)就是“foo.cbar.c”。而命令中的“$<”和“$@”則是自動(dòng)化變量,“$<”表示所有的依賴目標(biāo)集(也就是“foo.cbar.c”),“$@”表示目標(biāo)集(也就是“foo.ofoo.o:$(CC)-c$(CFLAGS)foo.c-ofoo.obar.o:bar.c$(CC)-c$(CFLAGS)bar.c-ofiles=foo.elcbar.o$(filter%.o,$(files)):%.o:$(CC)-c$(CFLAGS)$<-o$(filter%.elc,$(files)):%.elc:%.elemacs-f pile$<$(filtero,$(files))表示調(diào)用Makefile的filter函數(shù),過(guò)濾“$filter”集,只要"main.o:main.ccc-Mmain.o:main.cgccMmain.cmain.o:main.cdefs.h/usr/include/stdio.h/usr/include/features.h/usr/include/sys/cdefs.h/usr/include/gnu/stubs.h/usr/include/bits/types.h/usr/include/bits/pthreadtypes.h/usr/include/bits/sched.h/usr/include/libio.h/usr/include/_G_config.h/usr/include/wchar.h/usr/include/bits/wchar.h/usr/include/gconv.hgccMMmain.cmain.o:main.cakefilMkefle我們可有其它來(lái)迂地實(shí)現(xiàn)能。GNU組建議把譯器為一個(gè)name.Makefie.d][.c]%.d:@set-e;rm-f$@;$(CC)-M$(CPPFLAGS)$<>$@.$$$$;sed's,\($*\)\.o[:]*,\1.o$@:,g'<$@.$$$$>$@;\rm-f$@.$$$$這個(gè)規(guī)則的意思是,所有的[.d]文件依賴于[.c]文件,“rmf$@”$<”]文件,“$“%.dCname.“name”“$$$$nae.d.1235”,第三行使用edsedmain.o:main.cmain.omain.d:main.c[.d]文件中加入的不只是依賴關(guān)系,包括生成令也可一并加入,讓每個(gè)[.d]文件都包sources=foo.cinclude$(sources[.cinclue.d]———我們?cè)赨NIX下可能會(huì)使用不同的S,但是make令默認(rèn)是被“/bin/sh”——@echoXXX echoXXX其后令。需要注意的是,如果你要讓上一條命令的結(jié)果應(yīng)用在下一條命令時(shí),你應(yīng)該cd/home/hchencd/home/hchen;當(dāng)我們執(zhí)行“makeexec”時(shí),第一個(gè)例子中的cd沒(méi)有作用,pwd會(huì)打印出當(dāng)前的 定義令解釋器沒(méi)有找到,其會(huì)給你令解釋器加上諸如“.exe”、“.com”、執(zhí)行下一條命令,當(dāng)規(guī)則中所有令成功返回后,這個(gè)規(guī)則就算是成功完成了。如果一 -rm-f 中,我們可以在每個(gè)中都書(shū)寫(xiě)一個(gè)該的Makefile,這有利于讓我們的Makefile變例如,我們有一個(gè)子叫subdir,這個(gè)下有個(gè)Makefile文件,來(lái)指明了這個(gè)目cdsubdir&&$(MAKE)-C較利于。這兩個(gè)例子的意思都是先進(jìn)入“subdir”,然后執(zhí)行make命令。Makefile中(如果你顯示的),但是不會(huì)覆蓋下層的Makefile中所定義的變量,除非 export<variableunexport<variableexportvariable=variable=valueexportvariableexportvariable:=variable:=valueexportvariableexportvariable+=variable+=valueexportvariable需要注意是,有個(gè)變量一個(gè)是S,個(gè)是AKEFLAGS這兩個(gè)量不管是否exportMakefieMAKEFILESmkeakefil”時(shí)有mkeMakefieAKEFILEMaefilecdsubdir&&$(MAKE)地。 是“/home/hchen/gnu/make”,如果我們使用“make-w”來(lái)執(zhí)行,那么當(dāng)進(jìn)入該 make:Enteringdirectory make:Leavingdirectory如果Makefile中出現(xiàn)一些相同命令序列,那么我們可以為這些相同令序列定義一definerun-yaccyacc$(firstword$^)mvy.tab.c$@序,因?yàn)閅acc程序總是生成“y.tab.c”的文件,所以第二行令就是把這個(gè)文件改改名foo.c:$(run-———在MakefilC/在Makefil/C++Makefieakefilakefil變量名字可以包含字符、數(shù)字,下劃線(可以是數(shù)字開(kāi)頭),但不應(yīng)該含有“Foo”和“FOO”是三個(gè)不同的變量名。傳統(tǒng)的Makefile的變量名是全大寫(xiě)名方式,objects=program.ofoo.outils.oprogram:$(objects)cc-oprogram$(objects):foo=prog.o:$(foo)$(foo)-$(foo)prog.o:prog.ccc-cprog.c先看第式,也就是簡(jiǎn)單的使用“=”號(hào),在“=”左側(cè)是變量,右側(cè)是變量的foo=$(bar)bar=$(ugh)ugh=Huh?echo我們執(zhí)行“makeall”將會(huì)打出變量$(foo)的值是“Huh?”($(foo)的值是CFLAGS=$(include_dirs)-Oinclude_dirs=-Ifoo-Ibar當(dāng)“CFLAGS”在命令中被展開(kāi)時(shí),會(huì)是“-IfooIbarO”。但這種形式也有不好的CFLAGS=$(CFLAGS)-A=B=x:=y:=$(x)x:=y:=foobarx:=latery:=$(x)barx:=foo那么,y的值是“bar”,而不是“foobar”ifeqcur-dir:=$(swhoami:=$(swhoami)host-type:=$(sarch)MAKE:=${MAKE}host-type=${host-type}whoami=${whoami}nullstringspace:=$(nullstring)#endofthenullstrin是一個(gè)EmtyspacEmptdir:=/foo/bar#directorytoputthefrobs ——“$(dir)/file”那么就了。FOO?=ifeq($(originFOO),FOO=barfoo:=a.ob.oc.obar:=所有以“.o”字串“結(jié)尾”全部替換成“.c”,所以我們的“$(bar)”的值就是“a.cb.cfoo:=a.ob.oc.obar:=$(foo:%.o=%.c)樣讓$(bar)變量的值為“a.cb.cc.c”。x=yy=a:=x=y=z=a:=x=y=z=a:=a:=$(z),也就是“o”x=variable1variable2:=oy=$(substz=a:=,“$($((z)))($(y)($(subst1,2,$(x))$(xariable”,sust“varible1”1”字串替換成“variabl1”“vriable2”first_second=a=b=secondall=$($a_$b)a_objects:=a.ob.oc.o1_objects:=1.o2.osources:=這個(gè)例子中,如果$(a1)的值是“a”的話,那么,$(sources)的值就是“a.cb.cc.c”;如果$(a1)的值是“1”,那么$(sources)的值是“1.c2.c3.c”。ifdefdo_sortfunc:=sortfunc:=stripbar:=adbgqfoo:=$($(func)這個(gè)示例中,如果定義了“do_sort”,那么:foo$(sortadbgqc),$(foo)的值就是“abcdgq”,而如果沒(méi)有定義“do_sort”,那么:foo$(sortadbgqc),調(diào)用的就是strip函數(shù)。dir=$(dir)_sources:=$(wildcard$(dir)/*.c)define$(dir)_printlprobjects=main.ofoo.obar.outils.oobjects+=another.o于是,我們的$(objects)值變成:“main.ofoo.obar.outils.oobjects=main.ofoo.obar.outils.oobjects:=$(objects)another.ovariable:=valuevariable+=morevariable:=variable:=$(variable)variable=valuevariable+=五、override如果有變量是通常make令行參數(shù)設(shè)置的,那么Makefile中對(duì)這個(gè)變量的賦值會(huì)被override<variable>=override<variable>:=override<variable>+=<moreoverridedefinefoo以有換行,這有利于定義一系列令(前面我們講過(guò)“命令包”的技術(shù)就是利用這個(gè)關(guān)變量。因?yàn)槊钚枰訹Tab]鍵開(kāi)頭,所以如果你用define定義令變量中沒(méi)有以[Tab]definetwo-linesechofooecho$(bar)義的變量以這些變量。當(dāng)然,“自動(dòng)化變量”除外,如“$<”等這種類量的自動(dòng)化變量就屬于<target...>:<variable-<target...>:overide<variable-prog:CFLAGS=-prog:prog.ofoo.o$(CC)$(CFLAGS)prog.ofoo.oprog.o:$(CC)$(CFLAGS)foo.o:$(CC)$(CFLAGS)bar.o:$(CC)$(CFLAGS)在這個(gè)示例中,不管全局的$(CFLAGS)的值是什么,在prog目標(biāo),以及其所的所有規(guī)則中(prog.ofoo.obar.o的規(guī)則),$(CFLAGS)的值都是“-g”在GNU的make中,還支持模式變量(Pattern-specificVariable),通過(guò)上面的目標(biāo)%.o:CFLAGS=-<pattern...>:<variable-<pattern...>:override<variable-libs_for_gcc=-lgnunormal_libs=foo:$(objects)ifeq$(CC)-ofoo$(objects)$(libs_for_gcc)$(CC)-ofoo$(objects)$(normal_libs)號(hào)括起。else表示條件表達(dá)式為情況。endif表示一個(gè)條件語(yǔ)句的結(jié)束,任何一個(gè)條件foo:$(CC)-ofoo$(objects)foo:$(CC)-ofoo$(objects)libs_for_gcc=-lgnunormal_libs=ifeq($(CC),gcc)foo:$(CC)-ofoo$(objects)ifeq(<arg1>,<arg2>)ifeq'<arg1>'ifeq"<arg1>""<arg2>"ifeq"<arg1>"'<arg2>'ifeq'<arg1>'ifeq($(strip<arg2>ifdef<variable-barfoo=$(bar)ifdeffoofrobozz=yesfrobozz=nofoo=ifdeffoofrobozz=yesfrobozz=noifndef<variable-特別注意的是,make是在Makefile時(shí)就計(jì)算條件表達(dá)式的值,并根據(jù)條件表達(dá)式———$(<function><arguments>${<function>用變量,為了風(fēng)格的統(tǒng)一,函數(shù)和變量的括號(hào)最好一樣,如使用“$(substa,b,$(x))”這樣的形式,而不是“$(substa,b,${x})”的形式。因?yàn)榻y(tǒng)一會(huì)更清楚,也會(huì)減少一些不必comma:=,space:=$(empty)$(empty)foo:=abcbar:=$(subst格,$(foo)的值是“abc”,$(bar)的定義用,調(diào)用了函數(shù)“subst”,這是一個(gè)替換函$(subst<from>,<to>,<text>$(substee,EE,feetonthe把“feetonthestreet”中的“ee”替換成“EE”,返回結(jié)果是“fEEtonthe$(patsubst<pattern>,<recement>,<text>$(patsubst%.c,%.o,x.c.c把字串“x.c.cbar.c”符合模式[%.c]的單詞替換成[%.o],返回結(jié)果是“x.c.o“$(var:<pattern>=<recement>)”“$(patsubst 而“$(var:<suffix>=<recement>)”例:objects=foo.obar.o%$(strip<string>$(stripabc把字串“abcabc”$(findstring<find>,<in>$(findstringa,ab$(findstringa,b$(filter<pattern...>,<text>sources:=foo.cbar.cbaz.sugh.hfoo:$(sources)cc$(filter%.c%.s,$(sources))-o$(filterc%.s,$(sources))返回的值是“foo.cbar.cbaz.s$(filter-out<pattern...>,<text>objects=main1.ofoo.omain2.obar.omains=main1.omain2.o$(filter-out$(mains),$(objects))“foo.obar.o$(sort<list>示例:$(sortfoobarlose)返回“barfoolose”$(word<n>,<text>示例:$(word2,foobarbaz)返回值是“bar$(wordlist<s>,<e>,<text><txt>s>到<e<s>比<ext>e>大于<ext><s>ext>$(wordlist23,foobarbaz)返回值是“barbaz”$(words<text>示例:$(words,foobarbaz)返回值是“3”<text>text>$(firstword<text>示例:$(firstwordfoobar)返回值是“foo備注:這個(gè)函數(shù)可以用word函數(shù)來(lái)實(shí)現(xiàn):$(word1,<text>overrideCFLAGS+=$(patsubst%,-I%,$(subst:,如果我們的“$(VPATH)”值是“src:../headers”,那么“$(patsubst%,-I%,$(subst,$(VPATH)))”將返回“-IsrcI../headers”,這正是cc或gcc搜索頭文$(dir<names...>名稱: 部分 $(dirsrc/foo.chacks)返回值是“src$(notdir<names...> 部分$(notdirsrc/foo.chacks)返回值是“foo.chacks”$(suffix<names...>示例:$(suffixsrc/foo.csrc-1.0/bar.chacks)返回值是“.c.c”。$(basename<names...>示例:$(basenamesrc/foo.csrc-1.0/bar.chacks)返回值是“src/foosrc-1.0/barhacks”$(addsuffix<suffix>,<names...>示例:$(addsuffixc,foobar)返回值是“foo.cbar.c”$(addprefix<prefix>,<names...>示例:$(addprefixsrc/,foobar)返回值是“src/foosrc/bar$(join<list1>,<list2>示例:$(joinaaabbb111222333)返回值是“aaa111bbb222333四、foreach的foreach函數(shù)幾乎是仿照于Unix標(biāo)準(zhǔn)S(/bin/sh)中的for語(yǔ)句,或是C-S$(foreach<var>,<list>,<text>names:=abcfiles:=$(foreach$(files)的值是“a.ob.oc.od.o”五、if$(if<condition>,<then-part>$(if<condition>,<then-part>,<else-part>$(call當(dāng)make<expession$(1),(2),$(,<parm>,<par3>expession>callreverse=$(1)foo=$(callreverse=$(2)foo=$(call此時(shí)的foo的值就是“ba”$(origin<variable>“commandifdefifeq"$(originbletch)"bletch=barf,gag,于,它同時(shí)會(huì)把從命令行定義的變量也覆蓋了,而我們只想重新定義環(huán)境傳來(lái)的,而八、s函s函數(shù)也不像其它的函數(shù)。顧名思義,它的參數(shù)應(yīng)該就是操作系統(tǒng)S令。contents:=$(scatfiles:=$(secho是有害的。特別是Makefile的隱晦的規(guī)則可能會(huì)讓你的s函數(shù)執(zhí)行的次數(shù)比你想像的多$(error<text...>產(chǎn)生一個(gè)致命的錯(cuò)誤,<text,error函數(shù)不會(huì)在一被使用就會(huì)ifdef$(errorerrorisERR=$(errorfoundan.PHONY:err:; $(warning<text...>make 0—1—2回2—二、指定前面我們,GNUmake找尋默認(rèn)的Makefile的規(guī)則是在當(dāng) make–f單,需在make命令后直接跟目標(biāo)的名字就可以完成(如前面提到的“makeclean”形式)sources=foo.cifneq($(MAKECMDGOALS),clean)include$(sources:.c=.d)基于上面的這個(gè)例子,只要我們輸入令不是“makeclean”,那么makefile會(huì)自.PHONY:all:prog1prog2prog3“prog1”,“prog2prog3”“prog4”,我們可以使用“makeall”命令來(lái)編“makeprog2”來(lái)單獨(dú)編譯目標(biāo)“prog2”。即然makemakefiemakefieUnixNUakefilemakfil中的目標(biāo)。makeileGN是,GN搞出這東西一有其可之處等的UNIX下程序文一多時(shí)就會(huì)發(fā)makeile()。有時(shí)候,我們不想讓我們的makefile中的規(guī)則執(zhí)行起來(lái),我們只想檢查一下我們“-“--just-“--dry-“--不執(zhí)行參數(shù),這些參數(shù)只是打印命令,不管目標(biāo)是否更新,把規(guī)則和連帶規(guī)則下“-“--“-“--“-W“--what-來(lái)運(yùn)行依賴于這個(gè)文件令,一般來(lái)說(shuō),可以和“-n”參數(shù)一同使用,來(lái)查看這個(gè)依賴下面列舉了所有GNUmake3.80版的參數(shù)定義。其它版本和產(chǎn)商的make“-“-“-“-C“--指定makefile的 。如:“make–C~hchen/test–Cprog”等價(jià)于“make–C~hchen/test/prog”?!啊猘all,輸出所有的調(diào)試信息。(會(huì)非常的多bbasicvverbose,在b選項(xiàng)的級(jí)別之上。輸出的信息包括哪個(gè)makefile被解析,iimplicit,jjobs,輸出執(zhí)行規(guī)則中命令的詳細(xì)信息,如命令的PIDm——也就是makefile,輸出makemakefile,更新makefile,執(zhí)行makefile的“-“-“-“--“--“-“--“-“-I “-j“--“-“--keep-“-l“-“--just-“--dry-“--僅輸出執(zhí)行過(guò)程中令序列,但并不執(zhí)行“-o“-輸出makefieakefilakefilmake–p–f/dv/nullmakeileakefil“-“--“-“-“-“--“--“-“-“--相當(dāng)于UNIX的touch命令,只是把目標(biāo)的修改日期變成的,也就是生成目標(biāo)的“-“--“-“--print-“-W———foo:foo.occ–ofoofoo.obar.o$(CFLAGS)的依賴文件置成[.c],并使用C的編譯命令“cc–c$(CFLAGS)[.c]”來(lái)生成[.o]的目foo.o:cc–cfoo.c$(CFLAGS)bar.o:bar.ccc–cbar.cfoo.o:依賴文件“oo.p”P(pán)ascal序的源件)可變得沒(méi)有義。如果 下在“foo.c”件,那我們的含規(guī)則樣會(huì)效并會(huì)通過(guò)“oo.c”用C的譯器生foo.o文件因?yàn)?,隱含規(guī)中,Pasal的則現(xiàn)在C的規(guī)之后,以,mak找到可以生成foo.的C的則就不尋找下條規(guī)則。果你確實(shí)希望任隱含規(guī)推導(dǎo),那么,你不要只出“依規(guī)則”而不寫(xiě)令。是:.out,a,.ln,.o,.c,.cc,.C,.p,fF.r,.y,l,.s,S,.mod,.def,.h,.info,.dvi,.tex,.texinfo,.texi,.txinfo,.w,.ch.web,.sh,$(CPPFLAGS)令是“$(CXX)–c$(CPPFLAGS)$(CFLAGS)”。(建議使用“.cc”作為C++源文件的后“.f”“$(FC)–c“.F”“$(FC)–c$(FFLAGS)“.f”“$(FC)–c$(FFLAGS)“.F”“$(FC)–F$(CPPFLAGS)$(FFLAGS)”“.r”“$(FC)–F$(FFLAGS)“$(M2C)$(M2FLAGS)$(DEFFLAGS)”?!?lt;n.o>”的目標(biāo)的依賴目標(biāo)會(huì)自動(dòng)推導(dǎo)為“<n>.mod”,并且其生成命令是:“$(M2C)$(M2FLAGS)$(MODFLAGS)”?!?lt;n>.o”n>.s”,默認(rèn)使用編譯品“as”,并且其生成命令是:“$(AS)$(ASFLAGS)”?!?lt;n>.s”的目標(biāo)的依賴目標(biāo)會(huì)自動(dòng)推導(dǎo)為“<n>.S”,默認(rèn)使用C預(yù)編譯器“cpp”,并且其生成命令是:“$(AS)$(ASFLAGS)”?!發(fā)d”),其生成命令是:“$(CC)$(LDFLAGS)<n>.o$(LOADLIBES)$(LDLIBS)”。這個(gè)x:y.occ-cx.c-occ-cy.c-occ-cz.c-occx.oy.oz.o-oxrm-fx.orm-fy.orm-f9、YaccC10、LexC“$(LEX)$(LFALGS)”。(關(guān)于“Lex”的細(xì)節(jié)請(qǐng)查看相關(guān)資料)11、LexRatfor“$(LEX)$(LFALGS)”?!?lt;n>.ln”(lint生成的文件)的依賴文件被自動(dòng)推導(dǎo)為“n.c”,其生成命令是:“$(LINT)$(LINTFALGS)$(CPPFLAGS)-i”。對(duì)于“<n>.y”和“<n>.l”也是同樣的規(guī)在隱含規(guī)則中令中,基本上都是使用了一些預(yù)先設(shè)置的變量。你可以在你的例如,第一條隱含規(guī)則——編譯C程序的隱含規(guī)則令是“$(CC)–c–c-g$(CPPFLAGS)”的樣子來(lái)執(zhí)行了。RCS文件中擴(kuò)展文件程序。默認(rèn)命令是“co”。FortranRatforf77–從TeX源文件創(chuàng)建TeXDVI文件的程序。默認(rèn)命令是“tex”。從Texinfo源文件創(chuàng)建軍TeXDVI“texi2dvi轉(zhuǎn)換CWebTeX的程序。默認(rèn)命令是“cweave”。轉(zhuǎn)換CWebC。默認(rèn)命令是“ctangle”。刪除文件命令。默認(rèn)命令是“rm–fC預(yù)處理器參數(shù)。(CFortran)SCCS“getRatforFortranC有[.c][.y]acc[.c][.o]非中間的目標(biāo)不存在,才會(huì)中間規(guī)則。第二個(gè)不同的是,只要目標(biāo)成功產(chǎn)生,那么,產(chǎn)生最終目標(biāo)過(guò)程中,所產(chǎn)生的中間目標(biāo)文件會(huì)被以“rm-f”刪除。。(如:.INTERMEDIATE:mid)你也可以make自動(dòng)刪除中間目標(biāo),要做到這一點(diǎn),你可以使用偽目標(biāo)“.SECONDARY”來(lái)強(qiáng)制(如:.SECONDARY:sec)。你還可以的目標(biāo),以模式的 程序“foo”,按道理,make會(huì)編譯生成中間文件“foo.o”,然后成“foo”,但在實(shí)際情況下,這一動(dòng)作可以被一條“cc”令完成(cc–ofoofoo.c),于是優(yōu)化過(guò)的說(shuō),目標(biāo)中的模式的"%"決定了依賴目標(biāo)中"%"的樣子。例一個(gè)模式規(guī)則如下:%.o:%.c; 目標(biāo)是"a.ob.o",那么"%c"就是"a.cb.c"。 名,一旦找到,make就會(huì)規(guī)則下令,所以,在模式規(guī)則中,目標(biāo)可能會(huì)是多個(gè)的,如%.o:$(CC)-c$(CFLAGS)$(CPPFLAGS)$<-o%.tab.c%.tab.h:%.ybison-d$<這條規(guī)則告訴make把所有的[.y]文件都以"bison-d<n>.y"執(zhí)行,然后生成"parse.tab.h",如果"parse.y"文件被更新了,那么根據(jù)上述的規(guī)則,"bison-d應(yīng)出現(xiàn)在規(guī)則令中。"dira.foo.b%.b
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年廣東工程職業(yè)技術(shù)學(xué)院?jiǎn)握芯C合素質(zhì)考試題庫(kù)必考題
- 2025年大連職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能考試題庫(kù)及參考答案
- 2025年甘肅能源化工職業(yè)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試題庫(kù)完整
- 2025年甘肅工業(yè)職業(yè)技術(shù)學(xué)院?jiǎn)握芯C合素質(zhì)考試題庫(kù)及答案一套
- 酒店擴(kuò)建工程合同范本
- 橋梁施工勞務(wù)合同及分包細(xì)則
- 建筑設(shè)計(jì)合同范本大全
- 環(huán)保責(zé)任合同:66條策略助您遠(yuǎn)離一次性產(chǎn)品
- 國(guó)際標(biāo)準(zhǔn)房屋租賃合同英文全文
- 房地產(chǎn)公司銷售合同明細(xì)臺(tái)賬xls
- GB/T 3498-2008潤(rùn)滑脂寬溫度范圍滴點(diǎn)測(cè)定法
- GB/T 26030-2010鎳鎳合金鍛件
- GB/T 15175-2012固體激光器主要參數(shù)測(cè)量方法
- GB/T 14478-2012大中型水輪機(jī)進(jìn)水閥門(mén)基本技術(shù)條件
- GB/T 13008-2010混流泵、軸流泵技術(shù)條件
- 2023年南充市煙草系統(tǒng)事業(yè)單位招聘筆試題庫(kù)及答案解析
- 《關(guān)于費(fèi)爾巴哈的提綱》
- HP工作站BIOS詳解參考模板
- 學(xué)憲法講憲法-課件
- 微專題:地理時(shí)空“尺度觀”思想課件
- 大學(xué)普通物理-習(xí)題答案(程守洙-江之勇主編-第六版)課件
評(píng)論
0/150
提交評(píng)論