2011-02-01 14 views
8

पर विचार करें निम्नलिखित 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 g++ -M आदेश का उपयोग कर एक #include निर्भरता श्रृंखला बनाता है, और यह भी शामिल है। यह एक लंबी प्रक्रिया हो सकती है। समस्या यह है कि यह फ़ाइल तब भी उत्पन्न होती है जब 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 देखें

संपादित करें: -include, टैब इंडेंट नहीं किया जा सकता अन्यथा यह नजरअंदाज कर दिया है।

1

संकलन के दौरान आप मुफ्त (यानी, बिना रनटाइम लागत पर) के लिए ऐसी निर्भरताएं कर सकते हैं। जब आप clean चलाते हैं, तो निर्भरता स्वाभाविक रूप से रीमेड नहीं होती है। पॉल स्मिथ के Advanced Auto-Dependency Generation पेपर में संकलन संकलन और निर्भरता जनरेशन का संयोजन देखें।

संबंधित मुद्दे