如果你讀了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規則集的一部分。
謝謝。所以,答案(如果有的話)在時間的迷霧中迷失了 - 我希望我能說我很驚訝,但我不是。有關如何抑制模式規則的信息很有幫助;謝謝你。確認以'.SUFFIXES'開頭無助於抑制模式規則也是有幫助的。 (我推斷,你自己並沒有使用這個規則來創建文件 - 這也不奇怪) –
我個人沒有在我的makefile中使用任何buit-in規則。根據我的經驗,它們僅適用於最簡單的環境。一般來說,我總是發現我需要重新定義編譯模式以添加新變量,而其他模塊只是浪費時間。所以,我的makefiles通常包含一些段來刪除所有內置規則。 – MadScientist
如果你想知道'的原因。你必須問Roland McGrath或者RMS :) – MadScientist