2012-03-07 15 views
9

पर पर्यावरण चर निर्यात करना मैं मेकफ़ाइल के भीतर एक खोल कमांड का तत्काल विस्तार करना चाहता हूं, लेकिन मैं चाहता हूं कि शेल कमांड को मेकफ़ाइल के भीतर पर्यावरण चरों तक पहुंच प्राप्त हो। अगर मैं $ (खोल ...) का उपयोग करता हूं, तो यह तुरंत फैलता है, लेकिन चरों तक कोई पहुंच नहीं है। यदि मैं बैकक्वॉट्स का उपयोग करता हूं, तो विस्तार तत्काल नहीं है, और यह मेकफ़ाइल में बाद में मेरे लिए समस्याएं पैदा करता है। मैं सोच रहा हूं कि बैकक्वॉट्स को तुरंत विस्तारित करने का कोई तरीका है या वर्तमान वातावरण को $ (खोल) कमांड में पास करने के लिए कोई तरीका है।मेकफ़ाइल खोल

उदाहरण के लिए, निम्नलिखित makefile:

SOME_VAR := some_val 
export SOME_VAR 

VAR1 := `echo $$SOME_VAR` 
export VAR1 
VAR2 := `echo $$VAR1` 

all: 
     @echo VAR1=$(VAR1) 
     @echo VAR2=$(VAR2) 

विल उत्पादन:

~/tmp/t2> make 
VAR1=some_val 
VAR2=`echo $SOME_VAR` 

मैं इसे कहाँ मुद्रित करने के लिए "var2 = some_val" चाहते हैं। वास्तविक उदाहरण थोड़ा अधिक जटिल है (पर्यावरण चर को मूल मेकफ़ाइल से विरासत में मिला है, और मैं चर को संपादित करने के लिए एक पर्ल स्क्रिप्ट का उपयोग करने की कोशिश कर रहा हूं), लेकिन सिद्धांत समान है।

किसी भी मदद की सराहना की जाती है।

उत्तर

1

मैं टिप्पणियों में से कुछ में उल्लेख किया है, मेरे वास्तविक लक्ष्य स्क्रिप्ट सेटिंग्स वस्तु के साथ संकलित किया जा रहा था के आधार पर फ़ाइल नाम उत्पन्न करने के लिए किया गया था। इसके बाद मुझे उत्पन्न सभी फाइलनामों की एक विशेष स्वरूपित सूची उत्पन्न करने के लिए एक और स्क्रिप्ट चाहिए (लक्ष्य एक एम्बेडेड सिस्टम है जिसमें उस पर एक जेआईटी कंपाइलर नहीं है)। किसी भी समय, तीस से अधिक सेटिंग्स हैं जो बाइनरी को संभावित रूप से प्रभावित कर सकती हैं, और इसका भविष्य में एक से अधिक मॉड्यूल पर उपयोग किया जा सकता है, इसलिए मुझे कुछ स्केलेबल चाहिए।

मेरा समाधान निम्नानुसार है।

VAR1 := CONFIG_X1=$(CONFIG_X1) CONFIG_X2=$(CONFIG_X2) CONFIG_X33=$(CONFIG_X33) 

और script2:

-include $(SOME_MK_FILE) 

$(SOME_MK_FILE) : .phony 
    script.pl $(SETTINGS_OF_INTEREST_LIST) > $(SOME_MK_FILE) 

someFilename := $(shell script2.pl $(VAR1)) 

script.pl एक स्ट्रिंग है जो कुछ ऐसा दिखाई आउटपुट: में चर गुजर के बजाय, मैं अपनी स्क्रिप्ट उत्पादन करने के लिए एक makefile-parsable स्ट्रिंग सेटिंग के आधार पर संशोधित outputs एक फ़ाइल नाम है कि 'someFilename.X1_y.X2_n.elf'

और तरह दिखता है तो, पर बाद में, एक और नियम में, मेरे पास है:

someobj: somedep 
    script3.pl $(someFilename) >> builtfiles.txt 

