2014-07-16 9 views
6

बिना makefile उत्पन्न शामिल मेरा मैं अपने आप makefiles पैदा कर रहा हूँ और सहित उन्हें, इस तरह की एक परियोजना के लिए:चेतावनी संदेश

$ make 
Makefile:13: depend.mk: No such file or directory 
Creating depend.mk 
SUCCESS is 1 
:

all: 
    @echo 'SUCCESS is $(SUCCESS)' 

clean: 
    rm depend.mk 

depend.mk: 
    @echo 'Creating [email protected]' 
    @echo 'SUCCESS := 1' > [email protected] 

.PHONY: all clean 

include depend.mk 

यह काम करता है, लेकिन को शामिल लाइन एक चेतावनी संदेश उत्पन्न करता है

मैं उस पहली चेतावनी रेखा को चुप करना चाहता हूं जो निर्भर करता है कि निर्भर.एमके मौजूद नहीं है। मुझे पता है कि यह अस्तित्व में नहीं है क्योंकि मेरे पास इसे उत्पन्न करने के लिए लिखा गया नियम है, इसलिए चेतावनी अनावश्यक है (बेशक इसके लिए कोई नियम नहीं है)। मैं उस त्रुटि को अनदेखा नहीं करना चाहता जहां शामिल फ़ाइल मौजूद नहीं है और इसके लिए कोई नियम नहीं है, इसलिए include को - के साथ त्रुटि को अनदेखा करने के लिए उपसर्ग करना मेरे लिए काम नहीं करेगा। मुझे some_cmd 2>/dev/null जैसे पाइपिंग स्टेडर से/dev/null के बैश के सम्मेलन के समान कुछ चाहिए, लेकिन बनाने में शामिल हैं।

उपरोक्त नमूना इस मामले का एक बहुत ही सरल उदाहरण है। मेरे वास्तविक प्रोजेक्ट में बहुत से स्वचालित रूप से जेनरेट किए गए मेकफ़ाइल (क्लैंग की स्वचालित निर्भरता पीढ़ी के माध्यम से) शामिल हैं, जिसका अर्थ है make का ताजा रन इन चेतावनी संदेशों के साथ मेरी स्क्रीन को बाढ़ देगा।

क्या ऐसा कुछ भी संभव है, या क्या मुझे परेशान चेतावनी संदेशों से निपटना होगा?

+0

क्लैंग स्वचालित निर्भरता फ़ाइलों के लिए उनके लिए विशिष्ट नियम हैं? वे संकलन के दुष्प्रभाव के रूप में उत्पन्न नहीं हो रहे हैं? –

+0

@EtanReisner वे पैटर्न नियम हैं जैसे '$ (BUILDROOT) /%। डी: $ (CURTOP) /%। सी' जहां नुस्खा' $ (सीपीपी) $ (सीपीपीएफएलजीएस) -एमएम-एमजी -एमटी $ @ -एमटी है $ (बेसनाम $ @)। ओ-एमएफ $ @ $ <', इसलिए कुछ भी बनाया जाने से पहले उन्हें उत्पन्न किया जा सकता है। – C0deH4cker

+1

क्या आपको कुछ भी बनाया जाने से पहले उन्हें उत्पन्न करने की आवश्यकता है? क्या यह सिर्फ समय बर्बाद नहीं कर रहा है? यदि सी फ़ाइल को संकलित करने की आवश्यकता है, और क्लैंग ऑब्जेक्ट फ़ाइल और '.d' फ़ाइल दोनों को एक ही समय में थूक सकता है तो दो बार में ऐसा करने से परेशान क्यों हो? –

उत्तर

1

मैंने कई (कई!) चीजों को देखने की कोशिश की कि क्या मैं त्रुटि संदेश को रोक या पुनर्निर्देशित कर सकता हूं। कोई भाग्य नहीं।

लेकिन जब मैं करने की कोशिश की -include (एक अग्रणी पानी का छींटा के साथ शामिल हैं), यह एक त्रुटि नहीं दिया, और makeclean साथ, all, depend.mk और 'डिफ़ॉल्ट' सब ठीक से काम किया है और अपेक्षा के अनुरूप।

