2008-10-22 9 views
18

मेरे पास मेकफ़ाइल है जो बिल्ड नियमों को लागू करने से पहले एक उपकरण चलाकर शुरू होता है (जो यह टूल मेरे लिए लिखता है)। यदि यह टूल, जो एक पायथन स्क्रिप्ट है, एक गैर-शून्य स्थिति कोड से निकलता है, मैं चाहता हूं कि जीएनयू वहां रुकें और प्रोग्राम बनाने के साथ आगे बढ़ें।

वर्तमान में, मैं कुछ इस तरह (शीर्ष स्तर, यानी स्तंभ 1) कार्य करें:

$(info Generating build rules...) 
$(shell python collect_sources.py) 
include BuildRules.mk 

लेकिन यह कर रोक नहीं करता है तो 1. की एक स्थिति कोड के साथ collect_sources.py बाहर निकलता है यह भी के मानक उत्पादन कब्जा collect_sources.py लेकिन इसे प्रिंट नहीं करता है, इसलिए मुझे लगता है कि मैं गलत दिशा में देख रहा हूं।

यदि संभव हो तो समाधान भी काम करना चाहिए जब एक साधारण एमएस-डॉस खोल मानक सिस्टम खोल है।

कोई सुझाव?

+1

यदि आपके पास जीएनयू 4.2 या इससे ऊपर है, तो आप '$ (। SHELL_STATUS)' चर की जांच कर सकते हैं जिसमें अंतिम '$ (खोल ...)' फ़ंक्शन का निकास स्थिति शामिल होगी। – MadScientist

+0

परिवर्तनीय नाम '_' के बिना' $ (। SHELLSTATUS) 'है। https://www.gnu.org/software/make/manual/html_node/Shell-Function।एचटीएमएल # शैल-फ़ंक्शन – user3159253

उत्तर

4

ठीक है, यहाँ अपने ही समाधान है, जो दुर्भाग्य से collect_sources.py स्क्रिप्ट की स्थिति कोड पर आधारित नहीं है, लेकिन मेरे (टीएम) के लिए काम करता है और मुझे किसी भी उत्पादन देखते हैं कि स्क्रिप्ट का उत्पादन करने देता है:

SHELL_OUTPUT := $(shell python collect_sources.py 2>&1) 
ifeq ($(filter error: [Errno %],$(SHELL_OUTPUT)),) 
    $(info $(SHELL_OUTPUT)) 
else 
    $(error $(SHELL_OUTPUT)) 
endif 

लिपि लिखी गई है ताकि कोई भी त्रुटि "collect_sources: error:" से शुरू होने वाले आउटपुट का उत्पादन करे। इसके अतिरिक्त, यदि पाइथन दिए गए स्क्रिप्ट को नहीं ढूंढ या निष्पादित नहीं कर पाता है, तो यह "[Errno 2]" या इसी तरह के संदेश वाले त्रुटि संदेश को आउटपुट करता है। तो कोड का यह छोटा टुकड़ा सिर्फ आउटपुट को कैप्चर करता है (stderr को stdout पर रीडायरेक्ट करता है) और त्रुटि संदेशों की खोज करता है। यदि कोई नहीं मिला है, तो यह आउटपुट प्रिंट करने के लिए बस $(info) का उपयोग करता है, अन्यथा यह $(error) का उपयोग करता है, जो प्रभावी रूप से मेक स्टॉप बनाता है।

ध्यान दें कि ifeq ... endif में इंडेंटेशन रिक्त स्थान के साथ किया जाता है। यदि टैब का उपयोग किया जाता है, तो सोचें कि आप कमांड का आह्वान करने और इसके बारे में शिकायत करने का प्रयास कर रहे हैं।

6

वहाँ एक बेहतर तरीका हो सकता है, लेकिन मैं कोशिश की निम्नलिखित है और यह काम करता है:

$(if $(shell if your_command; then echo ok; fi), , $(error your_command failed)) 

