makefile 多目標和多規則

2021-07-04 10:30:52 字數 2112 閱讀 4798

makefile 多目標

乙個規則中可以有多個目標,規則所定義的命令對所有目標有效。

多目標意味著所有的目標具有相同的依賴檔案,多目標通常用在一下兩種情況:

僅需要乙個描述依賴關係的規則,不需要在規則中命令、例如:

kbd.o   command.o  files.o:command.h

這個規則實現了同時給三個目標檔案制定乙個依賴檔案

對於多個具有類似重建命令的目標。重建這些目標的命令不需要完全相同。因為可以在命令列中使用自動環變數「$@」來引用具體的目標,完成重建,

例如:big output littleoutput :text.g

generate text.g -$(subs output,,$@)>$@

這個等價於:

bigoutput :text.g

generate text.g -big >bigoutput 

littleoutput :text.g

generate text.g -little >littleoutput

例子中的「generate」根據命令列引數來決定輸出檔案的型別。使用make的字串處理函式「subst」來根據目標產生對應的命令列選項。

雖然在多目標的規則中,可以根據不同目標使用不同的命令(在命令列中使用自動化變數$@)。但是,多目標規則並不能做到根據目標檔案自動改變依賴檔案(像上邊例子中使用自動化變數$@改變規則的命令一樣)。需要實現這個目的是,要用到make的靜態模式。

多規則:

多規則不同於多目標,這個指的是乙個檔案作為多個規則的目標。

對於乙個多規則的目標,重建此目標的命令只能出現在乙個規則中(可以是多條命令)。如果多個規則同時給出重建此目標的命令,make使用最後乙個規則中所定義的命令,同時提示錯誤資訊。

makefile通常存在乙個變數,就像我們以前提到的「objects」,它定義為所有需要變異生成.o檔案的列表,當這些.o檔案在其原始檔所包含的標頭檔案config.h發生變化之後能夠自動的被重建,我們可以使用多目標的方式來書寫makefile:

objects=foo.o bar.o

foo.o:defs.h 

bar.o:defs.h test.h

$(objects):config.h  

這樣做的好處是:我們可以再原始檔增加或刪除包含標頭檔案以後不用修改已經存在的makefile的規則,只需要增加或者刪除某乙個.o檔案依賴的標頭檔案。這種方式很簡單也很方便。對於乙個大的工程來說,這樣做的好處顯而易見。我們也可以通過乙個變數來增加目標的依賴檔案,使用make命令來定義某乙個目標的依賴標頭檔案,例如:

extradeps=$(objects):$(extradeps)

程式的意思是我們如果執行「make extradeps=foo.h」那麼「foo.h」將作為所有的.o 檔案的依賴檔案,但是如果只執行make的話,就沒有指定任何檔案作為.o檔案的依賴檔案。

makefile檔案條件語句的三個關鍵字:

1.ifeq 表示條件語句的開始,並指定了乙個比較條件(相等)。之後是用圓括號括包圍的。使用逗號「,」分割的兩個引數,和關鍵字「ifeq」用空格分開,引數中的變數引用在進行變數值比較時被展開。「ifeq」之後就是當滿足條件make需要執行的,條件不滿足時忽略。

2.「else」之後就是當天劍不滿足是執行部分。

3.「endif」表示乙個條件語句的結束,任何乙個條件表示式都必須以「endif」結束

關鍵字「ifneq」

此關鍵字是用來判斷引數是否不相等,格式為:

ifneq(arg1,arg2)

關鍵字 「ifdef」

關鍵字「ifdef」用來判斷乙個變數是否已經定義。格式為:

ifdef variable-name

如果變數variable-name的值非空,那麼表示式為真。

對於indef需要說明的是:ifdef只是測試乙個變數是否有值,不會對變數進行替換展開來判斷變數的值是否為空。

比如說 :

bar =

foo =$(bar)

ifdef foo 就是為真的,因為它內部有值

而 indef bar 是返回false的,因為,他是空值。

關鍵字 「ifndef」實現的功能和「ifdef」相反。

在條件表示式中不能使用自動化變數,自動化變數在規則命令執行時才有效。

makefile清除目標檔案的規則

剛開始學習makefile的時候,我覺得直接刪除多於的 o 檔案和 tags和cscope產生的資料庫,就好了後來發現,這樣做不是很好,不符合程式設計師的修養 舉乙個簡單的例子 bj.phony all clean src wildcard c objs src c o target test.d ...

makefile學習筆記 書寫規則 偽目標

20180416 makefile學習筆記 書寫規則 偽目標 下面的例子中的乙個 clean 的目標,就是乙個 偽目標 clean rm o temp clean的作用是當我們生成了許多編譯檔案時,我們應該提供乙個清楚他們的 目標 以備完整地重編譯而用 以 make clean 來使用該目標 因為,...

SRA 基於多指標的多目標優化隨機排序演算法

參考文獻 bingdong li,student member ieee,ke tang,senior member ieee,jinlong li,member ieee,and xin yao fellow,ieee stochastic ranking algorithm for many o...