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