2012-10-19 22 views
8

तक सीमित एक दायरे वाले वेरिएबल्स मैं अपने वर्तमान प्रोजेक्ट में एक गैर-रिकर्सिव मेक बिल्ड सिस्टम को लागू करने का प्रयास करता हूं। मैं किस प्रकार संघर्ष करता हूं वैरिएबल स्कॉप्स है। लक्ष्य विशिष्ट चर मेरी आवश्यकताओं को पूरा नहीं करते हैं क्योंकि अक्सर चर लक्ष्य को परिभाषित करते हैं और पूर्वापेक्षाएँ नहीं। क्या मैं जरूरत है:जीएनयू मेक। एक मेकफ़ाइल

Makefile1:

SOMEVAR := original_value 
include Makefile2 
$(warning $(SOMEVAR)) 

Makefile2:

#some magic here to do what I want and make me happy 
SOMEVAR := included_value 
#and maybe here 

और उत्पादन मैं चाहता है 'original_value'।

क्या इसे वास्तविक बनाने के लिए कोई रणनीतियां हैं?

संपादित करें: =

+0

वह समाधान बहुत अच्छा लगता है। इसके साथ गलत क्या है? और 'सोमवार' क्या है, इसका उपयोग किस लिए किया जाता है? – Beta

+1

जो चीज़ मुझे इस समाधान में पसंद नहीं है वह यह है कि यह बहुत कमजोर है। यदि कुछ गरीब व्यक्ति जो मेरी जगह ले लेंगे, उन्हें विचार और स्थान कहीं और शामिल नहीं किया जाएगा, तो उन्हें –

+1

बहुत सारी आश्चर्य मिलेगी यदि मेकफ़ाइल 2 को एक से अधिक बार शामिल किया गया है, और यह एक नुस्खा को परिभाषित करता है जो '$ (SOMEVAR)' , तो यह बहुत ही टूट जाएगा --- व्यंजनों के अंदर चर का मूल्यांकन किया जाता है जब व्यंजनों को निष्पादित किया जाता है, जिसका अर्थ है कि वे सभी '$ (SOMEVAR)' अंतिम मूल्य देखेंगे, न कि नुस्खा परिभाषित होने पर उसके मूल्य का मूल्य। –

उत्तर

5

एक रणनीति पुराने ढंग का समाधान है: एकमात्र समाधान मैं पल के लिए आया था अपने आप को मजबूर और व्यवस्थित करने के लिए प्रत्येक विशेष Makefile के अंत में सभी inlcudes जगह है और तत्काल चर काम का उपयोग करने के लिए है वैरिएबल नाम टकरावों के लिए जब आपके पास वैश्विक चर है: अपने परिवर्तनीय नामों के लिए एक उपसर्ग को गरीब-व्यक्ति के नामस्थानों में जोड़ें।

Makefile1:

Makefile1_SOMEVAR := original_value 
include Makefile2 
$(warning $(Makefile1_SOMEVAR)) 

Makefile2:

# no magic needed 
Makefile2_SOMEVAR := included_value 
# rest of Makefile2 uses $(Makefile2_SOMEVAR) of course 

अरे Presto, के साथ इस तरह एक सम्मेलन में यह करता है, तो प्रत्येक makefile अपनी ही स्थानीय चर में कम से कम, अपने स्वयं के वेरिएबल नहीं है (या, के रूप में है एक नामस्थान जो किसी भी अन्य मेकफ़ाइल के साथ टकरा नहीं करता है)।

संबंधित मुद्दे