क्या कोई विशेष कारण है कि आप -include संस्करण का उपयोग नहीं करना चाहते हैं? ऐसा लगता है कि आप जो भी खोज रहे हैं, और यह नहीं बदलता है कि मेकफ़ाइल किसी भी तरह से कैसे काम करता है, बस मेकफ़ाइल के माध्यम से पहले पास के दौरान त्रुटि नहीं दिखाता है।

+1

'अंतर्निहित' का उपयोग करने वाला मुद्दा यह है कि अगर कुछ निर्भरता फाइलें किसी कारण से उत्पन्न करने में विफल होती हैं तो कोई त्रुटि संदेश प्रदर्शित नहीं होता है। इससे टूटी हुई बिल्डों का निदान करने के लिए कठोर परिस्थितियों का कारण बनता है या 'साफ-सुथरा' करने के बिना स्वचालित रूप से निर्मित उत्पादों को अपडेट नहीं किया जाता है। मैं चाहता हूं कि 'मेक' मुझे चिल्लाए, अगर वह उस फ़ाइल को शामिल करने का प्रयास करता है जिसमें कोई नियम नहीं है। – C0deH4cker

+0

लेकिन अपने मेकफ़ाइल नियमों पर विचार करते हुए, depend.mk बिना शर्त बना दिया गया है, इसलिए यह हमेशा उपलब्ध होना चाहिए। '-cludclud' __ONLY__ एक गैर-मौजूद फ़ाइल पर एक त्रुटि को दबा देता है। फ़ाइल में कोई भी कचरा त्रुटियों के कारण अपेक्षित होगा। 'Depend.mk' को बनाए रखने वाले आदेशों की पूंछ को' depend.mk' सही ढंग से बनाया गया था, यह सत्यापित करने के लिए आपको तर्क जोड़ना चाहिए। ऐसा कोई अन्य स्थान नहीं है जिस पर यह अस्तित्व या सामग्री का परीक्षण करने के लिए तार्किक होगा। यदि वे असफल होते हैं, तो कमांड निष्पादित करें, (और आप '-' के साथ cmds को उपसर्ग नहीं करते हैं), तो मेक प्रक्रिया विफल हो जाएगी। – lornix

+0

कृपया समझें कि मैंने जो सैंपल मेकफ़ाइल प्रदान किया है, वह वास्तव में उपयोग करने वाला एक बहुत ही सरल संस्करण है (कुल में मेकफ़ाइल कोड की 1000 पंक्तियों के करीब)। अलग-अलग झंडे, पथ और पैटर्न के साथ विभिन्न स्थानों से स्वचालित रूप से उत्पन्न होने वाली कई निर्भरता फ़ाइलों को उत्पन्न किया जा रहा है। कुछ '$ (eval'ed फ़ंक्शन कॉल से उत्पन्न होते हैं जो तब होते हैं जब उपनिर्देशिका के मेकफ़ाइल शामिल होते हैं (क्योंकि यह एक गैर-पुनरावर्ती मेक बिल्ड सिस्टम है, जैसा कि" रिकर्सिव कंसर्डिंग हर्मफुल "पेपर में उल्लिखित है)। मैंने' पहले शामिल करें, लेकिन मुझे त्रुटियों का निदान करने में कठिनाई थी, इसलिए मैंने इसे बदल दिया। – C0deH4cker

2

मैंने सामना किया है और (पुनः पुनः पुनः पुनः पुनः) इस समस्या को कई बार हल किया है। असल में, जब समस्या निर्भरता उत्पन्न होती है और उपयोग की जाती है तो समस्या आसपास की सोच में होती है। http://make.mad-scientist.net/papers/advanced-auto-dependency-generation/

मूल रूप से यह तथ्य यह है कि निर्भरता फ़ाइलें वास्तव में पुनर्निर्माण अपने पुस्तकालय/निष्पादन की, नहीं प्रारंभिक निर्माण के लिए केवल आवश्यक हैं करने के लिए नीचे आता है:

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

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

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