2017-06-12 104 views
0

考慮一個很長的makefile帶有衆多目標,所有目標都是PHONY(意思是目標名稱不代表現有文件)。Makefile:聲明所有目標PHONY

我可以做兩種:

.PHONY: a 
a: 
    do someting a 

.PHONY: b 
b: 
    do someting b 

.PHONY: c 
c: 
    do someting c 

或者:

.PHONY: a b c 
a: 
    do someting a 

b: 
    do someting b 

c: 
    do someting c 

第一個選項是繁瑣的,而第二個選項是容易出錯,在未來我增加了一個目標,而忘記申報它作爲PHONY

有沒有一種標準方法可以將makefile中的所有目標聲明爲PHONY

+3

如果* all *目標是* PHONY *,'make'不是正確的工具,因爲它對於純腳本沒有任何優勢。PHONY:$(MAKECMDGOALS)'完全可以在命令行僞裝下給出的目標,如果你的任何目標都不依賴於其他目標,它將會對你有用。 –

+2

我同意費利克斯。我認爲第二個版本比第一個更標準。我不認爲這是一個容易出錯的問題,你應該以某種方式控制你的Makefile中的內容,而不管它的大小。 – Tim

+0

我將非常樂意將這些意見作爲答案 –

回答

3

如果真的所有目標是,這有點毫無意義。 make是爲了「做什麼必要更新我的輸出」,如果回答有什麼必要?始終是相同的,簡單的腳本將以較少的開銷完成相同的工作。

話雖這麼說,我能想象到預期的所有目標在命令行給予應的情況 - 讓我們假設你想建立一些文件是這樣的:

all: doc1.pdf doc2.pdf doc3.pdf doc4.pdf doc5.pdf 

manuals: doc3.pdf doc4.pdf 

faqs: doc1.pdf 

designdocs: doc2.pdf 

apidocs: doc5.pdf 

developerdocs: doc2.pdf doc5.pdf 

userdocs: doc1.pdf doc3.pdf doc4.pdf 

%.pdf: %.md 
    $(somedocgenerator) -o [email protected] $< 

然後,你可以做到以下幾點:

.PHONY: all $(MAKECMDGOALS) 

這將動態地做出任何目標的命令給出麟e PHONY。請注意,您必須在此處包含您的默認目標,因爲只需鍵入make即可在未明確指定的情況下調用此目標。

我不會推薦這種方法,因爲它有兩個缺點:

  • 這是對的make不同口味的可移植性。
  • 將胡作非爲如果有人決定make特定的輸出文件喜歡這裏make doc3.pdf
  • 如果您決定讓其中一個PHONY目標取決於另一個PHONY之一,那麼它也會行爲不當。

所以,最好用一種方法去宣佈所有PHONY目標。如果你的Makefile真的很大,你可以將它分成幾個文件並使用include - 並在每個文件中有一個.PHONY:行。