2012-01-10 14 views
9

में सशर्त नियमों का उपयोग करके मैं छद्म कोड में मेकफ़ाइल का इरादा कैप्चर करता हूं, फिर मेरे पास मौजूद मुद्दों का संकेत देता हूं। मैं एक मेकफ़ाइल ढूंढ रहा हूं जो एक परीक्षण वातावरण में अधिक उपयोगकर्ता के अनुकूल है। मेकफ़ाइल का सही उपयोग नीचे से एक है।मेकफ़ाइल

make CATEGORY=parser TEST=basic. 
    make ALL 

एक उपयोगकर्ता देता है तो "बस" आदेशों के रूप में नीचे दिया गया है, यह एक संदेश कह "श्रेणी में परिभाषित किया गया टेस्ट अपरिभाषित" और प्रिंट चाहिए उपाध्यक्ष प्रतिकूल

make CATEGORY=parser 
    make TEST=basic 

मैं निम्नलिखित में Makefile लेखन की कोशिश की तरीके, लेकिन यह त्रुटियों आउट:

help: 
     echo"Usage: make CATEGORY=<advanced|basic> TEST=<test-case> 
     echo"  make ALL 

    ifdef CATEGORY 
     ifdef TEST 
      CATEGORY_TEST_DEFINED = 1 
     else 
      echo "TEST not defined" 
    else 
     echo "CATEGORY not defined" 
    endif 



    ifeq ($(CATEGORY_TEST_DEFINED), 1) 
    $(CATEGORY): 
     cd $(PROJ)/$(CATEGORY) 
     make -f test.mk $(TEST) 
    endif 

    ifdef ALL 
    $(ALL): 
     for i in `ls` 
     cd $$(i) 
     make all 
    endif 

सवाल मेरे पास है कर रहे हैं:

  1. चाहे मेकफ़ाइल में नियम चुनिंदा हो (नियमों और लक्ष्यों का चयन करने के लिए ifdef का उपयोग कर)।

  2. गूंज काम नहीं करता है। गूंज उपयोगकर्ता को सही उपयोग के साथ मदद करनी चाहिए।

+0

@ बीटा के बिंदु पर, आपको [एफएक्यू] (http://stackoverflow.com/faq) और विशेष रूप से अनुभाग [मैं यहां प्रश्न कैसे पूछूं?] देखें (http://stackoverflow.com/faq # howtoask)। –

उत्तर

15

समस्या यह है कि echo खोल से संबंधित है; इसे कमांड में खोल में पास कर सकते हैं, लेकिन इसे निष्पादित नहीं कर सकते हैं। का प्रयोग करें info बजाय:

ifdef CATEGORY 
ifdef TEST 
$(CATEGORY): 
    whatever 
else 
$(info TEST not defined) 
else 
$(info CATEGORY not defined) 
endif 
+0

आपके इनपुट के लिए धन्यवाद। यदि मेक शेल कमांड निष्पादित नहीं कर सकता है, तो मैंने मेकफ़ाइल को देखा है (इंडेंटेशन यहां मुश्किल है) उदाहरण के लिए, हैलो: <टैब के साथ अगली पंक्ति> @echo "हैलो वहाँ"। हैलो आउटपुट बनाएं -> हैलो वहाँ – Mike

+0

@ माइक: हाँ, उस मामले में 'echo'' हैलो 'नियम में कमांड में है। जब आप "हैलो बनाते हैं", तो उस कमांड को खोल में भेज दें। यदि आप इसे इस तरह से करना चाहते हैं, तो आपको कुछ लक्ष्य के साथ "परिभाषित नहीं" संदेशों को जोड़ना होगा, जो बेकार लगता है। – Beta

3

ये लाइनें संदिग्ध हैं::

help: 
    echo"Usage: make CATEGORY=<advanced|basic> TEST=<test-case> 
    echo"  make ALL 

आप echo और स्ट्रिंग के बीच एक जगह की जरूरत है, और

ifdef CATEGORY 
$(info CATEGORY defined) 
else 
$(info CATEGORY undefined) 
endif 

आप नियमों सशर्त होना चाहते हैं स्ट्रिंग को समाप्त करने की आवश्यकता है:

help: 
    echo "Usage: make CATEGORY=<advanced|basic> TEST=<test-case>" 
    echo "  make ALL" 

ये लाइनें संदिग्ध हैं:

ifdef CATEGORY 
    ifdef TEST 
     CATEGORY_TEST_DEFINED = 1 
    else 
     echo "TEST not defined" 
else 
    echo "CATEGORY not defined" 
endif 

निश्चित रूप से आप दूसरे else से पहले एक endif की ज़रूरत है? (यहां तक ​​कि अगर यह वाक्य रचना अनिवार्य नहीं है, मैं यह सलाह देते हैं।)

ifdef CATEGORY 
    ifdef TEST 
     CATEGORY_TEST_DEFINED = 1 
    else 
     echo "TEST not defined" 
    endif 
else 
    echo "CATEGORY not defined" 
endif 

साथ ही, make केवल आदेशों जैसे echo जब लक्ष्य (नियम) प्रसंस्करण माना जाता है निष्पादित करता है। यह echo निष्पादित नहीं करेगा; यह केवल ऑब्जेक्ट करेगा कि आप लक्ष्य के लिए कार्रवाई किए बिना कमांड को परिभाषित नहीं कर सकते हैं। जीएनयू मेकफाइल में जो कुछ भी जोड़ता है, उसके बावजूद, मेकफ़ाइल में भाषा एक घोषणात्मक भाषा है और प्रक्रियात्मक भाषा नहीं है।


इस से निपटने का एक और तरीका है मैक्रो लिए डिफ़ॉल्ट मान परिभाषित करने के लिए है:

CATEGORY = advanced 
TEST  = all 

मूलभूत मूल्यों है कि कुछ अर्द्ध उचित कर परिभाषित करें; उपयोगकर्ता को डिफ़ॉल्ट रूप से ओवरराइड करने दें यदि वे चाहते हैं।

${CATEGORY}/${TEST}: ...dependencies... 
    ...actions... 

आप पहली बार नियम के रूप में help छोड़ सकते हैं: आप इस तरह के रूप एक नियम हो सकता है। जहां पहला नियम है मैं कुछ निर्देशिका है:

null: 
    @echo "You must specify a target with this makefile!" 

यह तुम्हारे पास क्या है (सिवाय इसके कि make चलाने से पहले आदेश गूंज नहीं करता है के बराबर है, इसलिए मैं केवल गूंज कमांड लाइन के बजाय संदेश देख सकते हैं और संदेश; यह काम पर @ है)। मेकफ़ाइल से यह भी आता है नियम all है जो अन्यथा आमतौर पर सबसे समझदार पहला (डिफ़ॉल्ट) नियम होता है।