2014-02-05 67 views
3

我知道我可以使用自動變量[email protected]從目標中的生成文件檢索當前目標的名稱。現在我不知道是否有可能有一個Makefile文件,看起來像這樣:...使用動態目標名稱

[email protected]: 
    g++ [email protected] && ./a.out 

的想法是,輸入make test.cpp應該運行g++ test.cpp && ./a.out其中作爲make main.cpp應該運行g++ main.cpp && ./a.out

我看到通配符可能與我的問題強烈相關。然而,像這樣的生成文件:

*.cpp: 
    g++ [email protected] && ./a.out 

確實創造了適當的目標,但這樣一個makefile產量make: >>test.cpp<< is already up-to-date運行make test.cpp - 無需編譯發生。

回答

4

您描述的行爲是您想要從製作系統中獲得的行爲,這就是爲什麼它被許多人所喜愛並且尺度如此之好。

make test.cpp不工作,因爲你要的是make a.out

嘗試從一個簡單而正確的makefile開始並演進到您的需求

要觸發編譯刪除test.omake test.o,或者說touch test.cpp和然後再次make test.o。如果您不想要中間目標文件(我告訴您 - 您確實需要它們),則可以將替換爲a.out

您正在嘗試,你應該 :-)

由於@MadScientist在他的評論中,GNU實用的功能做一個提醒是一個巨大的一套可以節省默認規則當你不需要對每個步驟進行精細控制時,都會有相當多的樣板。在this項目中使用Makefile演示它。

+0

要完整地完成這個答案,應該指出make有一組內置的_implicit rules_,它可以讓它理解如何從'.c'文件構建'.o',以及其他各種類型的源文件。此外,您可以定義自己的隱式規則或覆蓋內置規則,如果他們不做你所需要的。標準make支持_suffix rules_這是一種隱式規則的有限形式,GNU make支持_pattern rules_這是一種更強大的形式。您可以通過Google查看這些條款以瞭解它們以及如何指定它們。 – MadScientist

+0

@MadScientist - 我同意自動規則在一定程度上是有用的,但是當構建比測試應用程序更簡單的任何東西時,您最好擁有完全控制權 – bobah

+0

使用隱式規則決不會放棄任何控制權。而且,在比測試應用程序更簡單的任何構建系統中,它們絕對是非常重要的,以避免大量浪費的冗餘。有些人更喜歡靜態模式規則,但我個人認爲沒有什麼大的優勢。 – MadScientist