Makefile ifeq तार्किक या


92

आप एक तार्किक या मेक के ifeqऑपरेटर का उपयोग कैसे करते हैं ?

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

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

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

(हाँ, हाँ, ऑटोटूलस, कॉन्फ़िगर, आदि आदि; वर्तमान स्थिति के लिए बहुत भारी-भरकम, यहाँ मेकफाइल के भीतर सब कुछ रखना चाहेंगे)

[इस सवाल के तार्किक विपरीत: 'ifeq' स्टेटमेंट में एकाधिक स्थिति का उपयोग कैसे करें ]



1
ऐसा मत सोचो कि यह एक धोखा है, जुड़ा हुआ सवाल चेनिंग ifdefऑपरेटरों से संबंधित है, यह सवाल चेनिंग ifeqऑपरेटरों से संबंधित है , समान है, लेकिन उत्तर निश्चित रूप से अलग हैं।
पैट

जवाबों:


103

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

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

उदाहरण के लिए

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

फ़िल्टर X, AB उन A, B को लौटाएगा जो समान X हैं।

इसका एक रूपांतर है

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

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

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


7
एक देर से नोट: आपके ऊपर जो दो भिन्नताएँ हैं, उनमें से पहला सत्य को हल कर देगा यदि $ (GCC_MINOR) रिक्त है, जबकि दूसरा नहीं होगा (इस प्रकार दूसरा बेहतर समाधान है उदारतापूर्वक बोलना)।
जॉन

1
वास्तव में, यह होना चाहिए ifneq (,$(filter 4 5,$(GCC_MINOR))):)
Tuxdude

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

एक और नोट: यह सामान्य या कथन के रूप में काम नहीं करता है । हमारे पास कुछ है जहां हम जांच करना चाहते हैं if(flagA == TRUE || flagB == true), लेकिन अगर आप करते हैं $(filter true, $(flagA) $(flagB)और दोनों सच हैं, तो आपको मिलता हैifeq(true, true true)
चार्ली सु

27

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

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

7
पैमाने पर इस की स्थिरता मेरे लिए बहुत अच्छी नहीं लगती: / फिर फिर, एक बार जब हम पैमाने पर बात करना शुरू करते हैं, तो मुझे लगता है कि हम ऑटोटूलस बात कर रहे हैं
पैट

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

15

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

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

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


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

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

8

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

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

1
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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.