2012-04-20 3 views
2

Нужна ваша помощь при проектировании make-файла. Итак, что у меня есть и чего я хочу получить. Мне нужно создать два исполняемых файла. Исходный код распространен. Препроцессор макросов контроль различий для обоего EXEs, например, в main.cpp:Проецирование make-файла для конфигураций отладки/выпуска

#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

Вы хотите построить обе версии с одним вызовом Make? Или это достаточно, чтобы иметь возможность строить любую версию? – Beta

+0

@Beta, это будет нормально, если make будет вызываться отдельно для каждой версии: make && make debug. – andryuhat

ответ

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

спасибо u очень !! Все работает отлично! Я очень благодарен за вашу помощь! – andryuhat

Смежные вопросы