2009-08-27 7 views
13

में पूर्वापेक्षाएँ के रूप में लक्ष्य-विशिष्ट वैरिएबल मैं एक जीएनयू बनाने की कोशिश कर रहा हूं मेकफ़ाइल बनाता है जिसमें समान लक्ष्यों का भार होता है, जहां बिल्ड कमांड उनके बीच थोड़ा भिन्न होता है। मैं इन भिन्नताओं का प्रतिनिधित्व करने के लिए target-specific variables का उपयोग करने का प्रयास कर रहा हूं। इनमें से कुछ परिवर्तनीय मान उन फ़ाइलों को संदर्भित करते हैं जिन्हें मैं पूर्वापेक्षाएँ के रूप में उपयोग करना चाहता हूं। उदाहरण के लिए:मेकफ़ाइल

target_1:special_filename=target1_prereq 
target_2:special_filename=target2_prereq 

target_1 target_2: common_filename $(special_filename) 
    do_something common_filename --a-weird-option=$(special_filename) 

जब मैं कॉल 'target_1 बनाने', मैं इसे target1_prereq बनाने के लिए अगर यह मौजूद नहीं है चाहता हूँ। फिलहाल, यह लक्ष्य 1_prereq को एक शर्त के रूप में उपयोग नहीं करता प्रतीत होता है, भले ही बिल्ड कमांड (do_something) को सही पैरामीटर के साथ बुलाया जाता है।

मैं जीएनयू मेक 3.80 का उपयोग कर रहा हूं।


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

target_1:special_filename_base=target1_prereq 
target_2:special_filename_base=target2_prereq 

some_filename_a = $(special_filename_base).exta 
some_filename_b = $(special_filename_base).extb 

target_1 target_2: common_filename $(special_filename_b) $(special_filename_a) 
    do_something common_filename --a-weird-option=$(special_filename_a) --second=$(special_filename_b) 

उत्तर

3

एक लक्ष्य-विशिष्ट चर केवल लक्ष्य के आदेशों (या अन्य लक्ष्य-विशिष्ट असाइनमेंट में) में परिभाषित किया गया है; इसे लक्ष्य के prereqs में से एक के रूप में इस्तेमाल नहीं किया जा सकता है। मैं वहाँ क्या आप कर में चाहते हैं के लिए एक साफ रास्ता है नहीं लगता है, लेकिन इस तरह निम्नलिखित के रूप में कई kludgey दृष्टिकोण, कर रहे हैं:

 
EXTENSIONS = .exta .extb 
target_1: $(addprefix target1_prereq,$(EXTENSIONS)) 
target_2: $(addprefix target2_prereq,$(EXTENSIONS)) 

target_1 target_2: common_filename 
    do_something common_filename --a-weird-option=$(filter %.exta,$^) --second=$(filter %.extb,$^) 
+4

इस धागे को किसी और के लाभ के लिए पुनरुत्थान करना जो इसे पार करता है। एक [अधिक सुरुचिपूर्ण समाधान] (http://stackoverflow.com/questions/9311743/make-using- लक्ष्य- विशिष्ट- variables-in-prerequisites) माध्यमिक विस्तार का उपयोग करता है। – Seth

+0

@ सेठ, मैं सहमत हूं: 'target_1 target_2: common_filename $$ (special_filename_base) .exta $$ (special_filename_base) .extb ...' – Beta

2

एक सरल समाधान के रूप में:

 
target_1:special_filename=target1_prereq 
target_1:target1_prereq 
target_2:special_filename=target2_prereq 
target_2:target2_prereq 

target_1 target_2: common_filename $(special_filename) 
    do_something common_filename --a-weird-option=$(special_filename) 

कुछ अतिरेक नहीं है, लेकिन यह स्थानीय है, तो यह बहुत बुरा नहीं है।

+0

मुझे लगता है कि मैंने पोस्ट किए गए विशिष्ट मामले को हल किया है, लेकिन मैं एक और सामान्य समाधान की उम्मीद कर रहा था। मैं एक और जटिल उदाहरण के साथ संपादित करूंगा। –

2

मैंने पाया एक की नहीं बल्कि साफ रास्ता पक्ष कदम इस सीमा । यह कुछ इस तरह जाना चाहते हैं:

target_1:export special_filename_base=target1_prereq 
target_2:export special_filename_base=target2_prereq 

some_filename_a = $(special_filename_base).exta 
some_filename_b = $(special_filename_base).extb 

target_1 target_2: 
    $(MAKE) -f $(firstword $(MAKEFILE_LIST)) target-proxy 

target-proxy: common_filename $(special_filename_b) $(special_filename_a) 
    do_something common_filename --a-weird-option=$(special_filename_a) --second=$(special_filename_b) 

दो महत्वपूर्ण बाते:

  1. export लक्ष्य चर, ताकि वे सुलभ Makefile जब हम फिर से चलाने के लिए होगा।
  2. एक प्रॉक्सी लक्ष्य बनाएं जिसमें target_1 target_2 की सभी मूल पूर्वापेक्षाएँ हैं और target_1 target_2 में इस प्रॉक्सी लक्ष्य के साथ मेकफ़ाइल को फिर से आमंत्रित करें। लक्ष्य के बाद से विशिष्ट चरों तब तक मान होगा (हम उस समय तक नुस्खा में कर रहे हैं) और वे थे export एड, वे उपलब्ध target-proxy में हो जाएगा - देखा :)

का नकारात्मक पहलू यह दृष्टिकोण यह है कि हम एक और make प्रक्रिया बना रहे हैं - यदि यह सिर्फ एक और है तो यह शायद ठीक है, लेकिन वाईएमएमवी इतना सावधान रहें।

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

  • कोई संबंधित समस्या नहीं^_^