2011-09-13 8 views
59

मेरे पास एक मेकफ़ाइल है, जिसमें कई अन्य मेकफ़ाइल शामिल हैं, जो बदले में इस तरह के एक चर में जोड़ते हैं:मेकफ़ाइल चर से आइटम निकालें?

VAR := Something SomethingElse 
VAR += SomeOtherThing 

(...) 

अब मैं VAR चर से SomethingElse को हटाना चाहता हूं। ऐसा करने के लिए (...) के स्थान पर मैं क्या रखूं?

मैं जीएनयू मेक का उपयोग कर रहा हूं, और एक जीएनयू विशिष्ट समाधान बनाना ठीक होगा।

उत्तर

83

यदि आप जीएनयू मेक का उपयोग कर रहे हैं तो आप filter-out text function का उपयोग कर सकते हैं।

OTHERVAR := $(filter-out SomethingElse,$(VAR)) 
+0

और आप यकीन है कि मैं '=' उपयोग करने के लिए है और न 'हैं: ='? –

+0

आप जो चाहते हैं उस पर निर्भर करता है। दोनों संभावित रूप से सही हैं। – Mat

+1

क्या मैंने दोनों उदाहरणों में सही किया है? यदि मैं '=' का उपयोग करता हूं तो मुझे एक मेरफ़ाइल त्रुटि मिलती है जो VAR के बारे में कुछ कहती है, अंततः एक अनंत रिकर्सन में खुद को संदर्भित करती है। ('VAR = $ (फ़िल्टर आउट कुछ, $ (VAR))' –

4

ऊपर सही जवाब के शीर्ष पर:

VAR = bla1 bla2 bla3 bla4 bla5 

TMPVAR := $(VAR) 
VAR = $(filter-out bla3, $(TMPVAR)) 

all: 
    @echo "VAR is: $(VAR)" 

आउटपुट:
वीएआर है: bla1 bla2 bla4 bla5

ध्यान दें कि यह टूट जाता है सभी "recursivity" फिल्टर बाहर है जब निष्पादित, लेकिन इससे आपके मामले में कोई फर्क नहीं पड़ता।

+0

क्या यह व्यवहार की उम्मीद नहीं है? एफआईआर आप सामान्य रूप से VAR को परिभाषित करते हैं, फिर आप तुरंत इस बिंदु पर VAR का विस्तार करने के लिए टीएमपीवीएआर सेट करते हैं। फिर आप VAR को सामान्य रूप से टीएमपीवीएआर के फ़िल्टर किए गए संस्करण में संदर्भित करने के लिए रीसेट करते हैं। और सभी लक्ष्य में आपका उपयोग VAR और इस प्रकार इसे विस्तारित करें। मैं नहीं देखता कि यह कैसे पुनरावृत्ति को तोड़ता है या किसी भी तरह से समस्याग्रस्त व्यवहार है? –

+0

मैं जो भी मतलब था उससे अस्पष्ट हो सकता था। कल्पना कीजिए कि 'बीएलए 1 = ब्लै 1', फिर ऊपर VAR परिभाषा के बजाय 'VAR = $ (BLA1) bla2 bla3 bla4 bla5' है। फ़िल्टर-आउट के बाद 'BLA1 + = bla1111' निष्पादित करने से VAR के मान पर कोई प्रभाव नहीं पड़ेगा, क्योंकि इससे $ (BLA1) के मान का संदर्भ खो जाएगा। –

0

जैसा कि मेरे पास भी एक समान स्थिति है, मैं एक नया उत्तर जोड़ना चाहता हूं। मेरे मामले में वहाँ भी चर स्ट्रिंग में अल्पविराम के थे और, और अधिक, मैं अल्पविराम और अंतिम शब्द को दूर करना चाहता था:

VAR = "bla1, bla2" 

इस मामले में को फ़िल्टर (पिछले जवाब में भी नहीं काम नहीं कर रहा है, जब कोई उद्धरण हैं)

मेरे समाधान subst उपयोग करने के लिए है:

VAR = "bla1, bla2" 

TTT = , bla2 
TMPVAR := $(VAR) 
SUBST = $(subst $(TTT),, $(TMPVAR)) 
FILT = $(filter-out $(TTT), $(TMPVAR)) 

subst: 
    @echo "subst : $(SUBST)" 

filter: 
    @echo "filter-out : $(FILT)"