2011-08-22 15 views
5

मैं मेकफ़ाइल लिख रहा हूं जो कुछ निर्भरता पीढ़ी करता है और मुझे खुद को नियमों को डुप्लिकेट करना पड़ता है क्योंकि (विरासत) कोडेबेस में .cpp और .cc फ़ाइलों का मिश्रण होता है। यह थोड़ा अस्पष्ट लगता है। क्या यह निर्दिष्ट करने के लिए वैसे भी है कि किसी लक्ष्य की पूर्वापेक्षाएँ या तो .cpp या .cc फ़ाइलें हो सकती हैं?जीएनयू डुप्लिकेट करने से बचें नियम बनाएं

तो बजाय होने:

%.d : %.cpp 
    $(CPP) -MM $(CPPFLAGS) $< 

%.d : %.cc 
    $(CPP) -MM $(CPPFLAGS) $< 

तरह दोहराव के बिना कुछ बनाएँ:

%.d : %.(cpp | cc) 
    $(CPP) -MM $(CPPFLAGS) $< 

या इस से लागू अतिरेक सिर्फ जीएनयू की एक दुर्भाग्यपूर्ण तत्व के डिजाइन बनाने है?

+0

अगर आप का उपयोग करें जीएनयू ऑटोोटूल आप संभवतः एम 4 मैक्रोज़ – Kevin

उत्तर

3

पहले विकल्प, एक बार शासन शरीर को परिभाषित करने के लिए एक चर का उपयोग, और जरूरत के रूप में यह पुन: उपयोग:

DEPGEN=$(CPP) -MM $(CPPFLAGS) $< 
%.d: %.cpp ; $(DEPGEN) 
%.d: %.cc ; $(DEPGEN) 

दूसरा विकल्प, $(eval) का उपयोग गतिशील नियमों उत्पन्न करने के लिए:

$(foreach src,cpp cc,$(eval %.d: %.$(src) ; $$(CPP) -MM $$(CPPFLAGS) $$<)) 
+0

विकल्प एक वही है जो मैं ढूंढ रहा था। – Alastair

1

यह काम करना चाहिए:

%.d :: %.cpp 
    $(CPP) -MM $(CPPFLAGS) $< 

%.d :: %.cc 
    $(CPP) -MM $(CPPFLAGS) $< 

एक और विचार:

%.d : %.c 
    $(CPP) -MM $(CPPFLAGS) $< 

%.c : %.cpp 
    ln $< [email protected] # or cp -p 

एक और विचार जीएनयू दो पैटर्न नियमों उत्पन्न कर बनाना है। वहाँ essentally ऐसा करने के दो तरीके हैं:

  • उन्हें makefiles (%-cc.mk या समान) है कि आप जीएनयू मेकअप के include बयान के साथ अपने वास्तविक makefile भीतर शामिल
  • पैदा करते हैं और उन्हें जीएनयू मेकअप के $(eval) और साथ इनलाइन का मूल्यांकन करने के बारे में $(call) कार्यों
सी/यूनिक्स विकास toolchain में और सबसे सब कुछ की तरह

, इन तकनीकों अनिवार्य रूप से पूर्व प्रसंस्करण का एक रूप है, उन्हें वास्तव में कड़ी मेहनत करने के लिए किया जा रहा है की कीमत पर समझने में आसान बनाने उपयोग करें (बहुत सारे डबल या ट्रिपल एस्केपिंग, जो कि विस्तारित होने पर ट्रैक रखने के लिए वास्तव में कठिन है; डिबगिंग कम से कम मेरे अनुभव में शाही दर्द हो सकता है)।

तो उन्हें अधिक जटिल उपयोग मामलों के लिए आरक्षित करें (जिनमें से स्टैक ओवरफ़्लो कुछ सूचीबद्ध करता है)।

+0

का उपयोग कर सकते हैं, इनमें से कोई भी विकल्प अधिक संक्षिप्त मेकफ़ाइल का कारण नहीं लगता है। मैं शायद मूल रूप से बस रहूँगा। यद्यपि आपके सुझावों के लिए धन्यवाद। – Alastair

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