यह मेकफाइल एक संकलक को निर्दिष्ट किए बिना भी सी प्रोग्राम कैसे बनाता है?


41

मैं " एडवांस्ड लिनक्स प्रोग्रामिंग (2001)" [कोड] पुस्तक से मेकफाइल का उपयोग कर रहा था । मेरे लिए यह देखना अजीब था कि जीएनयू मेक इन कंपाइलर को निर्दिष्ट किए बिना भी कोड को सही ढंग से संकलित करता है। यह बिना किसी रेसिपी के बेकिंग जैसा है!

यह कोड का एक न्यूनतम संस्करण है:

test.c

int main(){}

makefile

all:            test

और वास्तव में काम करता है! यह वह कमांड है जिसे यह निष्पादित करता है:

cc     test.c   -o test

मुझे प्रलेखन में कुछ भी उपयोगी नहीं मिला। यह कैसे संभव है?


पुनश्च एक अतिरिक्त नोट: यहां तक ​​कि भाषा भी निर्दिष्ट नहीं है; क्योंकि test.cउपलब्ध है, GNU makeका उपयोग करता है cc। यदि मौजूद है test.cppया test.cc(जब कोई नहीं है test.c), यह उपयोग करता है g++(और नहीं c++)।


4
"यह बिना किसी नुस्खा के बेकिंग जैसा है!" एक नुस्खा आपको पानी उबालने के लिए कहेगा, लेकिन यह नहीं कि आपको गैस स्टोव पर पैन, इंडक्शन स्टोव पर पैन, इलेक्ट्रिक केतली या आग पर तिपाई पर रखा हुआ पानी उबालना चाहिए या नहीं। यह यह भी नहीं बताएगा कि आपको अपना पानी कहां से लाना चाहिए। यह makeपानी को उबालने और अपने आंतरिक नियमों का उपयोग करने के लिए कह रहा है, makeबस यह कैसे पता चलेगा?)
Rhymoid

1
@ राइमॉइड यह चिल्लाने जैसा है: मुझे एक केक चाहिए! और फिर एक रोबोट makeआपके फ्रिज की जांच करता है और पता चलता है कि कुछ आटा उपलब्ध है, तो अपने आंतरिक नुस्खा से आपके लिए एक डिफ़ॉल्ट केक बनाता है। :-)
हू १

@ Ho1: रोबोट पूछ सकता है कि आप कौन सा केक चाहते हैं सर? :): डी
तुषारी

जवाबों:


68

इसे अपने अंतर्निहित नियमों का उपयोग करके करें । यह विशेष रूप से यह बताता है कि सी कोड को कैसे संकलित किया जाए और एकल-वस्तु कार्यक्रमों को कैसे जोड़ा जाए।

आपको वास्तव में मेकफाइल की भी आवश्यकता नहीं है:

make test

एक के बिना काम करेंगे।

यह सब संभव बनाने वाले छिपे हुए नियमों को देखने के लिए, -pबिना मेकफाइल वाले विकल्प का उपयोग करें :

make -p -f /dev/null

जैसा कि alephzero द्वारा बताया गया है , Make ने बहुत लंबे समय के लिए अंतर्निहित नियम बनाए हैं (यदि हमेशा नहीं); यूनिक्स V7 में स्टुअर्ट फेल्डमैन का पहला संस्करण उन्हें परिभाषित करता हैfiles.c , और उनके 1979 के पेपर में उनका उल्लेख है। वे POSIX विनिर्देश का भी हिस्सा हैं । (इसका मतलब यह नहीं है कि मेक के सभी कार्यान्वयन उनका समर्थन करते हैं - पुराने बोरलैंड मेक फॉर डॉस नहीं, कम से कम संस्करण 3.0 तक।)



5
@KingZoingo मेक इन इंफ़ेक्शन इंजन ऑफ़ इफ़ेक्ट है: इसमें नियमों का एक सेट (मेकफाइल से और अंतर्निहित) है, मौजूदा कलाकृतियाँ (मौजूदा निर्देशिका में फ़ाइलें या मेकफ़ाइल में नाम), और अनुरोधित कलाकृतियों (लक्ष्य में) makefile); यह बस नियमों और मौजूदा कलाकृतियों का मिलान करने की कोशिश करता है ताकि यह निर्धारित किया जा सके कि यह अनुरोधित कलाकृतियों को प्राप्त करने के लिए उनका उपयोग कर सकता है या नहीं। अंतर्निहित नियम बताते हैं कि इसका test.cउपयोग उत्पादन करने के लिए किया जा सकता है testmake -dआपको इस प्रक्रिया को विस्तार से दिखाएगा ...
स्टीफन किट

4
@ Ho1 @StephenKitt यह makeGNU या POSIX का आविष्कार होने से बहुत पहले से था। पहला संस्करण लगभग 40 साल पहले लिखा गया था, और इससे पहले भी शेल स्क्रिप्ट से निर्मित कुछ प्रोटोटाइप संस्करण थे।
एलेफ़ेज़रो

3
@jamesqf CPPअभी भी प्रीप्रोसेसर ( cc -Eआमतौर पर) को आमंत्रित करता है ; C ++ कंपाइलर है CXX
स्टीफन किट

3
@ CXXइस संदर्भ में Ho1 मेक वैरिएबल है, कमांड नहीं - मेकफाइल में C कमांड डायलर $(CXX)को चलाने के लिए कमांड द्वारा प्रतिस्थापित किया जाएगा।
स्टीफन किट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.