2014-12-02 94 views
6

談到GNU make時,PHONY目標all:default:之間有什麼區別。Makefile:所有與默認目標

CC=g++ 
default: hello 

hello: hello.cpp 
    $(CC) -o hello hello.cpp 

CC=g++ 
all: hello 

hello: hello.cpp 
    $(CC) -o hello hello.cpp 

他們都做同樣的工作。

回答

13

,如果你喜歡,你可以打電話給他們shirley;你提到的標籤都沒有任何特殊的語義。如果您沒有將目標指定爲命令行參數,則默認行爲make將運行Makefile中的第一個目標。如果您想要覆蓋此行爲,則有.DEFAULT:特殊目標。

有一個約定有一個名爲all的目標,它構建了所有的東西,但這只是人類約定,並非特殊情況或就Make而言。

同樣,有一個(弱)約定稱爲默認目標default,但類似地,這只是一個人的標籤(與all約定有些重疊並可能有衝突)。

所以下面的Makefile做同樣的事情:

.PHONY: shirley all default 
default: hello 
all: hello 
shirley: hello 

hello: hello.cpp 
# (Make already knows how to build an executable out of a .cpp file) 

可以省略任何或所有上述的假目標,唯一的區別是,人類將無法說make shirley時他們(有效)的意思是make hello。底線:構建您的Makefile,以便make能夠完成合理的最終用戶所期望的操作,而不會讀取太多的文件或檢查Makefile文件或檢查文件或檢查Makefile文件或檢查Makefile。通常情況下,這將是make all(爲了滿足人們的習慣,即使它不是默認設置,你也應該有一個這個名字的目標),但這顯然取決於你的項目和用戶的期望。

別叫我雪莉。

+4

指定'.DEFAULT'特殊目標是**不是**重寫默認目標的方法。默認目標是makefile中不是以'。'開頭的第一條規則。 - 除非通過指定特殊變量'.DEFAULT_GOAL'來覆蓋。爲了通知讀者很長的makefile文件,最好在makefile文件的早期指定.DEFAULT_GOAL或者編寫一個規則(通常是一個虛擬的規則,比如'default:all',沒有配方)。 – 2017-02-28 12:51:39

+0

@DavidHammen我同意你的最終結論。但是,我認爲'.DEFAULT_GOAL'黑客主要是應該避免的深奧後門,並且[手冊](https://www.gnu.org/software/make/manual/html_node/Special-Variables。 HTML)如何使用它的例子肯定會強化這種印象。 – tripleee 2017-02-28 13:20:45

1

一個拼寫爲「all」,另一個拼寫爲「default」。他們之間沒有其他區別。也許如果你解釋了爲什麼你問我們可以提供更多幫助。

請注意,在您的示例中,上述兩個目標都不是真正的假。你必須把他們定義爲這樣:

.PHONY: all 

+0

雅,我沒有將它們指定爲'PHONY',但是那兩個關鍵字是用來表示相同的東西?這不是很奇怪,爲什麼任何人需要另一個,如果已經存在? – sinister 2014-12-02 06:22:23

+0

@qwerty查看tripleee的回答:'all'和'default'規則沒有特別的含義,它們是常規規則的常規名稱。 – Dettorer 2014-12-02 08:52:06

0

唯一的區別是,all在GNU建議進行手動,成爲第一個(默認)目標,並default沒有這樣的特別推薦。