2009-06-01 9 views
6

मैं दो बिल्ड सिस्टम को एक साथ चिपकाने की कोशिश कर रहा हूं। दोनों रिकर्सिव हैं (मेकफ़ाइल उपयोग में नियम परियोजना के घटकों को बनाने के लिए अन्य मेकफ़ाइल कॉल करने के लिए बनाते हैं)।मैं रिकर्सिव बिल्ड में कमांड लाइन वैरिएबल असाइनमेंट को कैसे अनदेखा कर सकता हूं?

मैं उन्हें 'ए' और 'बी' कहूंगा जहां 'ए' एप्लिकेशन बनाता है और 'बी' 'ए' द्वारा उपयोग की जाने वाली लाइब्रेरी बनाता है।

ए कॉल में शीर्ष स्तर मेकफ़ाइल 'TARGET = जो भी' बनाता है जिसका अर्थ है कि बिल्ड के सभी पुनरावर्ती-बुलाए गए बिट्स को केवल पढ़ने-योग्य चर के रूप में TARGET का मान प्राप्त होता है, जिसमें बी से बिल्ड सिस्टम भी शामिल है, जो कि है रिकर्सिव बिल्ड के हिस्से के रूप में बुलाया जाता है।

मैं नहीं चाहता कि यह 'बी' (जो एक अलग परियोजना से आती है) के लिए बिल्ड सिस्टम में हो, क्योंकि मेकफ़ाइल अपने उद्देश्यों के लिए टैरगेट का उपयोग करते हैं और निर्माण विफल रहता है क्योंकि TARGET का गलत मूल्य है और है सिफ़ पढ़िये।

मैं केवल इसके लिए दो समाधान देख सकता हूं, जिनमें से कोई भी पैलेट योग्य नहीं है;

1) ए में मेकफ़ाइल में किसी और चीज़ के लिए टैरगेट का नाम बदलें जो इसे सेट करता है और इसे बनाने वाले ए में मेकफ़ाइल में, निर्माण प्रणाली के निचले स्तर के साथ संघर्ष से बचने के लिए।

2) बी में मेकफ़ाइल में हर जगह 'ओवरराइड' निर्देश का उपयोग करें जहां TARGET चर सेट किया गया है, इसकी केवल पढ़ने की स्थिति को ओवरराइड करने के लिए।

किसी को भी कोई बेहतर विचार मिला है? - आदर्श रूप में, मैं कुछ भी नहीं , बी के एक से निर्माण प्रणाली द्वारा विरासत में मिला जा करने के लिए उन विकल्पों को छोड़कर मैं स्पष्ट रूप से ए

संयोग से, मैं जीएनयू v3.80 बनाने का उपयोग कर रहा से बी निर्माण प्रणाली को पारित करना चाहते हैं।

+0

यदि आप बी के मेकफ़ाइल में टैरगेट सेट नहीं करना चाहते हैं, तो आप टीएआरजीईटी = ए के मेकफ़ाइल में जो भी पास कर रहे हैं? – JesperE

+0

ए का शीर्ष-स्तरीय मेकफ़ाइल पास करता है TARGET = ए में किसी दूसरे-स्तरीय मेकफ़ाइल के लिए जो भी (जिसे इसकी आवश्यकता होती है) और ए में दूसरी-स्तरीय मेकफ़ाइल, फिर बी के मेकफ़ाइल को कॉल करता है, जो TARGET को पर्यावरण के पढ़ने से केवल पढ़ने योग्य चर के रूप में प्राप्त करता है द्वितीय स्तर का बनाओ। –

उत्तर

0

शायद आप टीएजीजीईटी को बी के मेकफ़ाइल में प्रचारित होने से रोकने के लिए "अप्रत्याशित" निर्देश का उपयोग कर सकते हैं?

+0

दुर्भाग्यवश, अप्रत्याशित निर्देश केवल निर्यात किए जाने से निर्यात का उपयोग करके निर्यात किए गए चर को रोकता है - इसका वर्तमान प्रक्रिया प्रक्रिया में कमांड लाइन पर पारित चर पर कोई प्रभाव नहीं पड़ता है या माता-पिता की कमांड लाइन से विरासत में प्राप्त होता है। ऐसा लगता है कि मेक कमांड लाइन के माध्यम से कोई मान सेट करना इसे सभी बच्चों को केवल अविभाज्य रूप से पढ़ता है। –

+0

फिर मैं विचारों से बाहर हूं। – JesperE

3

आप ए में दूसरे स्तर के makefile में कुछ भी नहीं करने के लिए MAKEOVERRIDES सेट कर सकते हैं

callb: 
     cd subdir && $(MAKE) MAKEOVERRIDES= 

यह -k और -s की तरह सामान्य कमांडलाइन मापदंडों नीचे से गुजरता है लेकिन चर परिभाषाएँ कमांडलाइन नहीं ।

या आप ऐतिहासिक MFLAGS जो MAKEFLAGS रूप में ही है का उपयोग छोड़कर MFLAGS कमांडलाइन चर परिभाषाएँ शामिल नहीं है।

callb: 
    cd subdir && $(MAKE) $(MFLAGS) 

इस दो विकल्प के बारे में विवरण यहाँ पढ़ जा सकता है: The GNU Make Manual

0

बिंदु है जहां निर्माण प्रणाली एक प्रणाली बी निर्माण का आह्वान में सीधे का उपयोग नहीं करते '${MAKE}'; एक शेल स्क्रिप्ट का आह्वान करें जो बिल्ड सिस्टम बी (संभवतः पर्यावरण को स्वच्छ करने के बाद) का आह्वान करता है।

व्यवहार जहां आदेशों 'make -n' द्वारा क्रियान्वित कर रहे प्राप्त करने के लिए, '+' के साथ makefile में कमांड लाइन ('@' या '-' के साथ लाइन लगाकर के समान) लगा दें।

0

ऐसा लगता है कि आपने बी मेकफ़ाइल को फिर से शुरू करने के लिए ए मेकफ़ाइल संशोधित किया है, और इस प्रकार आपकी समस्या है। इसके बजाय क्यों एक नया अपरिवर्तनीय मेकफ़ाइल पेश नहीं करते हैं जो बी मेकफ़ाइल को दोबारा आमंत्रित करता है, और उसके बाद फिर से मेकफ़ाइल का आह्वान करता है? उदाहरण के लिए, संयुक्त.एमके:

all: 
    $(MAKE) -f Makefile.B 
    $(MAKE) -f Makefile.A 

इस तरह बी मेकफ़ाइल को ए मेकफ़ाइल से कुछ भी नहीं मिला है।

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

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