Makefile文件(四)_书写命令
變量說明:
$@ ? ? ? ---> ? ? ?目標(biāo)文件
$^ ? ? ? ---> ? ? ? 所有的依賴文件
$< ? ? ? ---> ? ? ? 第一個(gè)依賴文件
?
一、顯示命令
@echo 正在編譯xx模塊......
當(dāng)make執(zhí)行時(shí),會(huì)輸出“正在編譯xx模塊......”,但不會(huì)輸出命令
echo 正在編譯xx模塊......
make執(zhí)行將輸出:echo 正在編譯xx模塊......
?正在編譯xx模塊......
說明:“@”字符在命令行前面,這個(gè)命令將不被make顯示出來。如果make執(zhí)行帶參數(shù)“-n”或“--just-print”,那么只是顯示命令不執(zhí)行。這有利于調(diào)試Makefile。而make參數(shù)“-s”或“--slient”則是全面禁止顯示命令
二、命令執(zhí)行
如果要讓上一條命令的結(jié)果應(yīng)用于下一條跳命令時(shí),使用分號(hào)分隔這兩條命令。比如,第一條命令cd,第二條命令得在cd之后基礎(chǔ)上運(yùn)行,那么就不能把這兩條命令寫在兩行上,而應(yīng)該寫在一行上,用分號(hào)分割。
示例:
exec:
cd /home/hchen
pwd
示例:
exec:
cd /home/hchen; pwd
當(dāng)我們執(zhí)行“make exec”時(shí),第一個(gè)例子中的cd沒有作用,pwd會(huì)打印出當(dāng)前的Makefile目錄,第二個(gè)例子中,cd就起作用了,pwd會(huì)打印出“/home/chen”。
三、命令出錯(cuò)
每當(dāng)命令運(yùn)行完成后,make會(huì)檢測(cè)每個(gè)命令的返回碼。如果命令返回成功,那么make會(huì)執(zhí)行下一條命令,當(dāng)規(guī)則中的所有命令成功返回后,這個(gè)規(guī)則就算是成功完成了。如果一個(gè)規(guī)則中的某個(gè)命令出錯(cuò)了(命令退出碼非零),那么make就會(huì)終止執(zhí)行當(dāng)前規(guī)則,這將有可能終止所有規(guī)則的執(zhí)行。
有時(shí),命令的出錯(cuò)并不表示錯(cuò)誤,例如mkdir命令。如果目錄不存在,mkdir成功執(zhí)行,如果目錄存在則出錯(cuò)。但此時(shí)我們不希望mkdir出錯(cuò)而終止規(guī)則的運(yùn)行。
忽略命令的出錯(cuò),可以在Makefile的命令行前加減號(hào)“-”,標(biāo)記為不管命令出不出錯(cuò)都認(rèn)為成功。
全局的辦法:給make加上-i或是--ignore-errors參數(shù),那么Makefile中的所有命令都會(huì)忽略錯(cuò)誤。
如果一個(gè)規(guī)則以“.IGNORE”為目標(biāo),那么這個(gè)規(guī)則中的所有命令都會(huì)忽略錯(cuò)誤。
make的參數(shù)“-k”或是“--keep-going”,表示如果規(guī)則中的某個(gè)命令出錯(cuò)了,那么終止改規(guī)則,但繼續(xù)執(zhí)行其他規(guī)則。
四、嵌套執(zhí)行make
不同目錄下都有自己的Makefile文件。有利于Makefile簡(jiǎn)介,易于維護(hù),對(duì)于模塊編譯和分段編譯有著非常大的好處。
例如,子目錄subdir,該目錄下有個(gè)Makefile文件指明該目錄下文件的編譯規(guī)則。那么總控的Makefile可以這樣寫:
subsystem:
cd subdir && $(MAKE)
等價(jià)于:
subsystem:
$(MAKE) -C subdir
定義$(MAKE)宏變量的意思是,也許我們的make需要一些參數(shù),所以定義成一個(gè)變量比較利于維護(hù)。這兩個(gè)例子都是先進(jìn)入“subdir”目錄,然后執(zhí)行make命令。
總控的Makefile的變量可以傳遞到下級(jí)的Makefile中(如果顯式聲明),但是不會(huì)覆蓋下層的Makefile中所定義的變量,除非指定“-e”。
傳遞變量到下級(jí)Makefile,可以聲明:export <variable...>
如果不想傳遞變量到下級(jí)Makefile,可以聲明:unexport<variable...>
示例:
export variable = value
等價(jià)于:
variable = value
export variable
等價(jià)于:
export variable:=value
等價(jià)于:
variable := value
export variable
示例二:
export variable += value
等價(jià)于:
variable += value
export variable
若要傳遞所有變量,一個(gè)export就行了,后面什么不用跟,表示傳遞所有的變量。
注:變量SHELL和MAKEFLAGS變量,這兩個(gè)變量不管是否export,總是要傳遞到下層Makefile中,特別是MAEFLAGS變量,其中包含了make的參數(shù)信息。如果執(zhí)行總控“Makefile”時(shí)有make參數(shù)或是在上層Makefile中定義了這個(gè)變量,那么MAKEFILES變量將會(huì)是這些參數(shù),并會(huì)傳遞到下層Makefile中,這是一個(gè)系統(tǒng)級(jí)的環(huán)境變量。
但是make命令中的幾個(gè)參數(shù)不往下傳遞,“-C”,“-f”,“-h”,“-o”和“-W”,如果他們想往下層傳遞參數(shù),可以:
subsystem:
cd subdir && $(MAKE) MAKEFLAGS=
如果定義了環(huán)境變量MAKEFLAGS,那么得確信其中的選項(xiàng)是都會(huì)用到的。如果其中有“-t”,“-n”,“-q”,可能會(huì)有意想不到的后果。
參數(shù)“-w”或“--print-directory”會(huì)在make的過程中輸出一些信息,看到目前的工作目錄。比如下級(jí)make目錄是“/home/hchen/gun/make”,如果我們使用“make -w”來執(zhí)行,那么當(dāng)進(jìn)入該目錄時(shí)會(huì)看到:
make: Entering directory '/home/hchen/gnu/make'.
而在完成下層make后離開目錄時(shí),會(huì)看到:
make:Leaving directory '/home/hchen/gnu/make'
當(dāng)使用“-C”參數(shù)指定make下層Makefile時(shí),“-w”會(huì)被自動(dòng)打開。如果參數(shù)中有“-s”(“--slient”)或是“--no-print-directory”,那么,“-w”總是失效的。
五、定義命令包
Makefile中可以為相同的命令序列定義一個(gè)變量,以“define”開始,“endef”結(jié)束,示例:
define run-yacc
yacc $(firstword $^)
mv y.tab.c $@
endef
說明:“yun-yacc”是命令包的名字,不要和Makefile中的變量重名。在“define”和“endef”中的兩行就是命令序列。這個(gè)命令包中的第一個(gè)命令是運(yùn)行Yacc程序,因?yàn)閅acc程序總是生成“y.tab.c”的文件,所以第二行的命令就是把這個(gè)文件改名字。
實(shí)例:
foo.c:foo.y
$(run-yacc)
在這個(gè)命令包的使用中,命令包“run-yacc”中的“$^”就是“foo.y”,“$@”就是“foo.c”,make執(zhí)行命令包時(shí),命令包中的每個(gè)命令會(huì)被依次獨(dú)立執(zhí)行。
轉(zhuǎn)載于:https://www.cnblogs.com/weiyi-mgh/p/6941139.html
總結(jié)
以上是生活随笔為你收集整理的Makefile文件(四)_书写命令的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android.light.apk,An
- 下一篇: ViewStub使用