命令的回顯:
通常,make在執行命令之前都會把執行的命令進行輸出,例如:
關閉命令回顯有以下幾種方式:
每個需要關閉回顯的命令列之前加上」@」符號:
執行make時機上引數-s 或 –slient進製所有執行命令的顯示。
在makefile中使用沒有以來的特殊目標時,.slient也可以禁止所有命令的回顯。
命令的執行
在makefile中書寫在同一行中的多個命令屬於乙個完整的shell命令列,書寫在獨立行的一條命令是乙個獨立的shell命令列。所以需要注意:在乙個規則的命令中,命令列cd改變目錄不會對其後的命令的執行產生影響。就是說其後的命令執行的工作目錄不會是之前使用cd進入的那個目錄。如果要實現這個目的,就不能把cd和其後的命令放在兩行來書寫。而應該把這兩條命令寫在一行上,用分號分隔。這樣它們才是乙個完整的shell命令列。
命令執行的錯誤執行
通常情況下,規則中的每一條命令在執行結束後,make都會檢測命令執行的返回狀態,如果返回成功,就執行下一條命令;命令出錯(返回狀態非0),make就會放棄對當前規則的執行,或者終止對當前makefile的解析執行。
在一些情況下,規則中的乙個命令的執行失敗並不代表規則執行的錯誤。為了忽略一些無關緊要的命令執行失敗的情況,我們可以在命令之前加乙個減號-,來告訴make忽略此命令的執行失敗檢查。
內嵌函式
make的內嵌函式為我們提供了處理檔名、變數、文字和命令的方法。使我們的makefile更為靈活和健壯。我們可以在需要的地方呼叫函式來處理指定的文字(引數),函式在呼叫它的地方被替換為它的處理結果。函式呼叫(引用)的展開和變數引用的展開方式類似:
函式呼叫方式1:
$(function arguments)
函式呼叫方式2:
$內嵌函式分類:
使用wildcard函式改進complicated專案的makefile
wildcard函式,其使用正規化:
$(wildcard pattern)
函式名稱:wildcard
函式功能:列出當前目錄下所有符合模式「pattern」格式的檔名。
返回值:空格分割的、存在當前目錄下的所有符合模式「pattern」的檔名。
函式說明:「pattern」使用shell可識別的萬用字元,包括?(單字元)、*(多字元)等。
示例:$(wildcard *.c)
返回值為當前目錄下所有.c原始檔列表。
我們可以引進wildcard函式,改進complicated專案的makefile,使其能夠自動掃瞄當前目錄下的原始檔:
#define variable of executable fileexecutable :=complicated執行結果如下:#define variable of source documentsources := $(wildcard *.c)
#using repalce with a reference to a variable
#and define the
'object
'file
list
objects := $(sources:.c=.o)
#define compile command variables
cc := gcc
rm := rm -rf
#ultimate goal rule,generating complicate executor
$(executable):$(objects)
#using an automated variable to transfer compilation command
$(cc) -o $@ $^#subrule
1to generate main.o
$(objects):%.o:%.c
$(cc) -o $@ -c $
$(rm) $(executable) $(objects)
一起學Makefile(一)
make和makefile makefile檔案幫助我們記錄了整個專案工程的所有需要編譯的檔案列表,這樣我們在編譯時僅需要輸入簡單的make命令就能編譯出我們期望的結果。makefile檔案反映了整個專案中各個模組的依賴關係,這樣我們改動了某些原始檔以後,僅需簡單的輸入make命令,make工具就會...
跟我一起寫Makefile 六
使用條件判斷,可以讓 make 根據執行時的不同情況選擇不同的執行分支。條件表示式可以是比較變數的值,或是比較變數和常量的值。下面的例子,判斷 cc 變數是否 gcc 如果是的話,則使用 gnu 函式編譯目標。libs for gcc lgnu normal libs foo objects ife...
讀《跟我一起學Makefile》有感
其實在之前的工作中有很多的機會接觸到makefile,但是總是沒能拿出時間通讀其語法,我想這與自身不夠積極的態度是直接掛鉤的。先說說在這次的收穫 首先從最基本的語法規則到變數定義,熟悉了其最基本的工作流程 再者結合文中的示例,自己再實際練習,熟悉了其中個別函式及特殊規則的應用。在接觸到專案中的mak...