2010-01-02 147 views
3

我正在學習makefiles,我正試圖弄清楚如何重用規則。現在,我有以下幾點:重用makefile規則

CPP = cl 

CPPFLAGS = /Od /D "WIN32" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 /MDd /Fo"Debug\\" /Fd"Debug\vc90.pdb" /W3 /nologo /c /ZI /TP /errorReport:prompt 

.SUFFIXES: .exe .cpp 

Exercise35.exe: 
    $(CPP) Exercise35.cpp $(CPPFLAGS) 

debug: 
    $(CPP) Exercise35.cpp $(CPPFLAGS) /D "_DEBUG" 

好像壞了debug規則基本上是重複Exercise35規則有一個額外的命令行參數。有沒有更好的辦法?

回答

3

遞歸make,並將您的調試標誌追加到CPPFLAGS

debug: 
    $(MAKE) CPPFLAGS="$(CPPFLAGS) /D _DBEBUG" Exercise35.exe 
+0

我做到了這一點,並得到:NMAKE:致命錯誤U1073:不知道如何使'/ D _DEBUG'' – AlanT 2010-01-02 02:43:42

+0

您所做的更改工程。謝謝! – AlanT 2010-01-02 02:48:48

0

天兒真好,

我會更傾向於做調試選項Makefile文件中的宏。

CPP = cl 

CPPFLAGS = /Od /D "WIN32" /D "_CONSOLE" /D \ 
    "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 \ 
    /MDd /Fo"Debug\\" /Fd"Debug\vc90.pdb" /W3 \ 
    /nologo /c /ZI /TP /errorReport:prompt 

#DEBUG = /D "_DEBUG" 
DEBUG = 

.SUFFIXES: .exe .cpp 

Exercise35.exe: 
    ${CPP} Exercise35.cpp ${CPPFLAGS} ${DEBUG} 

然後註釋掉你不想使用的DEBUG宏的版本。

順便說一句,使用$ {}而不是$()來引用Makefile宏是更好的,因爲圓括號用於將對象替換到檔案中,而大括號不是。

編輯:如果您正在學習make和makefiles,那麼我強烈推薦閱讀「Managing Projects with GNU Make」的前幾章。它可以幫助你解決make的一些非直觀方面的問題,特別是。它是向後鏈式的行爲。

如果你可以找到一個小的第一版,這是不是gmake特定的,甚至更好的副本。這是解釋是更好的恕我直言。

編輯2:以下是本書第一版亞馬遜網站的鏈接,簡稱爲「Managing Projects with Make」。正如我上面所說的,很好的描述爲什麼表現如此。

HTH

歡呼聲,

1

你應該看看化妝的下列屬性,看看下面的示例:

  • $ @ - 表示當前目標文件的名稱,在這種情況下它對應於APP的值。
  • $ < - 表示比目標所依賴的目標更新的單個文件。
  • $? - 表示比目標所依賴的當前目標更新的文件列表。
 
.SUFFIXES: .cpp.exe 
CPP = cl 
EXTRAFLAGS = 
CPPFLAGS = /Od /D "WIN32" /D "_CONSOLE" /D "_UNICODE" /D "UNICODE" /Gm /EHsc /RTC1 /MDd /Fo"Debug\\" /Fd"Debug\vc90.pdb" /W3 /nologo /ZI /TP /errorReport:prompt 

FILES = Exercise35 
APP = Exercise35.exe 

.cpp.exe: 
    $(CPP) $(EXTRAFLAGS) $(CPPFLAGS) /c $< 

all : $(APP) 

$(APP) : $(FILES) 
    $(CPP) $(EXTRAFLAGS) $(CPPFLAGS) [email protected] $(FILES) 

            
 
  
             
clobber : clean mrproper 

clean: 
    del $(FILES) 

mrproper: 
    del $(APP) 

            
  

我得到這個從我的舊的makefile模板中,注意化妝將出現「智能」和靈活的,你可以通過這樣的

執行專門覆蓋國旗的一種補充文件中的調試/釋放
 
make EXTRAFLAGS="/D _DDEBUG" 

這將通過在額外定義到生成文件包括_DDEBUG宏,如果你想建立一個發佈,離開了命令行EXTRAFLAGS。

編輯: 按Mike的點出來,我認爲這將是有用的,包括額外的規則,這樣就可以乾淨的exe和目標代碼躺在身邊的目錄...這是我原來的模板生成文件來自AIX(我在Linux下也使用過......)感謝Mike的支持!

希望這會有所幫助, 最好的問候, 湯姆。

+0

不應該是'FILES = Exercise35.cpp'嗎?另外,爲什麼'$(A​​PP)'規則後面的分號?你不需要'.PHONY:所有clobber clean mrproper'規則? – 2010-01-02 02:59:03

+0

@Mike:糟糕...那個分號......我會相應地編輯這個...... :( – t0mm13b 2010-01-02 03:02:57