2012-04-20 37 views
2

需要您幫助推測makefile。所以,我有什麼和我想要得到什麼。我需要構建兩個可執行文件。源代碼很常見。預處理宏控制兩者的EXE差異,例如,在main.cpp中:投影調試/發佈配置的生成文件

#if PROJECT_TYPE==FTP 
std::cout << "FTP" << std::endl; 
#else 
std::cout << "SFTP" << std::endl; 
#endif 

差異不僅在源代碼中,而且在該用於連接的附加的庫:

FTP_LDFLAGS= -static-libstdc++ -static-libgcc -s -L $(ROOT_DIR)/lib/Release -l:libboost_thread-mgw46-mt-1_49.a -l:libcommon.a \ 
-l:libfile.a -l:libfilesearcher.a -l:libftpclient.a -l:libftplib.a -l:libdbclient.a -l:libsqlite3.a -l:libscheduler.a -l:libws2_32.a 
SFTP_LDFLAGS= -static-libstdc++ -static-libgcc -s -L $(ROOT_DIR)/lib/Release -l:libboost_thread-mgw46-mt-1_49.a -l:libcommon.a \ 
-l:libfile.a -l:libfilesearcher.a -l:libdbclient.a -l:libsqlite3.a -l:libscheduler.a -l:libsftpclient.a -l:libws2_32.a -l:libssh.dll 

此外,我要創建自己的CXXFLAGS和輸出目錄調試/發佈構建目標,因此在結果得到如下:

TARGETS= ftp_auto_backup sftp_auto_backup 

Screenshot of dirs tree here.

我想使用隱含規則來編譯,水木清華這樣的:

%.o: %.cpp 
$(CXX) -c $(CXXFLAGS) $< -o $(O_DIR)/[email protected] 

但我怎麼能指定單獨O_DIR每個目標INT $(目標),併爲每個生成配置?我的主要問題是在這一步。我可以粘貼我現在擁有的所有makefile,但它仍然不會生成任何東西。以防萬一這裏是:http://pastebin.com/jjB5Ld1s

在此先感謝,夥計們!

+0

你想要建立兩個版本只需一次調用?還是足以能夠建立任一版本? – Beta 2012-04-20 02:33:14

+0

@Beta,如果make將爲每個版本單獨調用,那麼就可以了:make && make debug。 – andryuhat 2012-04-20 02:40:48

回答

2

有很多方法可以做到這一點。最簡單的似乎是通過遞歸Make。 (我不是那些誰認爲這始終是一個糟糕的主意之一。)

.PHONY: release 
release: VERSION=Release 

.PHONY: debug 
debug: VERSION=Debug 

release debug: 
     @$(MAKE) -S ftp_auto_backup sftp_auto_backup VERSION=$(VERSION) 

現在做出可執行文件,給出VERSION。我們可以用另一層遞歸來處理兩個項目類型,但是我們可以不用它(我不會詳細討論預處理器宏和編譯器/鏈接器標記,因爲您似乎已經知道它們了 - 我會拼寫出來,如果你喜歡):

OBJ_LIST = foo.o bar.o baz.o 

ftp_auto_backup: PROJECT_TYPE=FTP 
ftp_auto_backup: $(addprefix $(VERSION)/ftp_auto_backup/obj/, $(OBJ_LIST)) 

sftp_auto_backup: PROJECT_TYPE=SFTP 
sftp_auto_backup: $(addprefix $(VERSION)/sftp_auto_backup/obj/, $(OBJ_LIST)) 

ftp_auto_backup sftp_auto_backup: 
     @g++ -Wall $^ -o [email protected] with various flags 

$(VERSION)/ftp_auto_backup/obj/%.o: %.cc 
     @g++ -Wall -c $< -o [email protected] with various flags 

$(VERSION)/sftp_auto_backup/obj/%.o: %.cc 
     @g++ -Wall -c $< -o [email protected] with various flags 
+0

非常感謝你!所有作品都完美了!我非常感謝您的幫助! – andryuhat 2012-04-20 10:42:17