2010-03-16 12 views
7

$(CC) $(CFLAGS) -c -o [email protected] $< 

में उदाहरण के लिए वे क्या मतलब है?

+3

आपने 'मेक' पर क्या प्रलेखन पढ़ा है? http://www.makelinux.net/make3/make3-CHP-1-SECT-5.html? http://www.cs.swarthmore.edu/~newhall/unixhelp/howto_makefiles.html? Anytthing? –

उत्तर

3

[email protected] लक्ष्य के नाम पर बनाया जा रहा है - कार्यक्रम या वस्तु फ़ाइल बनाया जा रहा।

$< कि वजह से यह पुनर्निर्माण की फ़ाइल 'जिसका अस्तित्व की अनुमति दी अनुमान नियम लक्ष्य के लिए चुना जा करने के लिए' का नाम है फ़ाइल का नाम है।

उदाहरण में, आप हो सकता है:

program.o: program.c 
    ${CC} ${CFLAGS} -c -o [email protected] $< 

इस मामले में, [email protected] 'program.o' है और $< 'program.c' है। (नियम '-c' विकल्प के कारण ऑब्जेक्ट फ़ाइल उत्पन्न करना आवश्यक है।)

'$ <' से सावधान रहें; यदि कोई हेडर था जो प्रोग्राम से अधिक हालिया था, तो '$ <' इसके बजाय मेल खाता होगा - और फिर संकलन रेखा काम नहीं करेगी। जैसा कि दिखाया गया है, हालांकि यह पर्याप्त सुरक्षित है।


'$ <' के बारे में बीटा टिप्पणियां ...

'बनाने' की POSIX परिभाषा का कहना है:

  • $<

    एक अनुमान शासन में, $ < मैक्रो उस फ़ाइल नाम का मूल्यांकन करेगा जिसका अस्तित्व अनुमान की अनुमति देता है लक्ष्य के लिए चुना जाने वाला नियम। .DEFAULT नियम में, $ < मैक्रो वर्तमान लक्ष्य नाम का मूल्यांकन करेगा। $ < मैक्रो का अर्थ अन्यथा निर्दिष्ट नहीं किया जाएगा।

    उदाहरण के लिए, .c.a अनुमान नियम में, $ < पूर्वापेक्षाएँ .c फ़ाइल का प्रतिनिधित्व करता है।

तो, उदाहरण के मैं दे दिया है, '$ <' तकनीकी रूप से 'अनिर्दिष्ट' है। और, सही संदर्भ, में होगा जो:

.c.o: 
    ${CC} ${CFLAGS} -c -o [email protected] $< 

फिर '$ <' बिना शर्त 'progname.c' जब 'progname.o' का निर्माण किया जा रहा है।

'मेक' के कुछ संस्करण इसके साथ अजीब चीजें करते थे; जीएनयू मेक (3.81) और सोलारिस 10 दोनों ही संवेदनात्मक व्यवहार करते हैं। मैं एक समय-समय में पकड़ा गया, मुझे संदेह है। कोड बनाने के लिए

all: x.o 

x.o: x.c 
     ${CC} ${CFLAGS} -c -o [email protected] $< 

x.o: x.h 

मैं इस्तेमाल किया 'echo "int main(){return 0;}" > x.c' और 'echo > x.h': मैं निम्नलिखित makefile इस्तेमाल किया।इससे कोई फ़र्क नहीं पड़ता कि कौन सी फ़ाइल 'x.c' और 'x.h' से छू गई थी; किसी भी तरह से, संकलन 'सही' था। मेरे पास एक पुराना मेक-व्युत्पन्न है जो लगभग 1 99 2 था, जो कि ज्यादातर मामलों में सूर्य के साथ संगत है, जो इसे मिशेल करता है।

7 वें संस्करण यूनिक्स प्रोग्रामर के मैनुअल का कहना है:

नियम प्रत्यय के साथ एक फ़ाइल बनाने के लिए s2 कि प्रत्यय एस 1 के लिए एक प्रवेश के रूप में निर्दिष्ट किया जाता है के साथ एक समान नाम फ़ाइल पर निर्भर करता है ' लक्ष्य 's1s2। ऐसी प्रविष्टि में, विशेष मैक्रो $ * प्रत्यय के साथ लक्ष्य नाम के लिए खड़ा है, पूर्ण लक्ष्य नाम के लिए $ @, $ < पूर्वापेक्षाएँ की पूरी सूची के लिए $ और $? सूची के लिए सूची के लिए पुरानी शर्तें हैं।

यह उस संदर्भ के बाहर इसका क्या अर्थ है इसके बारे में कुछ भी नहीं कहता है। मुझे लगता है कि 7 वां संस्करण 'मेक' '$ <' के लिए 'x.c' और 'x.h' दोनों सूचीबद्ध करेगा - लेकिन POSIX का कहना है कि यह गलत है।

रवि "उपयोगकर्ता मार्गदर्शिका बनाना" (16 का अवतरण मार्च 1987) का कहना है:

$< निर्भरता फ़ाइल का नाम, यदि एक अंतर्निहित नियम के साथ उपयोग के लिए make द्वारा चयनित के रूप में।

जो अब आप देखते हैं उससे कम या कम अनुरूप है।


ओह ठीक है, ऐसा जीवन है; चीजें आपके चारों ओर बदलती हैं। कभी-कभी आप इसे होने लगते हैं; कभी-कभी आप नहीं करते हैं।

+1

यह सही नहीं है, $ <सूची में पहली निर्भरता है, जरूरी नहीं कि वह जिसने लक्ष्य को पुनर्निर्मित किया हो। – Beta

+1

पीएस $? लक्ष्य (या PHONY) से पहले की आवश्यकताएँ की सूची है, इसलिए ये वे हैं जो इस लक्ष्य को पुनर्निर्मित करने का कारण बनेंगे। – Beta

+0

@ बीटा: ठीक है - मैंने कुछ ऐतिहासिक टिप्पणी के साथ, चीजों को ठीक किया है। –

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