2011-10-05 16 views
75

आप लॉजिकल या मेक ifeq ऑपरेटर का उपयोग कैसे करते हैं?मेकफ़ाइल ifeq तार्किक या

उदाहरण के लिए, मैं (सरलीकृत) है

ifeq ($(GCC_MINOR), 4) 
    CFLAGS += -fno-strict-overflow 
endif 
ifeq ($(GCC_MINOR), 5) 
    CFLAGS += -fno-strict-overflow 
endif 

लेकिन इन पंक्तियों को मजबूत करना चाहते हैं।

(हाँ, हाँ, autotools, कॉन्फ़िगर, आदि आदि, बहुत भारी हाथ के वर्तमान स्थिति के लिए, Makefile यहाँ के भीतर सब कुछ रखना चाहते हैं)

[इस सवाल का तार्किक विपरीत: How to Use of Multiple condition in 'ifeq' statement]

+0

* के संभावित डुप्लिकेट [परिसर की स्थिति Makefile में जाँच] (http://stackoverflow.com/questions/ 5584872/जटिल स्थिति-चेक-इन-makefile) *। –

+0

ऐसा नहीं लगता कि यह एक डुप्ली है, लिंक किया गया प्रश्न 'ifdef' ऑपरेटरों को चेन करने से संबंधित है, यह प्रश्न' ifeq 'ऑपरेटरों को चेन करने से संबंधित है, लेकिन उत्तर निश्चित रूप से अलग हैं। – Pat

+0

के समान [वहाँ के लिए एक तार्किक 'OR' ऑपरेटर है' ifneq'?] (Http://stackoverflow.com/q/8296723/471376) – JamesThomasMoon1979

उत्तर

68

मेलिंग सूची संग्रह पर पाया के रूप में,

एक फिल्टर फ़ंक्शन का उपयोग कर सकते हैं।

उदाहरण के लिए

ifeq ($(GCC_MINOR),$(filter $(GCC_MINOR),4 5)) 

फिल्टर एक्स, एबी एक के उन लोगों के वापस आ जाएगी, बी कि बराबर एक्स हैं

इस का एक भिन्नता

ifneq (,$(filter $(GCC_MINOR),4 5)) 

जहां एक नकारात्मक है एक खाली स्ट्रिंग के खिलाफ तुलना का उपयोग किया जाता है (फ़िल्टर यदि रिक्त स्ट्रिंग वापस कर देगा तो GCC_MINOR डी तर्कों से मेल नहीं खाते हैं)

उन तरीकों का नकारात्मक पक्ष तर्क है कि तर्क एक शब्द होना चाहिए।

+5

देर से नोट: आपके द्वारा ऊपर की गई दो भिन्नताओं में, पहला $ (GCC_MINOR) खाली होने पर सत्य को हल करेगा, जबकि दूसरा नहीं होगा (इस प्रकार दूसरा सामान्य समाधान सामान्य रूप से बोल रहा है)। – John

+1

असल में, यह 'ifneq (, $ (फ़िल्टर 4 5, $ (GCC_MINOR) होना चाहिए)) :) :) – Tuxdude

+2

शायद सादगी के लिए छोड़ना बेहतर है? – Jason

20

आप एक और चर लागू कर सकते हैं। यह दोनों चेकों को मजबूत नहीं करता है, लेकिन यह कम से कम दो बार में शरीर डाल करने के लिए होने टाल:

do_it = 
ifeq ($(GCC_MINOR), 4) 
    do_it = yes 
endif 
ifeq ($(GCC_MINOR), 5) 
    do_it = yes 
endif 
ifdef do_it 
    CFLAGS += -fno-strict-overflow 
endif 
+4

पैमाने पर इस बात का रख-रखाव मेरे लिए बहुत अच्छा नहीं लगता है:/ फिर, एक बार हम पैमाने बात करना शुरू, मुझे लगता है हम autotools – Pat

+0

बात कर रहे हैं @Pat: जहाँ मैं Makefile में एक ही स्थान पर काम अलग कर सकते हैं, संभवतः ifeq का उपयोग कर/किसी और अधिक मूल्यों के खिलाफ की तुलना मैं नहीं बल्कि इस दृष्टिकोण पसंद करते हैं ifeq/else, फ़िल्टर फ़ंक्शन का उपयोग करने के बजाय जो लाइनों को पढ़ने के लिए बहुत कठिन बना सकता है। – jcarballo

12

मैं वहाँ एक संक्षिप्त, समझदार है कि ऐसा करने के लिए रास्ता है नहीं लगता है, लेकिन वहाँ वर्बोज़, समझदार तरीके (जैसे हैं फू बाह के) और संक्षिप्त, रोग तरीके, इस तरह के

ifneq (,$(findstring $(GCC_MINOR),4-5)) 
    CFLAGS += -fno-strict-overflow 
endif 

स्ट्रिंग 4-5) के अंदर प्रकट होता है (जो आदेश प्रदान की है कि स्ट्रिंग $ (GCC_MINOR निष्पादित करेंगे) के रूप में के रूप में।

+2

बेहतर या बदतर (शायद बदतर) के लिए, बस गंदे हैक की तरह मैं देख रहा था; धन्यवाद – Pat

+1

मुझे नहीं लगता कि यह पैथोलॉजिकल है, इस तथ्य के अलावा कि * मेकफ़ाइल में * सब कुछ * पैथोलॉजिकल है। यह वास्तव में काफी सुरुचिपूर्ण है। मैंने इसे पूरा करने के लिए चार या पांच अलग-अलग तरीकों को पढ़ा है, और आपका समझने के लिए सबसे आसान है। –

0
ifeq ($(GCC_MINOR), 4) 
    CFLAGS += -fno-strict-overflow 
endif 
ifeq ($(GCC_MINOR), 5) 
    CFLAGS += -fno-strict-overflow 
endif 

एक और आप इस मामले में उपयोग करने पर विचार कर सकते हैं:

GCC42_OR_LATER = $(shell $(CXX) -v 2>&1 | $(EGREP) -c "^gcc version (4.[2-9]|[5-9])") 

# -Wstrict-overflow: http://www.airs.com/blog/archives/120 
ifeq ($(GCC42_OR_LATER),1) 
    CFLAGS += -Wstrict-overflow 
endif 

मैं वास्तव में मेरी कोड में एक ही उपयोग करें, क्योंकि मैं एक अलग config या Configure बनाए रखने के लिए नहीं करना चाहती।

लेकिन आपको पोर्टेबल, गैर-एनीमिक make का उपयोग करना है, जैसे जीएनयू मेक (gmake), और पॉज़िक्स के make नहीं।

और यह तार्किक AND और OR के मुद्दे को संबोधित नहीं करता है।

3

यहाँ और अधिक लचीला संस्करण: यह बाहरी खोल का उपयोग करता है, लेकिन मनमाने ढंग से स्थितियों के लिए जाँच करने के लिए अनुमति देता है:

ifeq ($(shell test ".$(GCC_MINOR)" = .4 -o \ 
        ".$(GCC_MINOR)" = .5 -o \ 
        ".$(TODAY)"  = .Friday && printf "true"), true) 
    CFLAGS += -fno-strict-overflow 
endif