一起學Makefile(六)

2022-03-19 10:07:27 字數 2381 閱讀 9882

命令的回顯:

通常,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...