2009-10-29 14 views
28

काम पर हम एक सामान्य मेकफ़ाइल का उपयोग करते हैं जिसमें अन्य मेकफ़ाइल शामिल हैं (शामिल कथन के माध्यम से) और इसमें एक सामान्य "साफ" लक्ष्य है जो कुछ सामान्य फ़ाइलों को मारता है। मैं अपने नए मेकफ़ाइल में उस लक्ष्य को जोड़ना चाहता हूं, इसलिए मैं कुछ विशिष्ट फाइलों को हटा सकता हूं, लेकिन अगर मैं अपने मेकफ़ाइल में एक साफ लक्ष्य जोड़ता हूं, तो यह पुराने को ओवरराइड करता है।मेकफ़ाइल में अधिक आदेश जोड़ने के लिए लक्ष्य ओवरराइड करें?

मुझे पता है कि मैं सिर्फ एक नए नाम के साथ एक नया लक्ष्य बना सकता हूं और इसे साफ कर सकता हूं, और फिर अन्य सामान भी कर सकता हूं, लेकिन स्थिरता के लिए मैं बस साफ करने और इसे करने में सक्षम होना चाहता हूं सब कुछ।

क्या यह संभव है?

उत्तर

26

आप अपना खुद का साफ लिख सकते हैं और इसे सामान्य साफ का एक प्राथमिक बना सकते हैं।

 
clean: myclean 

myclean: 
    rm whatever 

आपका पहला भाग जाएगा। अगर किसी कारण से आप पहले सामान्य चलाने के लिए सामान्य साफ करना चाहते हैं तो समाधान अधिक जटिल होगा।

+1

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

+4

@ डेव रॉक्स, आप गलत समझते हैं, मैंने जो लिखा है वह * स्थानीय * मेकफ़ाइल में जाएगा, सामान्य मेकफ़ाइल नहीं। इसके अलावा, दो लक्ष्य नाम होने के कारण ओपी ने कहा कि वह नहीं चाहते थे। डबल-कोलन विचार चालाक है, हालांकि इसमें सामान्य मेकफ़ाइल को संशोधित करना शामिल होगा (और स्थानीय मेकफ़ाइल को सामान्य नियम को ओवरराइड करने की अनुमति नहीं देगा)। – Beta

+0

धन्यवाद, मुझे पहले इस संबंध का एहसास नहीं हुआ था। – Bohdan

5

ऐसा लगता है कि सामान्य मेकफ़ाइल नियम को common-clean जैसे कुछ कहा जाना चाहिए। फिर प्रत्येक मुख्य मेकफ़ाइल

clean: common-clean 

और आपके सेट के रूप में उनके स्वच्छ नियम घोषित करेगा।

यदि यह कोई विकल्प नहीं है, तो आप double colon rules पर एक नज़र डाल सकते हैं, लेकिन वे विचार करने के लिए अन्य मुद्दों का एक सेट सेट करते हैं।

49

मैंने इसे कई दुकानों में देखा है। सबसे आम तरीका डबल-कोलन नियमों का उपयोग करना है, मानते हुए कि आप जीएनयू बनाने जैसे कुछ उपयोग कर रहे हैं।

clean:: 
     # standard cleanup, like remove all .o's: 
     rm -f *.o 

नोट निम्नलिखित cleanदो कोलन देखते हैं कि सिर्फ एक नहीं: अपने सामान्य makefile में आप कुछ इस तरह होता है!

अपने अन्य makefile में आप बस फिर clean घोषित, एक डबल पेट के नियम के रूप में:

clean:: 
     # custom cleanup, like remove my special generated files: 
     rm -f *.h.gen 

जब आप make clean आह्वान, जीएनयू बनाने स्वतः इन स्वच्छ शासन के "शाखाओं" के दोनों चलेंगे:

% make clean 
rm -f *.o 
rm -f *.h.gen 

