2010-07-16 14 views
58

निष्पादित मैं एक makefile कुछ इस तरह से संरचित है:makefile एक और लक्ष्य

all : 
    compile executable 

clean : 
    rm -f *.o $(EXEC) 

मुझे एहसास हुआ कि मैं लगातार चल रहा था "स्वच्छ बनाने के" चल "सभी बनाने के" से पहले "स्पष्ट" मेरी टर्मिनल में किया गया। मैं बुरा सी ++ संकलन त्रुटियों के माध्यम से प्रयास करने और sift करने से पहले एक स्वच्छ टर्मिनल रखना पसंद है। तो मैंने तीसरा लक्ष्य जोड़ने की कोशिश की:

fresh : 
    rm -f *.o $(EXEC) 
    clear 
    make all 

यह काम करता है, हालांकि यह बनाने का दूसरा उदाहरण (मुझे विश्वास है) चलाता है। क्या दूसरा कार्यक्षमता चलाने के बिना समान कार्यक्षमता प्राप्त करने का कोई सही तरीका है?

उत्तर

96

वास्तव में आप सही हैं: यह बनाने का एक और उदाहरण चलाता है। सम्भावित समाधान होगा:

.PHONY : clearscr fresh clean all 

all : 
    compile executable 

clean : 
    rm -f *.o $(EXEC) 

fresh : clean clearscr all 

clearscr: 
    clear 

make fresh बुला कर आप पहले clean लक्ष्य मिलता है, तो clearscreen जो clear और अंत में all जो काम करता है चलाता है।

संपादित

क्या समानांतर के मामले में होता मेकअप के -j विकल्प के साथ बनाता है? आदेश को ठीक करने का एक तरीका है। मेकअप पुस्तिका से, अनुभाग 4.2:

कभी कभी, हालांकि, आप एक स्थिति है जहाँ आप नियमों पर एक विशेष आदेश लागू करने के लिए लक्ष्य से अद्यतन किया जा करने के लिए मजबूर बिना लागू किया जा सकता है अगर उन नियमों में से एक को मार डाला है चाहता हूँ । उस स्थिति में, आप ऑर्डर-केवल पूर्वापेक्षाएँ परिभाषित करना चाहते हैं। ऑर्डर-केवल पूर्वापेक्षाएँ पूर्वापेक्षाएँ सूची में पाइप प्रतीक (|) डालकर निर्दिष्ट की जा सकती हैं: पाइप प्रतीक के बाईं ओर की कोई भी पूर्व शर्त सामान्य है; दाईं ओर की कोई भी शर्त केवल ऑर्डर ही है: लक्ष्य: सामान्य-पूर्वापेक्षाएँ | ऑर्डर-केवल-पूर्वापेक्षाएँ

सामान्य पूर्वापेक्षाएँ अनुभाग निश्चित रूप से खाली हो सकता है। साथ ही, आप अभी भी एक ही लक्ष्य के लिए पूर्वापेक्षाएँ की कई पंक्तियां घोषित कर सकते हैं: वे उचित रूप से संलग्न हैं। ध्यान दें कि यदि आप एक ही फ़ाइल को एक सामान्य और ऑर्डर-केवल दोनों शर्त के रूप में घोषित करते हैं, तो सामान्य शर्त को प्राथमिकता मिलती है (क्योंकि वे ऑर्डर-केवल पूर्व शर्त के व्यवहार का सख्त सुपरसैट हैं)।

इसलिए makefile

.PHONY : clearscr fresh clean all 

all : 
    compile executable 

clean : 
    rm -f *.o $(EXEC) 

fresh : | clean clearscr all 

clearscr: 
    clear 
+1

@ sas4740।: मूल रूप से सबकुछ 'PHONY:' का पालन करता है, जिसे कुछ कीवर्ड के रूप में माना जाता है जो हमेशा निष्पादित हो जाता है, जबकि गैर-नकली लक्ष्य फाइल होने का इरादा रखते हैं। – Dacav

+0

"ऑर्डर-केवल पूर्वापेक्षाएँ" सशर्त हैं? लक्ष्य टी 2 के लिए मैं पहले टी 0 चाहता हूं, केवल टी 0 सक्सेड टी 1 चलाएं, और केवल तभी दोनों सैकड़ों t3 – fantastory

+1

@ फ़ैंटस्टोरी में कुछ कार्य चलाएं, नहीं, मुझे लगता है ** वे स्वतंत्र हैं। 't2'' t0', 't1' और' t3' पर निर्भर करेगा। यदि आपको इसकी आवश्यकता है तो आपको 't3',' t1' के अनुसार 't3' और' t1' के अनुसार आवश्यक 't3' रखना चाहिए, जैसा कि' t1' द्वारा आवश्यक है। इसका मतलब है 3 अलग-अलग नियम। हालांकि, आपको यह सत्यापित करना चाहिए। मैं 100% निश्चित नहीं हूँ। – Dacav

-11

हो जाता है linux कमांड प्रॉम्प्ट पर: स्पष्ट &

+0

मुझे लगता है कि आपका मतलब "साफ करें और साफ़ करें" लेकिन यह लोड करने की अक्षमता में मदद नहीं करता है दूसरी बार –

+7

क्या आप इसे और अधिक स्पष्ट कर सकते हैं :) – fantastory

+3

@fantastory: 'स्पष्ट करें' के साथ प्रयास करें। more' – Dacav

0

कर आप अपने "ताजा" लक्ष्य से make all लाइन निकाल दिया था:

fresh : 
    rm -f *.o $(EXEC) 
    clear 

आप आसानी से आदेशचला सकते हैं 10, जो make fresh; make all के रूप में निष्पादित होगा।

कुछ मेकअप का एक दूसरा उदाहरण के रूप में इस पर विचार हो सकता है, लेकिन यह निश्चित रूप से कर, जो है कि आपके प्रयास का परिणाम लग रहा था (एक मेकअप के अंदर एक मेक) की एक उप-उदाहरण नहीं है

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