Makefile वैरिएबल से आइटम निकालें?


84

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

VAR := Something SomethingElse
VAR += SomeOtherThing

(...)

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

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

जवाबों:


114

आप इस्तेमाल कर सकते हैं filter-outपाठ समारोह आप जीएनयू मेक उपयोग कर रहे हैं।

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

और आप सुनिश्चित हैं कि मुझे उपयोग करना है =और नहीं :=?
बज्रके फ्रंड-हेन्सन

1
क्या मेरे द्वारा दिए गए उदाहरण में दोनों सही हैं? अगर मैं उपयोग करता =हूं तो मुझे एक मेर्फाइल त्रुटि मिलती है, जो कहती है कि VAR के बारे में कुछ अंततः एक अनंत पुनरावृत्ति में ही संदर्भित है। ( VAR = $(filter-out SomethingElse,$(VAR)))
बज्के फ्रायंड-हैन्सन

4
बस संक्षेप में, यह कारण उपयोग पर निर्भर करता है। लेकिन मेरे उदाहरण में सही उत्तर होगा: VAR := $(filter-out SomethingElse,$(VAR)) (साथ :=और नहीं =)। धन्यवाद। :)
बज्रके फ्रेंड-हैन्सन

13
नोट: इसके अलावा कई मदों पर इस्तेमाल किया जा सकता है। उदाहरण के लिए: VAR := $(filter-out A B C,$(VAR))
चेकसम

1
किसी और के साथ आने के लिए ध्यान दें। filter-outकेवल अंतरिक्ष अलग शब्दों पर काम करता है। यदि आपको एक स्ट्रिंग से कुछ निकालने की आवश्यकता है जो शब्द अलग नहीं है, तो आप substइसके बजाय उपयोग कर सकते हैं filter-out। Ie: $(subst -world,,hello-world)परिणाम देना होगा hello
याकूब

7

सही उत्तर के ऊपर:

VAR = bla1 bla2 bla3 bla4 bla5

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

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

आउटपुट:
VAR है: bla1 bla2 bla4 bla5

ध्यान दें कि यह सब "पुनरावृत्ति" को तोड़ता है जब फ़िल्टर-आउट निष्पादित होता है, लेकिन यह आपके मामले में मायने नहीं रखता है।


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

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

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