2011-02-01 2 views
8

Рассмотрим следующий Makefile:Как условно включить файл в Makefile?

# <include global configuration Makefile> 

INCL = -I../include \ 
     -I<whatever> 

CPPFLAGS=$(DEFS) $(INCL) 
CXXFLAGS = -O0 -g -Wall -fmessage-length=0 

SRCS = $(wildcard *.cpp) 

OBJS = $(SRCS:.cpp=.o) 

all: $(OBJS) 

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


depend: .depend 

.depend: $(SRCS) 
    $(CPP) $(CPPFLAGS) -M $^ > [email protected] 

clean: 
    rm -f $(OBJS) 
    rm .depend 


-include .depend 

Этот Makefile создает цепочку в #include зависимостей, используя команду g++ -M, и включает его. Это может быть довольно долгий процесс. Проблема в том, что этот файл генерируется, даже если вызывается make clean, когда этот файл будет удален в любом случае. Является ли этот способ условным образом включать этот файл и не создавать его, если выполняется чистая цель?

+0

Ответы подробно [здесь] [1]. [1]: http://stackoverflow.com/questions/3714041/why-does-this-makefile-execute-a-target-on-make-clean/3714054#3714054 –

ответ

12

Что-то вроде этого:

ifneq ($(MAKECMDGOALS),clean) 
-include .depend 
endif 

Смотрите make manual page on Goals для получения дополнительной информации

Edit: -include не может быть вкладка с отступом, в противном случае она игнорируется.

1

Вы можете делать такие зависимости для бесплатно (то есть при отсутствии времени исполнения) во время компиляции. Когда вы запускаете clean, зависимости, естественно, не переделываются. См. Раздел Объединение генерации компиляции и зависимостей в статье Пола Смита Advanced Auto-Dependency Generation.

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