2012-01-23 18 views
6

में एकाधिक स्रोत फ़ाइल एक्सटेंशन के साथ काम करना मेरे पास स्रोत फ़ाइलों (.cpp, .c, .cc) के लिए विभिन्न एक्सटेंशन और शीर्षलेख फ़ाइलों (.hpp, .h, .hh) के लिए विभिन्न एक्सटेंशन के साथ एक C++ प्रोजेक्ट है।)। स्रोत फ़ाइलें एक निर्देशिका एसआरसी कहा जाता है में स्थित हैं, और हेडर फाइल एक निर्देशिका कांग्रेस बुलाया में जाहिर कर रहे हैं।मेकफ़ाइल

मैं की तरह

vpath %.c $(SRC) 

%.o: %.c 
    $(COMPILER) $(FLAGS) $< $(INCFLAG)$(INC) 

निश्चित रूप से यह काम करता है, तो एक नियम के साथ स्रोत संकलित करने के लिए चाहते हैं मुझे पता है कि स्रोत फ़ाइल फॉर्म% .c का होगा, लेकिन कई संभावित फ़ाइल एक्सटेंशन के मामले में, मुझे% .cpp और% .cc के लिए एक समान नियम बनाना होगा। निस्संदेह तीन नियम लिखने का एक बड़ा सौदा नहीं है, लेकिन नियमों को दोबारा लिखने के बिना, किसी भी परियोजना के लिए किसी भी प्रोजेक्ट के लिए ड्रैग और ड्रॉप के रूप में इस मेकफ़ाइल का उपयोग करने में सक्षम होना अच्छा होगा।

SRC_EXT = cpp c cc 
vpath %.$(SRC_EXT) $(SRC) 

%.o: %.$(SRC_EXT) 
    $(COMPILER) $(FLAGS) $< $(INCFLAG)$(INC) 

आपकी मदद के लिए धन्यवाद:

तो मैं कैसे एक नियम (या कुछ अन्य निर्माण कि एक ही लक्ष्य पूरा करता है) कि तरह काम करता है लिख सकते हैं।

उत्तर

3

आप मानक पॉज़िक्स बनाने में नहीं कर सकते हैं। हालांकि जब से आप vpath का उल्लेख करते हैं, तो मुझे लगता है कि आप जीएनयू बनाने का उपयोग कर रहे हैं। आप पर्याप्त रूप से नया जीएनयू बनाने की जरूरत नहीं है, तो या कोई वैकल्पिक समाधान पसंद करेंगे

SRC_EXT = cpp c cc 

define compile_rule 
%.o : %.$1 
     $$(COMPILER) $$(FLAGS) $$< $$(INCFLAG)$$(INC) 
endef  
$(foreach EXT,$(SRC_EXT),$(eval $(call compile_rule,$(EXT)))) 

, आप: यदि आप एक पर्याप्त नए संस्करण (3.81 या नया) है, तो आप कॉल और eval साथ यह आसानी से पर्याप्त कर सकते हैं जेनरेट मेकफ़ाइल के साथ एक ही काम कर सकते हैं।

+0

आह! महान! मैं सोच रहा था कि एक संकलन नियम कैसे कॉल करें, लेकिन पहले स्थान पर प्रचार कैसे कहा जाता है? क्या यह फाइल में बस बैठा है, जैसा कि आप SRC_EXT चर सेट करने के बाद सही कहलाते हैं? क्या यह सभी स्रोत फ़ाइलों का पुनर्मूल्यांकन करेगा भले ही .o की तारीख अद्यतित हो? – user487100

+1

मेकफ़ाइल पार्सिंग चीजों का विस्तार करने के बारे में सब कुछ है। जब भी "तत्काल संदर्भ" में किसी चर या कार्य को मुठभेड़ करते हैं (जीएनयू मैनुअल में "मेकफ़ाइल कैसे पढ़ा जाता है" देखें), यह इसे विस्तारित करेगा। इसमें पाठ्यक्रम के कई कदम शामिल हो सकते हैं। एक बार विस्तार पूरा होने के बाद, जो भी बचा है उसे मेकफ़ाइल के रूप में पार्स किया जाता है। Eval समारोह अतिरिक्त विशेष है। असल में इस फोरैच लूप को मेकफ़ाइल में पढ़ते समय विस्तारित और पार्स किया जाता है, और यह नियमों को उसी तरह परिभाषित करता है जैसे कि आप उन्हें लिखते हैं। तो यह किसी अन्य मेक नियम की तरह व्यवहार करता है (पुनर्मूल्यांकन को मजबूर नहीं करेगा)। – MadScientist

+0

बहुत अच्छा। धन्यवाद! – user487100