2010-01-02 2 views
3

Я изучаю make-файлы, и я пытаюсь выяснить, как использовать правило. Сейчас у меня есть следующий:Правило правила повторного использования

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

+0

Сделанное вами изменение работает. Спасибо! – AlanT

0

G'day,

я был бы более склонен сделать опцию отладки макросов в 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, которую вы не хотите использовать.

BTW Лучше обратиться к макросам Makefile, используя $ {}, а не $(), поскольку круглые скобки используются для замены объектов в архивах, а фигурные скобки - нет.

Редактировать: Если вы изучаете make и make-файлы, я настоятельно рекомендую прочитать первые несколько глав «Managing Projects with GNU Make». Это поможет вам разобраться в некоторых неинтуитивных аспектах поведения make, особенно. это обратная связь.

Если вы можете найти копию небольшого первого издания, которое не так конкретно, то даже лучше. Это объяснение намного лучше ИМХО.

Редактировать 2: Вот ссылка на сайт Amazon для первого издания книги, просто называемого «Managing Projects with Make». Как я сказал выше, отличное описание того, почему нужно вести себя так, как оно есть.

НТН

веселит,

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" 

Это будет проходить в дополнительные определения в Makefile, чтобы включать _DDEBUG макро, если вы хотите построить релиз, оставить вне EXTRAFLAGS в командной строке.

Edit: Согласно точке отказа Майка, я подумал, что было бы полезно включить дополнительные правила, так что вы можете очистить папку с ехе-х и объектный код, лежащий вокруг ... Это был мой оригинальный шаблон Makefile от AIX (который я использовал и под Linux ...) Спасибо Майку за головы!

Надеюсь, это поможет, С уважением, Tom.

+0

Разве это не 'FILES = Exercise35.cpp'? Кроме того, почему конечная точка с запятой в правиле '$ (APP)? И вам не нужно правило '.PHONY: все clobber clean mrproper'? –

+0

@Mike: К сожалению ... эта точка с запятой ... Я отредактирую это соответственно ... :( – t0mm13b

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