Makefile文件(四)_書寫命令

變量說明:spa

$@       --->      目標文件命令行

$^       --->       全部的依賴文件調試

$<       --->       第一個依賴文件編譯

 

1、顯示命令

  @echo 正在編譯xx模塊......基礎

當make執行時,會輸出「正在編譯xx模塊......」,但不會輸出命令變量

  echo 正在編譯xx模塊......file

make執行將輸出:echo 正在編譯xx模塊......程序

        正在編譯xx模塊......error

說明:「@」字符在命令行前面,這個命令將不被make顯示出來。若是make執行帶參數「-n」或「--just-print」,那麼只是顯示命令不執行。這有利於調試Makefile。而make參數「-s」或「--slient」則是全面禁止顯示命令word

2、命令執行

若是要讓上一條命令的結果應用於下一條跳命令時,使用分號分隔這兩條命令。好比,第一條命令cd,第二條命令得在cd以後基礎上運行,那麼就不能把這兩條命令寫在兩行上,而應該寫在一行上,用分號分割。

示例:

exec:

  cd /home/hchen

  pwd

示例:

exec:

  cd /home/hchen; pwd

當咱們執行「make exec」時,第一個例子中的cd沒有做用,pwd會打印出當前的Makefile目錄,第二個例子中,cd就起做用了,pwd會打印出「/home/chen」。

3、命令出錯

每當命令運行完成後,make會檢測每一個命令的返回碼。若是命令返回成功,那麼make會執行下一條命令,當規則中的全部命令成功返回後,這個規則就算是成功完成了。若是一個規則中的某個命令出錯了(命令退出碼非零),那麼make就會終止執行當前規則,這將有可能終止全部規則的執行。

有時,命令的出錯並不表示錯誤,例如mkdir命令。若是目錄不存在,mkdir成功執行,若是目錄存在則出錯。但此時咱們不但願mkdir出錯而終止規則的運行。

忽略命令的出錯,能夠在Makefile的命令行前加減號「-」,標記爲無論命令出不出錯都認爲成功。

全局的辦法:給make加上-i或是--ignore-errors參數,那麼Makefile中的全部命令都會忽略錯誤。

若是一個規則以「.IGNORE」爲目標,那麼這個規則中的全部命令都會忽略錯誤。

make的參數「-k」或是「--keep-going」,表示若是規則中的某個命令出錯了,那麼終止改規則,但繼續執行其餘規則。

4、嵌套執行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」老是失效的。

5、定義命令包

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執行命令包時,命令包中的每一個命令會被依次獨立執行。

相關文章
相關標籤/搜索