2013-07-12 4 views
6

मैं आर्किटेक्चर की जांच करने के लिए मेक स्टेटमेंट करने का प्रयास कर रहा हूं।मेकफ़ाइल सशर्त त्रुटि

test: 
     ifeq ("$(shell arch)", "armv7l") 
       echo "This is an arm system" 
     else 
       echo "This is not an arm system." 
     endif 

मैं एक मुद्दा है:: मैं काम बहुत इसे प्राप्त करने के करीब करने के लिए कर रहा हूँ, हालांकि यह ifeq ("i386", "armv7l") को हल करने के लिए जो झूठी होना चाहिए लगता है, मैं निम्नलिखित त्रुटि मिलती है:

$ make 
ifeq ("i386", "armv7l") 
/bin/sh: -c: line 0: syntax error near unexpected token `"i386",' 
/bin/sh: -c: line 0: `ifeq ("i386", "armv7l")' 
make: *** [test] Error 2 

तो यह, एक दूसरे की तुलना में दो तारों का समाधान कर रहा है, लेकिन एक वाक्यविन्यास त्रुटि है। यहाँ क्या गलत है?

उत्तर

9

आप नुस्खा के अंदर ifeq जैसे वक्तव्य बनाने का उपयोग नहीं कर सकते हैं। व्यंजनों (टीएबी से शुरू होने वाली रेखाएं) खोल में पास की जाती हैं। खोल ifeq समझ में नहीं आता है; यह एक मेक निर्माण है।

आपको नुस्खा के अंदर खोल-बयान का उपयोग करना होगा। और, आपको नुस्खा में $(shell ...) का उपयोग करने की आवश्यकता नहीं है, क्योंकि आप पहले से ही खोल में हैं।

test: 
     if [ `arch` = armv7l ]; then \ 
      echo "This is an arm system"; \ 
     else \ 
      echo "This is not an arm system."; \ 
     fi 

यह संभावना नहीं सबसे अच्छा तरीका यह संभाल करने के लिए है, लेकिन जब से तुम क्या तुम सच में इस के साथ क्या करने की कोशिश कर रहे हैं पर कोई जानकारी नहीं प्रदान की थी यह सब हम कह सकते हैं है।

+0

यह कितना साफ हो सकता है? मैं बस वास्तुकला की जांच करने और सशर्त रूप से बयान करने की कोशिश कर रहा हूं। लेकिन उत्तर के लिए धन्यवाद। स्वीकार किए जाते हैं। –

+0

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

+0

वैसे = '= '' = ' –

11

रूप MadScientist कहा, make खोल करने के लिए ifeq लाइनों से गुजर रहा है, लेकिन अगर आप इसे ठीक तरह से लिखते हैं, आप निश्चित रूप से एक नुस्खा के भीतर आदेशों के साथ ifeq तरह निर्माणों बनाने के मिश्रण कर सकते हैं। तुम बस को समझने के लिए make कैसे पार्स करता है एक Makefile की जरूरत है:

एक लाइन एक TAB के साथ शुरू होता है, यह जहां लाइन फ़ाइल के भीतर है की परवाह किए बिना खोल के लिए एक कमांड माना जाता है।

यदि यह TAB से शुरू नहीं होता है, तो make इसे अपनी भाषा के हिस्से के रूप में व्याख्या करता है।

तो, अपनी फ़ाइल को ठीक करने के लिए, बस एक TAB साथ make सशर्त, शुरू करने से बचने:

test: 
ifeq ("$(shell arch)", "armv7l") 
     echo "This is an arm system" 
else 
     echo "This is not an arm system." 
endif 
+1

दोनों उत्तर अच्छे हैं। यह बताने के लिए धन्यवाद कि यह क्यों काम नहीं करेगा। मैं निश्चित रूप से इसे ध्यान में रखूंगा! –