2017-10-14 101 views
0

如果你讀了GNU進行手動的Catalog of Rules部分,事實證明,它識別後綴之一是.out,並有一個內置的規則:爲什麼GNU Make有一個默認規則來從文件創建file.out?

%.out: % 
# commands to execute (built-in): 
    @rm -f [email protected] 
    cp $< [email protected] 

這意味着,如果你有一個文件xyz在一個目錄中,你可以通過簡單地輸入make xyz.out來創建xyz.out

我的問題是(對同一問題的兩個變種):

  • 誰從這個規則中獲益?
  • 人們在什麼情況下使用?

很顯然,我這麼問是因爲我設法運行規則的犯規。我有一些規則,如:

test.01: ${PROGRAM} ${DRIVER} test.01.tst test.01.out ${DATA.01} 
    ${DRIVER} ${D_FLAGS} [email protected] 

其中名稱test.01是假目標,而是一個依賴是test.01.out。當積極運行(不使用make -n;即正常工作),這給了我很多的錯誤,如:

make[1]: Circular test.01 <- test.01.out dependency dropped. 

我也試圖與下降的.out後綴:

.SUFFIXES: 
.SUFFIXES: .sh 

,並似乎沒有中性的.out規則就像我預期的那樣。這是GNU Make的預期功能嗎?

我想我將不得不解決這個錯誤GNU的功能,通過改變我的後綴爲.req或類似的東西做,但它是一個討厭和我留下疑惑,爲什麼.out規則標準GNU Make規則集的一部分。

回答

1

我不知道你對使用這個規則的問題的答案。我只能說,1992年1月GNU make首次簽入源代碼控制時,這個規則已經存在。它在任何ChangeLog中都沒有提及,所以它可能會追溯到最早的版本。

實際的規則被定義爲模式規則,因此更改.SUFFIXES將無濟於事。要擺脫它,你可以使用:

%.out : % 

(沒有配方),它會刪除模式規則。

+0

謝謝。所以,答案(如果有的話)在時間的迷霧中迷失了 - 我希望我能說我很驚訝,但我不是。有關如何抑制模式規則的信息很有幫助;謝謝你。確認以'.SUFFIXES'開頭無助於抑制模式規則也是有幫助的。 (我推斷,你自己並沒有使用這個規則來創建文件 - 這也不奇怪) –

+0

我個人沒有在我的makefile中使用任何buit-in規則。根據我的經驗,它們僅適用於最簡單的環境。一般來說,我總是發現我需要重新定義編譯模式以添加新變量,而其他模塊只是浪費時間。所以,我的makefiles通常包含一些段來刪除所有內置規則。 – MadScientist

+1

如果你想知道'的原因。你必須問Roland McGrath或者RMS :) – MadScientist