यह स्थापित करना आसान है और यह मुझे लगता है कि यह काफी अच्छी तरह से composes। ध्यान दें कि विशेष रूप से क्योंकि यह एक डबल-कोलन नियम है, आपको "ओवरराइडिंग कमांड" त्रुटियां नहीं मिलती हैं जिन्हें आप सामान्य रूप से प्राप्त करते हैं जब आप एक ही लक्ष्य के लिए दो नियम परिभाषित करते हैं। यह डबल-कॉलन नियमों का बिंदु है।

+0

धन्यवाद एरिक, यह भी काम करता है, लेकिन अगर मैं कर सकता हूं तो मैं सामान्य मेकफ़ाइल को संशोधित करने से बचूंगा। –

+1

मैं बस इसकी तलाश कर रहा था और मेरे मामले में डबल-कोलन सही समाधान है। बहुत धन्यवाद! – aurora

1

हमारा के लिए, हम एक चर को परिभाषित, EXTRAFILESTOCLEAN, तो जब स्वच्छ शासन चलता है, यह उस अनपेक्षित समस्याएं पैदा कर सकता है, तो आपको लगता है कि चर सेट कुछ भी दूर करने के लिए एक कदम EXTRAFILESTOCLEAN चर

clean: 
    rm -f *.o 
ifdef $(EXTRAFILESTOCLEAN) 
    rm -f $(EXTRAFILESTOCLEAN) 
endif 

में निर्दिष्ट है अजीब मूल्यों के लिए, लेकिन आप उपसर्ग या अन्य परीक्षण जोड़कर उन लोगों के खिलाफ सुरक्षा कर सकते हैं।

3

उपयोग निहित नियम: और डबल पेट :: नियम:

existing-target: my-extention 

my-extention: 
    echo running command 1 
    echo running command 2 

Very simple make tutorial to ramp up.

जब :: का उपयोग कर आप के बाद से कर शिकायत जब आप एक बृहदान्त्र मिश्रण मुद्दों में चला सकते हैं :

a: 
    echo a 

a:: 
    echo aa 

परिणाम देगा में:

. . . 
*** target file `a' has both : and :: entries. Stop. 
0

एक और संभव समाधान मैं भावी पीढ़ी के लिए देखा है जोड़ा जा रहा है ... मुझे पता ओपी आम makefile बदलने के बारे में सावधान था, लेकिन कुछ इस तरह काम करता है और कम से कम परिवर्तन शामिल है।

स्थानीय makefile 1:

CLEAN=MyExe1 MyExe2 
.... 
include /my/common/makefile 

स्थानीय makefile 2:

CLEAN=MyExe3 MyExe4 
.... 
include /my/common/makefile 

आम makefile:

clean: 
    rm -f *.dep *.o *.a $(CLEAN) 

मूल रूप से विचार (इस मामले CLEAN में) कुछ चर को परिभाषित करने के लिए है प्रत्येक स्थानीय मेकफ़ाइल में उन सभी विशिष्ट आइटमों के साथ जिन्हें आप हटाना चाहते हैं। फिर आम मेकफ़ाइल rm -f को सभी सामान्य फ़ाइल प्रकारों को हटाने के लिए चलाता है, साथ ही जो भी CLEAN चर के माध्यम से प्रत्येक स्थानीय मेकफ़ाइल में हटाने के लिए विशेष रूप से फ़्लैग किया गया था। हटाने के लिए विशेष कुछ भी नहीं है, तो बस चर घोषणा को छोड़ देते हैं या छोड़ यह खाली (CLEAN=)

तो अब अगर हम स्थानीय makefile 1 के लिए चलाने make clean, यह कार्यान्वित

rm -f *.dep *.o *.a MyExe1 MyExe2 

और हम स्थानीय के लिए make clean चलाते हैं मेकफ़ाइल 2, यह

rm -f *.dep *.o *.a MyExe3 MyExe4 
संबंधित मुद्दे