2008-11-24 4 views
31

में किसी प्रोजेक्ट के लिए मेकफ़ाइल के लिए निर्भरता उत्पन्न करता है मेरे पास एक प्रोजेक्ट है जिसमें टूटी निर्भरताओं के साथ मेकफ़ाइल है। क्या प्रोजेक्ट के लिए निर्भरताओं की एक सूची उत्पन्न करने का कोई सबसे अच्छा तरीका है जिसे मैं मेकफ़ाइल में उपयोग कर सकता हूं, प्रत्येक स्रोत फ़ाइल को हाथ से या हाथ से लिखित पर्ल स्क्रिप्ट के साथ जांचने के अलावा?सी/सी ++

उत्तर

42

http://make.paulandlesley.org/autodep.html का एक अच्छा समाधान है।

बिल्कुल। जी ++ -एमएम निर्भरताओं की जीएमके संगत सूची उत्पन्न करेगा।

# Add .d to Make's recognized suffixes. 
SUFFIXES += .d 

#We don't need to clean up when we're making these targets 
NODEPS:=clean tags svn 
#Find all the C++ files in the src/ directory 
SOURCES:=$(shell find src/ -name "*.cpp") 
#These are the dependency files, which make will clean up after it creates them 
DEPFILES:=$(patsubst %.cpp,%.d,$(SOURCES)) 

#Don't create dependencies when we're cleaning, for instance 
ifeq (0, $(words $(findstring $(MAKECMDGOALS), $(NODEPS)))) 
    #Chances are, these files don't exist. GMake will create them and 
    #clean up automatically afterwards 
    -include $(DEPFILES) 
endif 

#This is the rule for creating the dependency files 
src/%.d: src/%.cpp 
    $(CXX) $(CXXFLAGS) -MM -MT '$(patsubst src/%.cpp,obj/%.o,$<)' $< -MF [email protected] 

#This rule does the compilation 
obj/%.o: src/%.cpp src/%.d src/%.h 
    @$(MKDIR) $(dir [email protected]) 
$(CXX) $(CXXFLAGS) -o [email protected] -c $< 

क्या ऐसा करेंगे स्वचालित रूप से प्रत्येक फ़ाइल बदल गया है कि के लिए निर्भरता उत्पन्न करते हैं, और जो कुछ के अनुसार उन्हें संकलन है आप जगह में नियम: मैं कुछ इस तरह का उपयोग करें। यह मुझे नई फाइलों को सिर्फ src/निर्देशिका में डंप करने की अनुमति देता है, और उन्हें स्वचालित रूप से निर्भरताओं और सभी में संकलित किया जाता है।

+1

इस जाल में गिर मत करो आप 100 से अधिक फ़ाइलें है, क्योंकि यह बहुत पहली बार धीमी गति से कर रहा है। इस मामले में, आपको एक बार उस चीज का उपयोग करना चाहिए जिसे एक बार बुलाया जाता है, प्रत्येक फ़ाइल के लिए एक बार नहीं। मेडेडपेन्शन में यह विकल्प हो सकता है। काम पर, हम एक कस्टम पर्ल स्क्रिप्ट का उपयोग करते हैं। –

+0

धन्यवाद, मैं इसे ध्यान में रखूंगा। मेरी वर्तमान परियोजना में लगभग एक दर्जन फाइलें हैं, इसलिए इसमें बड़े ओवरहेड नहीं हैं। इसके अलावा, प्रारंभिक निर्माण में 20 मिनट से अधिक समय लगता है, इसलिए मैं हमेशा इसे चलाता हूं, कुछ कॉफी प्राप्त करता हूं, और इसके बाद वृद्धिशील बनाता है। –

+1

धन्यवाद, यह वास्तव में मेरी मदद की। आप '$ (patsubst src /%, obj /%, $ (patsubst% .cpp,% o, $ <) लिख सकते हैं)' '$ (patsubst src /%। Cpp, obj /% o के रूप में थोड़ा सा सरल ' , $ <) '। साथ ही, आउटपुट को '> $ @' के साथ रीडायरेक्ट करने के बजाय विकल्प '-एमएफ $ @' विकल्प का उपयोग करने के लिए और अधिक समझदारी नहीं होगी? जी ++ मैन पेज आपको चेतावनी देता है कि स्टडआउट पर कुछ अवांछित डीबग आउटपुट हो सकता है, लेकिन आपको इसे '-एमएफ $ @ 'के साथ नहीं मिलता है। – Maarten

6

जीएनयू सी प्रीप्रोसेसर सीपीपी में एक विकल्प है, -एमएम, जो समावेशन पैटर्न के आधार पर निर्भरता के मेक-उपयुक्त सेट का उत्पादन करता है।

0

डिजिटल मंगल सी/सी ++ कंपाइलर makedep उपकरण के साथ आता है।

+0

यह किस प्लेटफ़ॉर्म के लिए उपलब्ध है? –

17

अब this portion in particular पढ़ना मुझे लगता है कि वहाँ एक बहुत ही आसान समाधान है, जब तक आपके पास जीसीसी/जी ++ का एक उचित संस्करण है। आप बस अपने CFLAGS करने के लिए -MMD जोड़ते हैं, तो एक चर OBJS अपने सभी वस्तु फ़ाइलों का प्रतिनिधित्व करने को परिभाषित है, और फिर कार्य करें:

-include $(OBJS:%.o=%.d) 

तो यह है कि आप दोनों एक कुशल और सरल स्वचालित निर्भरता निर्माण प्रणाली मिलना चाहिए।

4

मैं सिर्फ makefile को यह जोड़ सकते हैं और यह अच्छी तरह से काम करता है:

-include Makefile.deps 

Makefile.deps: 
    $(CC) $(CFLAGS) -MM *.[ch] > Makefile.deps 
+0

मुझे पता है कि यह जवाब पुराना है, लेकिन यह '* .c' होना चाहिए, न कि' *। [Ch] '- कंपाइलर में प्रत्येक' * .h' में खींचने की आवश्यकता नहीं है - क्योंकि उन्हें कुछ लोगों द्वारा शामिल किया जाना चाहिए '.c' फ़ाइल (ओं) अगर उनका उपयोग बिल्कुल किया जाता है [और यदि वे नहीं हैं, तो निर्भरता कोई फर्क नहीं पड़ता]। –

+0

क्या इसका प्रति-स्रोत निर्भरताओं पर कोई लाभ है?ऐसा लगता है कि आप सभी फाइलों पर प्रीप्रोसेसर पास की संख्या को दोगुना कर देंगे, वास्तविक लाभ के लिए। –

+0

मेकफ़ाइल रेसिपी या कुछ समान उत्पन्न करने के लिए आउटपुट का पुन: उपयोग करने का कोई तरीका है? – PoVa

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