यहाँ मुझे लगता है था कि your_command किसी भी उत्पादन नहीं देता है, लेकिन यह इस तरह के आस-पास काम करने के लिए कठिन नहीं होना चाहिए एक स्थिति।

संपादित करें: इसे डिफ़ॉल्ट विंडोज शैल (और शायद किसी भी सभ्य खोल) के साथ काम करने के लिए फ़ंक्शन के भीतर if के बजाय your_command && echo ok लिख सकता है। मुझे नहीं लगता कि यह (पुराने) डॉस गोले के लिए संभव है। इनके लिए आप शायद your_command को अनुकूलित करना चाहते हैं या त्रुटि (या सफलता) पर कुछ प्रिंट करने के लिए एक रैपर स्क्रिप्ट लिखना चाहते हैं।

+0

हालांकि, यह एक यूनिक्स खोल मानता है। – JesperE

+0

धन्यवाद, सही दिशा में एक कदम की तरह दिखता है; इच्छा है कि इसे शेरर() की तरह मैक्रोराइज्ड किया जा सके, अब तक इसका प्रबंधन नहीं हुआ है। –

+0

बस इसे बाहर डालें, अगर आप यूनिक्स (मैं पूरी तरह से हूं) मानने के इच्छुक हैं, तो यह एकमात्र संस्करण था जिसे मैंने पाया था। मैं 'परिभाषित टेम्पलेट' में कुछ बकवास कर रहा था जो बाद में '$ (eval $ (कॉल टेम्पलेट, arg1, arg2)' था ... जो कि भयानक था। लेकिन यह उपर्युक्त के साथ पूरी तरह से काम करता है, $ 5 को दोगुना करने के लिए सावधान रहना $ '* सबकुछ * आशा है कि इस दिन से कुछ लाभ प्राप्त करें (शुरुआत में' @ 'क्योंकि मैं लक्ष्य परिभाषा में हूं):' $$ (यदि $$ (खोल अगर ./generate.sh $ (2) $ (1); फिर "स्कोर"; एफआई), $$ (त्रुटि [$ (1)] [$ (2)] उत्पन्न करने में त्रुटि [) ( – sjm324

4

आप BuildRules.mk बनाने के लिए एक नियमित रूप से लक्ष्य का उपयोग करना चाहिए:

BuildRules.mk: collect_sources.py 
     python $< >[email protected] 

include BuildRules.mk 

यह उपयोग करने के लिए जब स्वचालित रूप से निर्भरता पैदा मानक चाल है।

+0

जेस्पर, आपके इनपुट के लिए धन्यवाद, लेकिन मैं नहीं करता यह नहीं देखता कि आपका नियम मेरी समस्या को कैसे ठीक कर सकता है। मुझे हर बार चलाने के लिए collect_sources.py की आवश्यकता है, ताकि मैं स्रोत फ़ाइलों और नियमों आदि की सूची अपडेट कर सकूं या क्या मुझे कुछ याद आ रहा है? –

+0

एक ".PHONY: BuildRules जोड़ें। एमके "शीर्ष पर, फिर – JesperE

+0

शायद मुझे यहां कुछ स्पष्ट याद आ रही है, लेकिन मुझे यह सही तरीके से काम करने के लिए प्रतीत नहीं होता है। BuildRules.mk हर बार रीमेड होता है (.PHONY का उपयोग करके), लेकिन इससे पहले इसमें शामिल होता है किया जाता है। इसका प्रभावी अर्थ यह है कि आप हमेशा के लिए हैं पिछले BuildRules.mk का उपयोग कर रहा हूँ। – mweerden

-1

सुनिश्चित करें कि आप -k विकल्प के साथ मेक/gmake का आह्वान नहीं कर रहे हैं।

+0

आपका सुझाव तार्किक लगता है, लेकिन सच्चाई यह है कि 'खोल' विकल्प 'shell' फ़ंक्शन में कमांड कमांड पर' मेक 'के व्यवहार पर कोई प्रभाव नहीं पड़ता है। –