2012-05-03 11 views
5

मैनुअल में:मेकफ़ाइल में कैसे eval फ़ंक्शन का उपयोग किया जा सकता है?

eval समारोह बहुत ही खास है: यह आप नए makefile निर्माणों कि स्थिर नहीं कर रहे हैं परिभाषित करने के लिए अनुमति देता है; जो का परिणाम अन्य चर और कार्यों का मूल्यांकन कर रहे हैं। Eval फ़ंक्शन का तर्क विस्तारित किया गया है, उसके बाद उस विस्तार के परिणाम मेकफ़ाइल सिंटैक्स के रूप में पार्स किए गए हैं।

यह जानना महत्वपूर्ण है कि eval तर्क दो बार विस्तारित किया गया है; पहले eval फ़ंक्शन द्वारा, तो उस विस्तार के परिणाम फिर से विस्तारित होते हैं जब उन्हें मेकफ़ाइल सिंटैक्स के रूप में पार्स किया जाता है। इसका मतलब है कि को eval का उपयोग करते हुए "$" वर्णों से बचने के अतिरिक्त स्तर प्रदान करने की आवश्यकता हो सकती है।

"विस्तारित दो बार" मुझे भ्रमित करता है।

define func 
    tmp = $(OBJPATH)/$(strip $1) 
    objs += $$(tmp) 
    $$(tmp) : $2 
     gcc $$^ -o [email protected] 
endef 

all : foo 

$(eval $(call func, foo, 1.c))  

कैसे eval समारोह विस्तार किया जाएगा:

उदाहरण के लिए

, मैं एक makefile बनाने?

+0

"eval फ़ंक्शन का विस्तार कैसे किया जाएगा?" या तुमने कोशिश की? – Beta

उत्तर

15

इसे समझने के लिए सबसे आसान तरीका की जानकारी के साथ eval को बदलने के लिए है:

$(info $(call func, foo, 1.c)) 

यह पहला विस्तार का परिणाम आउटपुट के रूप में प्रदर्शित करेगा, तो आप देख सकते हैं बनाते हैं वास्तव में पार्स करने दिया जाएगा। आप OBJPATH चर के लिए मान प्रदान नहीं किया है, लेकिन उदाहरण तो अपने मामले पहले विस्तार में (कॉल समारोह के) में परिणाम के लिए अगर यह obj था:

tmp = obj/foo 
objs += $(tmp) 
$(tmp) : 1.c 
    gcc $^ -o [email protected] 

फिर मेकअप पार्सर इस का मूल्यांकन करेंगे, और प्रक्रिया में यह फिर से विस्तारित होगा, इसलिए $(tmp) जैसी चीजें विस्तारित की गई हैं।

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

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