जो ठीक से buildfiles.txt बनाता है (जो बदले में एक और स्क्रिप्ट के लिए इनपुट है ...)। अंत में यह इस तथ्य के लिए एक समाधान है कि अपने वातावरण को $ (खोल) तक नहीं पारित कर सकता है। यह अत्यधिक सुंदर नहीं है लेकिन यह काम करता है।

जॉन

4

इसके साथ क्या गलत है?

VAR1 := $(shell echo $(SOME_VAR)) 
VAR2 := $(shell echo $(VAR1)) 
+0

हममम ... हाँ, मेरे उदाहरण त्रुटिपूर्ण था। ..उपर्युक्त उदाहरण में, VAR1 को मेकफ़ाइल के भीतर विस्तारित किया गया है, लेकिन मुझे जो चाहिए वह VAR1 को शैल स्क्रिप्ट के भीतर विस्तारित किया जाना है। यही है, मैं एक पर्ल स्क्रिप्ट को बुला रहा हूं जिसे ENV {'VAR1'} तक पहुंचने की आवश्यकता है। अगर $ (खोल ...) से बुलाया जाता है तो स्क्रिप्ट को पता नहीं होगा कि वीएआर 1 क्या है। मैं अपने प्रश्न को एक बेहतर उदाहरण के साथ संपादित करूंगा। धन्यवाद। – John

+0

@ जॉन, मैं वास्तव में समझ नहीं पा रहा हूं कि आप यहां क्या करने की कोशिश कर रहे हैं। मैं कुछ अनुमान लगा सकता हूं, लेकिन मुझे लगता है कि अगर आप अपना प्रश्न संपादित करते हैं तो यह तेज़ होगा। – Beta

+0

मैं वास्तव में क्या करने की कोशिश कर रहा हूं: मेरे पास एक मेकफ़ाइल है जिसे ऑब्जेक्ट फ़ाइल बनाने और उसे कॉन्फ़िगरेशन सेटिंग्स के अनुसार नामित किया जाना चाहिए। मेरे पास एक पर्ल स्क्रिप्ट है जो कॉन्फ़िगरेशन सेटिंग्स को किसी नाम में अनुवाद करती है। इसे काम करने के लिए, पर्ल स्क्रिप्ट को कॉन्फ़िगरेशन सेटिंग्स तक पहुंच प्राप्त करनी होगी (इसके लिए बैकक्वॉट का उपयोग करना होगा)। यह स्वयं ही ठीक होगा, लेकिन फिर नाम किसी अन्य पर्ल स्क्रिप्ट में उपयोग किया जाना चाहिए। चूंकि नाम दूसरी स्क्रिप्ट चलाने के समय तक विस्तारित नहीं होता है, इसलिए यह एक त्रुटि का कारण बनता है। मैं एक कामकाज की तलाश में हूँ। – John

5

क्या आप यह चाहते हैं?

VAR2 := $(shell VAR1="$(VAR1)" script_that_uses_var1)

+0

बिल्कुल नहीं, नहीं। मैं जो चाहता हूं वह कुछ बाइनरी बनाना है, और वर्तमान कॉन्फ़िगरेशन के अनुसार उन्हें नाम दें। जबकि मैं स्पष्ट रूप से अपनी इच्छित सेटिंग्स को निर्यात कर सकता हूं, यह समाधान बहुत स्केलेबल नहीं है। तो, मुझे जो करना है वह एक स्क्रिप्ट चलाएं जिसमें सभी मेकफ़ाइल सेटिंग्स तक पहुंच हो। फिर यह एक फ़ाइल नाम आउटपुट करने में सक्षम हो जाएगा। फ़ाइल नाम जिसे बाद में दूसरी स्क्रिप्ट में पारित करने की आवश्यकता होगी, इसलिए फ़ाइल नाम को बाद में जल्द से जल्द हल करना होगा। – John

+1

यह ओपी की मदद नहीं कर सकता है, लेकिन यह वही था जो मुझे इस प्रश्न के लिए खोजना था। चीयर्स! –