"कोई लक्ष्य नहीं" त्रुटि मेक का उपयोग कर


12

मैं सीख रहा हूं कि कैसे उपयोग करना makeऔर बनाना है, इसलिए मैंने यह छोटी फाइल लिखी:

%.markdown: %.html
    pandoc -o $< $@

लेकिन जब मैं दौड़ता हूं तो मुझे जो makeकुछ मिलता है वह सब make: *** No targets. Stop.चल जाता है।


क्या वे स्पेस या pandocकमांड के सामने एक टैब है । बनाओ एक टैब नहीं होने के बारे में कुख्यात picky है और रिक्त स्थान नहीं है।
SLM

@ एसएलएम: यह एक टैब है। मैंने कहीं पढ़ा कि विंडोज का ईओएल संगत नहीं है, इसलिए मैंने पूरी फाइल को यूनिक्स के संगत ईओएल में बदल दिया।
अहमद

जवाबों:


17

मुसीबत:

आप समस्या यह है कि makeअपने लक्ष्यों के बारे में पता नहीं है।

आप make stackoverflow.markdownउदाहरण के लिए अपने ऊपर मेकफाइल चला सकते हैं और यह काम करेगा।

make केवल, हालांकि, विफल हो जाएगा, क्योंकि आपने केवल यह निर्दिष्ट किया था कि अपने लक्ष्य कैसे बनाएं, लेकिन कौन सा नहीं।

जैसा कि लिआज़ बिंदु से ऊपर के पैटर्न नियम को एक अंतर्निहित नियम कहा जाता है ।

makefile:

SRC = $(wildcard *.html)
TAR = $(SRC:.html=.markdown)

.PHONY: all clean

all: $(TAR)

%.markdown: %.html
    pandoc -o $< $@

clean:
    rm -f $(TAR)

स्पष्टीकरण:

SRC.htmlMakefile के माध्यम से सभी स्रोत फ़ाइलें (वे समाप्त हो रही हैं ) प्राप्त करें wildcard

टीएआर विकल्प प्रत्येक स्रोत में सूचीबद्ध फ़ाइल SRCलक्ष्य के साथ समाप्त होने के साथ .markdownके बजाय .html

.PHONY उन गैर-भौतिक लक्ष्यों को सूचीबद्ध करता है जो हमेशा आउट-ऑफ़-डेट होते हैं और इसलिए हमेशा निष्पादित होते हैं - ये अक्सर allऔर होते हैं clean

लक्ष्यall (के दाईं ओर सूचीबद्ध फ़ाइलों निर्भरता के रूप में है :सब) *.markdownफ़ाइलें। इसका मतलब है कि इन सभी लक्ष्यों को अंजाम दिया गया है।

%.markdown: %.html
    pandoc -o $< $@

इस स्निपेट में कहा गया है: समाप्त होने वाले प्रत्येक लक्ष्य .markdownको उसी नाम वाली फ़ाइल पर निर्भर किया जाता है, सिवाय इसके कि निर्भरता समाप्त हो रही है .htmlवाइल्डकार्ड% एक के रूप में देखा जा रहा है *खोल में की तरह। %सही पक्ष पर, तथापि, बाईं ओर मैच की तुलना में है। स्रोत

ध्यान दें कि व्हॉट्सएप सीक्वेंस infront pandocहै a TAB, क्योंकि makeयह एक मानक के रूप में परिभाषित करता है।

अंत में, इस cleanटारगेट को इस मेकफाइल के साथ आपके द्वारा बनाई गई फाइलों से अपने सिस्टम को साफ करने का तरीका दिखाया गया है। इस मामले में, यह सभी लक्ष्यों (उन फ़ाइलों को हटा रहा है जिन्हें नाम दिया गया था *.markdown


1
शानदार जवाब और ये अन्य लिंक हैं जिन्हें मैंने इसे समझने की कोशिश करते हुए पाया: वाइल्डकार्ड फ़ंक्शन , प्रतिस्थापन संदर्भ और फ़ॉनी लक्ष्य
अहमद

एक और सवाल कृपया: makefileखरोंच से फाइल बना सकते हैं या यह केवल मौजूदा फ़ाइलों को अद्यतन करता है? क्योंकि जब मैं उत्पन्न फ़ाइलों को हटाता हूं, तो यह काम करना बंद कर देता है। बेवकूफ सवाल मुझे पता है, लेकिन यह मेरे लिए न्यूफाउंडलैंड है ^^ "
अहमद

1
आपका मतलब है कि अगर कोई .markdown फाइलें नहीं हैं, तो वे बनाई जाएंगी? हाँ यह है कि क्या करना चाहिए के रूप में तक मुझे पता है
polym

1
तो ठीक है। मैं कुछ और खुदाई करूँगा। अपने जवाब के लिए धन्यवाद, आप के लिए धन्यवाद मैं सही रास्ते पर अब कर रहा हूँ:)
अहमद

1
बस आपको शानदार जवाब के लिए धन्यवाद देना चाहता था। जिस तरह से आपने समझाया है वह काम करने के पीछे के कारण को समझने में बहुत आसान है और आगे बढ़ने के लिए बहुत विस्तृत निर्देश नहीं है। एक बार फिर धन्यवाद।
ज़नोना

5

पैटर्न नियम अंतर्निहित नियम हैं।

आपके Makefile में आपके कोई लक्ष्य निर्धारित नहीं हैं। आप कमांड लाइन पर लक्ष्य को निर्दिष्ट कर सकते हैं: make something.markdownबनाने के लिए नुस्खा का उपयोग करेगा something.markdownसे something.html

या आप अपने Makefile को डिफ़ॉल्ट लक्ष्य निर्दिष्ट करने वाला नियम जोड़ सकते हैं।

all: file1.markdown file2.markdown

या वाइल्डकार्ड के साथ:

all: *.markdown

जब आप बस चलाते हैं make, तो पहले नियम का पहला लक्ष्य डिफ़ॉल्ट लक्ष्य होता है । इसे बुलाने की जरूरत नहीं है all

तो ऊपर, लक्ष्य में allवे सभी फाइलें हैं जिन्हें आप किसी और चीज के रूप में बनाना चाहते हैं, इसलिए जब आप make all, यह सभी सूचीबद्ध फाइलों को बना देगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.