2010-06-15 31 views
1

你能解釋我爲什麼Makefile的規則:的Makefile和rm -f文件{EXT1,EXT2,EXT3}問題

clean: 
    rm -f foo.{bar1,bar2,bar3} 

不會導致刪除文件:foo.bar1 foo.bar2和Foo。 BAR3? 我相信我在各種Makefiles中看到過很多次這樣的模式,但是我正在編寫自己的Makefile,並且無法使該規則正常工作(沒有文件被刪除)。

我使用:

  • GNU使3.81
  • GNU的bash 4.1.5

猛砸evals這種模式,因爲我懷疑:

$ echo test.{a,b,c} 
test.a test.b test.c 

謝謝!

UPDATE

感謝大衛的提示,我發現了上述問題的解決方案。 gnu make默認使用/ bin/sh,這就是爲什麼。{1,2,3}不會被評估爲a.1 a.2 a.3。

,使「使」使用bash的,而不是SH附加的下面一行到你的Makefile:從現在起

SHELL=/bin/bash 

{1,2,3}將被視爲A.1 A.2一.3

+0

@ Ak91:您通常會將自我回答*寫爲*答案。回答你自己的問題是被允許和鼓勵的。然而,這將是幾天之後才能接受你自己的答案,並且沒有任何要點。 – dmckee 2010-06-15 22:10:57

+0

@dmckee:對不起,我是新來的Stackoverflow網站。我必須學習它的規則。 – user360872 2010-06-17 17:46:32

+0

@ AK91:我提到它不僅僅是通過定位,而是因爲我很樂意投票給你正確的自我回答... – dmckee 2010-06-17 21:42:48

回答

1

目錄中是否有一個名爲clean的文件?如果是這樣,make會認爲該目標是最新的,並且不會運行相應的命令。爲了解決這個問題,這個行添加到您的Makefile:

.PHONY: clean 

如果在運行make clean你得到的輸出

make: `clean' is up to date. 

那麼這可能是你的問題。

+0

目錄中沒有名爲'clean'的文件。當我輸入:「make clean」時,規則會啓動,但{}不會被撤銷,因此rm試圖刪除「foo。{bar1,bar2,bar3}」而不是foo.bar ... – user360872 2010-06-15 20:30:52

-1

這是因爲這裏沒有調用shell,而是直接調用rm。由於shell執行{}替換,因此'看到'的是原始foo。{bar1,bar2,bar3}字符串。由於沒有這樣的文件,沒有任何反應。

您應該使用GNUmake的一個字符串宏來讓它爲您執行擴展。

+0

問題中的makefile爲我工作沒有任何宏(在3.80和Bash 3.00),所以我對此有疑慮。 – 2010-06-15 20:24:57

+1

哦,根據'make'文檔,命令被'/ bin/sh'解釋。 – 2010-06-15 20:26:44

+0

我不想使用宏,因爲我相信可以在沒有宏的情況下評估那些模式。請參閱:http://google.com/codesearch?q=file:Makefile$+rm.*\{{*, - 不幸的是,這對我無效。 – user360872 2010-06-15 20:33:23