2008-10-20 13 views
5

पर कमांड लाइन प्रतिध्वनित करने के लिए शांत मेक हो रही है मैं लंबे कमांड लाइनों के साथ कई सी फ़ाइलों का निर्माण एक Makefile है और हम इस तरह के रूप नियम होने से उत्पादन को साफ कर दिया है:त्रुटि

.c${MT}.doj: 

     @echo "Compiling $<";\ 
     $(COMPILER) $(COPTS) -c -o [email protected] $< 

अब इस महान है क्योंकि @ उत्सर्जन लाइन उत्सर्जित हो जाती है। लेकिन जब हमें कोई त्रुटि मिलती है, तो हमें जो त्रुटि मिलती है, कोई कमांड लाइन नहीं होती है। क्या कोई भी कमांड लाइन को उत्सर्जित करने के लिए "साफ" तरीका सोच सकता है? मैं बस ऐसा करने के बारे में सोच सकता हूं कि इसे फ़ाइल में गूंज रहा है और उच्च स्तर पर त्रुटि पकड़ने और फ़ाइल को बिल्ली को पकड़ने के लिए है। हैकी मुझे पता है।

उत्तर

7

परीक्षण किया गया है और यह काम किया (जीएनयू लिनक्स में करना):

.c${MT}.doj: 
    @echo "Compiling $<";\ 
      $(COMPILER) $(COPTS) -c -o [email protected] $< \ 
      || echo "Error in command: $(COMPILER) $(COPTS) -c -o [email protected] $<" \ 
      && false 
+2

ध्यान दें कि इस तरह से अब नोटिस नहीं होता है कि आदेश विफल हुआ और जारी रहेगा जैसे कि यह सफल हुआ। हो सकता है कि आप इसके लिए क्षतिपूर्ति करने के लिए अंत में "&& false" जोड़ सकें। – mweerden

+0

मुझे ब्रैकेट जोड़ने की आवश्यकता है जैसे: @echo ...; संकलित करें ... || (गूंज ... & झूठी) –

0

एक सरल समाधान की तरह एक साधारण स्क्रिप्ट abc उपयोग करने के लिए किया जाएगा निम्नलिखित:

#!/bin/bash 

[email protected] 
code=$? 
if ((code)); then 
    echo error running [email protected] 
fi 
exit $code 

तो फिर तुम में abc $(COMPILER) $(COPTS) -c -o [email protected] $< लिख सकते हैं आपका Makefile। ध्यान दें कि जब आपके पास पाइप या रीडायरेक्ट होते हैं तो यह काम नहीं करता है (क्योंकि उन्हें चलाने के लिए abc पर लागू किया जाएगा)।

यदि आप बेहतर हैं तो आप सीधे Makefile में समान कोड भी डाल सकते हैं।

0

मैंने हाल ही में बल्ले फ़ाइल निष्पादन के दौरान आउटपुट के दौरान क्या हुआ था, यह ट्रैक करने की पसंद के लिए logtext नामक एक उपयोगिता का उपयोग किया। इसे देखें, अगर आप जानना चाहते हैं कि कौन सी त्रुटि हुई है तो आपको यह बहुत उपयोगी लगेगा।

7

यह सवाल बहुत पुराना है, लेकिन आप Googling के उन लोगों के लिए, मुझे लगता है कि मैं क्या इस स्थिति में क्या करेंगे मेरी खोल में make -s (साइलेंट मोड) के रूप में नामित make है, और केवल लाइनों से पहले @ उपसर्ग डाल जहां echo या अन्य नैदानिक ​​आदेशों का आह्वान किया जा रहा है। जब मैं make से पूर्ण आउटपुट चाहता हूं, तो मैं इसे अपने उपनाम को \make के रूप में कॉल करके ओवरराइड कर दूंगा।

यह भी ध्यान रखें कि इस स्थिति में आपको सामान्य चीज करने की आवश्यकता होगी और @echo को अपनी लाइन पर, वास्तविक नियम कमांड पर अलग-अलग लाइनों पर और @ के बिना डालें।