2010-07-02 17 views
7

मैं संकुल संकलित कर रहा हूं और मुझे लगता है कि कई बार मेकफ़ाइल लेखक इस तरह के और विकल्पों के साथ मेकफ़ाइल में सेट CFLAGS लिखते हैं। दूसरी तरफ, मैं कुछ कंपाइलर अनुकूलन का प्रयास करना चाहता हूं और जितना संभव हो उतना कम परेशानी के साथ कंपाइलर स्विच को प्रचारित करना चाहता हूं। हालांकि यह हमेशा करने योग्य नहीं है। उदाहरण के लिए जब एक मेकफ़ाइल CFLAGS निर्दिष्ट करता है और मैं सभी सी कंपाइलर इनवोकेशन का उपयोग करना चाहता हूं -फॉमिट-फ्रेम-पॉइंटर, CFLAGS=-fomit-frame-pointer make जैसे कुछ स्पष्ट रूप से लिखने के लिए, मेरे विकल्प क्या हैं जो हैकिश नहीं हैं। मैं क्या देख सकते हैं ऊपर है से, फिर वहाँ एक ही लेकिन अलग make "CFLAGS=-fomit-frame-pointer" है और मैं भी मैं क्या सबसे अच्छा समाधान और इस प्रश्न के लिए कारण पर विचार कर सकते हैं:पर्यावरण चर क्यों डिफ़ॉल्ट रूप से मेकफ़ाइल में सेट चर को ओवरराइड नहीं करते हैं?

export CFLAGS=-fomit-frame-pointer 
make -e 

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

+0

बनाने के लिए एक पैरामीटर है: - पर्यावरण-ओवरराइड जो आप वर्णन करते हैं, मुझे लगता है, तो हो सकता है कि आप इसे "रैपिंग" द्वारा एक स्क्रिप्ट के साथ डिफ़ॉल्ट बना सकें जो वास्तविक पर्यावरण के साथ वास्तविक बनाता है -Wrrides FWIW – rogerdpack

उत्तर

5

कि विवादास्पद है: "आखिर पर्यावरण सबसे अच्छा जानता है कि क्या है क्या"

यह कहने की एक अप सभी देसी बच्चे को "माँ सबसे अच्छा जानता है" और उन्हें कानून की पढ़ाई में जाने से रोक रहा है क्योंकि आप देखना चाहता था की तरह है वे किस प्रकार की प्लंबर होंगे। यह उनका जीवन है। चलो और उन्हें अपने लिए अपनी पसंद बनाने दें।

ओह रुको, आप पर्यावरण के बारे में पूछ रहे थे और बनाते थे। सही।

ठीक है, एक नई प्रक्रिया है जो आपके पर्यावरण को संशोधित करने के बाद शुरू होती है और सामान्य स्थिति में, पर्यावरण नहीं जानता कि लक्ष्य क्या हैं और यह कैसे काम करता है। तो, जो कुछ भी स्पष्ट रूप से सेट करता है ट्रम्प जो पर्यावरण में हो सकता है।

अद्यतन: एक तर्क है जो मूल रूप से मेरे उत्तर - पूर्वानुमान की याद में आया था। एकमात्र आवश्यकता औजारों के मानकीकृत सेट (जीसीसी, वही libs का एक ही संस्करण) की उपस्थिति होनी चाहिए, और यह देखते हुए कि उचित रूप से लिखित मेक फ़ाइल हमेशा एक ही परिणाम उत्पन्न करनी चाहिए, इससे कोई फर्क नहीं पड़ता कि पर्यावरण क्या है, या अन्य उपकरण क्या मौजूद हैं ।

+1

फिर हम कैसे बनाए गए सॉफ़्टवेयर के लिए कंपाइलर स्विच ओवरराइड करना चाहते हैं? मेरा मतलब पर्यावरण के अनुकूल तरीके से है? :-) निश्चित रूप से कोई अनुकूलन को नियंत्रित करना चाहता है? आप उस पर फैसला नहीं कर सकते हैं। यदि कुछ भी है, तो एक मेकफ़ाइल जो CFLAGS/CXXFLAGS/CPPFLAGS को हार्डकोड करता है और किसी को इन्हें बदलने की अनुमति नहीं देता है, ठीक से डिज़ाइन नहीं किया गया है? – amn

+1

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

+0

वैसे यह मेरा पूरा तर्क है - पर्यावरण सबसे अच्छा जानता है। या कम से कम एक उचित ढंग से डिजाइन मेकफ़ाइल के साथ, चाहिए। इसलिए निहितार्थ है कि यदि मेकफ़ाइल पर्यावरण सेट चर पर टूट जाता है, तो यह अच्छा नहीं है। अगर किसी लेखक को वास्तव में उसके '-g' कंपाइलर स्विच की आवश्यकता होती है, और डर है कि मेकफ़ाइल उपयोगकर्ता इसे किसी और चीज़ के लिए छोड़ सकता है, तो शायद उन्हें "ओवरराइड" सिंटैक्स, या द्वितीय चरण असाइनमेंट ": =" का उपयोग करना चाहिए? जब आप संकुल का एक पूरा सेट बना रहे हों तो कमांड लाइन झंडे पास करना एक अच्छा विकल्प नहीं है .... – amn

16

वैरिएबल को ओवरराइड करें यदि आप उन्हें कमांड लाइन पर डालते हैं।

इस प्रयास करें: चेतावनी के make CFLAGS=-fomit-frame-pointer

एक शब्द। अधिकांश मेकफ़ाइल अपने चर को ओवरराइड होने की अपेक्षा नहीं करते हैं। इसका अर्थ यह है कि यदि मेकफ़ाइल निर्दिष्ट करने के लिए CFLAGS का उपयोग करता है- I फ़ाइलों को शामिल करने के लिए, IO ऑप्टिमाइज़ेशन के लिए, या अन्य झंडे, आपको उन्हें अपने CFLAGS ओवरराइड में जोड़ना होगा या मेक शायद असफल हो जाएगा।

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