2010-08-13 8 views
7

मैं एक नियम है कि एक निर्देशिका बनाता हैदबाने मेकअप नियम त्रुटि उत्पादन

bin: 
    -mkdir [email protected] 

हालांकि पहली बार निर्देशिका तैयार की गई है के बाद, मैं इस उत्पादन प्राप्त किया है:

mkdir bin 
mkdir: cannot create directory `bin': File exists 
make: [bin] Error 1 (ignored) 

वहाँ कुछ रास्ता है यदि निर्देशिका मौजूद नहीं है, तो मैं केवल नियम चला सकता हूं, या जब निर्देशिका पहले से मौजूद हो तो आउटपुट दबाएं?

+0

डुप्लिकेट के पास: http://stackoverflow.com/questions/3477292/what-do-and-do-as-prefixes-to-recipe-lines-in-make – reinierpost

उत्तर

8

निर्देशिका निर्माण को संभालने के लिए परंपरागत तरीके से कि पर निर्भर है और एक पक्ष प्रभाव के रूप dir बनाता है एक डाक टिकट फ़ाइल का उपयोग करने के लिए है। टिकट फ़ाइल निकालें जब distclean बनाने या जो कुछ भी अपने "वास्तव में साफ" लक्ष्य है:

bin/.dirstamp: 
    mkdir -p $(DIRS) 
    touch [email protected] 

bin/foo: bin/.dirstamp 
    $(MKFOO) -o [email protected] 

distclean: 
    rm -rf bin 

इस का कारण इस प्रकार है: जब भी bin में एक फ़ाइल बनाई गई है/हटा दिया, जिसमें निर्देशिका के mtime अद्यतन किया जाता है । यदि कोई लक्ष्य bin पर निर्भर करता है, तो अगली बार make रन, फिर यह उन फ़ाइलों को फिर से बनाएगा जिनकी आवश्यकता नहीं है।

+0

क्या डीआईआर डीपी उस स्थान पर उत्पन्न सभी फाइलों पर जाता है? –

+0

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

7

त्रुटि को कमांड लाइन पर अग्रणी '-' से पहले ही अनदेखा किया जाता है। क्या तुम सच में, mkdir से त्रुटि संदेश कम करना चाहते हैं मैं का उपयोग/ओ पुनर्निर्देशन:

bin: 
    -mkdir bin 2> /dev/null 

आप अभी भी मिलता है 'पर ध्यान नहीं दिया' make से चेतावनी है, हालांकि, तो यह mkdir के विकल्प का उपयोग करने के लिए बेहतर हो सकता है कि यह विफल जब लक्ष्य पहले से मौजूद है, जो -p विकल्प है कारण नहीं है:

MKDIR_P = mkdir -p 

bin: 
    ${MKDIR_P} [email protected] 

-p विकल्प वास्तव में सभी निर्देशिकाओं कि दिए गए पथ पर याद कर रहे हैं बनाता है, इसलिए इसके बारे में आ संख्या उत्पन्न कर सकते हैं एक आमंत्रण में निर्देशिका, लेकिन के रूप में विचार-प्रभाव यह है कि यह पहले से मौजूद निर्देशिकाओं के लिए कोई त्रुटि उत्पन्न नहीं करता है। यह mkdir का पॉज़िक्स-आश कार्यान्वयन मानता है; पुरानी मशीनें इसका समर्थन नहीं कर सकती हैं (हालांकि यह अब लंबे समय से मानक रही है)।

+0

क्यों ऐसी '2> और 1' पुनर्निर्देशन सहायता? मैं '2>/dev/null' को समझने के लिए stderr भेजने के लिए समझ जाएगा, लेकिन इसे stdout ..... भेजने के लिए? – humanityANDpeace

+0

@ ह्यूमनिटींडेस: आप सही हैं - 2010 में एक विचारक वापस। मैंने इसे ठीक कर दिया है। धन्यवाद। –

0

आप नियम तब तक निष्पादित नहीं किए जाने चाहिए जब तक कि उसका लक्ष्य मौजूद न हो या इसकी निर्भरता के कारण पुराना हो। दूसरे शब्दों में, आपको कभी भी इस त्रुटि का सामना नहीं करना चाहिए।

[उदाहरण जोड़ा गया]

[[email protected] tmp]$ ls -la 
total 20 
drwxr-xr-x. 2 max users 4096 Aug 14 21:11 . 
drwx------. 80 max max 4096 Aug 14 18:25 .. 
-rw-rw-r-- 1 max max  38 Aug 14 21:11 Makefile 
[[email protected] tmp]$ cat Makefile 
.PHONY: all 
all: bin 

bin: 
    mkdir [email protected] 

[[email protected] tmp]$ make 
mkdir bin 
[[email protected] tmp]$ ls -la 
total 24 
drwxr-xr-x. 3 max users 4096 Aug 14 21:11 . 
drwx------. 80 max max 4096 Aug 14 18:25 .. 
drwxrwxr-x 2 max max 4096 Aug 14 21:11 bin 
-rw-rw-r-- 1 max max  38 Aug 14 21:11 Makefile 
[[email protected] tmp]$ make 
make: Nothing to be done for `all'. 
[[email protected] tmp]$ make 
make: Nothing to be done for `all'. 

अपने फ़ोल्डर कुछ भी पर निर्भर करती है? क्या आपका फ़ोल्डर एक पैसा लक्ष्य है?

+0

नहीं। यह हमेशा पुराना है, ओपी में आप जो देखते हैं वह मेरे पास है। –

0

खैर मैं इस निर्माण के साथ समाप्त हो गया है, शायद किसी को यह उपयोगी मिल जाएगा या उस पर टिप्पणी कर सकते हैं:

BINDIR = . 
TMPDIR = tmp 
OUTDIRS = $(BINDIR) $(TMPDIR) 
$(OUTDIRS): 
    @test -d [email protected] || mkdir [email protected] 
+0

वैसे भी आपके लिए 'test' बनाता है, इसलिए यह दो बार निर्देशिका को stating समाप्त होता है। यह सिर्फ समस्या को छुपाता है कि डिफ़ॉल्ट लक्ष्य है। (डॉट)। –

0

मेक मान लिया गया पहला निशाना डिफ़ॉल्ट लक्ष्य है। यदि यह आपका पूरा मेकफ़ाइल है, तो यह हमेशा डिफ़ॉल्ट लक्ष्य को रीमेक करने का प्रयास करना चाहिए, जो कि बिन है। अपने makefile के शीर्ष पर पहले निम्न पंक्तियां सम्मिलित करें:

all: bin 
.PHONY: all 
12

make: error ... (ignored) आउटपुट को दबाने का एक और तरीका || true को विफल करने के लिए एक आदेश में संलग्न करना है।कि एक LaTeX लॉग फ़ाइल में त्रुटियों के लिए जाँच करता है ग्रेप साथ उदाहरण:

undefined: 
    @grep -i undefined *.log || true 

|| true के बिना, बनाने की शिकायत जब ग्रेप कोई मैच खोजने के लिए विफल रहता है।

यह सभी आदेशों के लिए काम करता है, न केवल mkdir; यही कारण है कि मैंने यह जवाब जोड़ा।

+0

डैनियल, एक मेक नियम में कमांड के लिए '-' उपसर्ग वर्ण एक ही चीज करता है हालांकि इसे खोलने के लिए खोल की आवश्यकता के बिना। यह तेजी से तेज है, और कम करने की संभावना कम है। –

+7

'-' उपसर्ग कारणों को कष्टप्रद" त्रुटि अनदेखा "आउटपुट आउटपुट करने के लिए बनाता है, जो मेरा समाधान नहीं करता है। तो नहीं, दोनों एक ही काम नहीं करते हैं। –

+0

मेला कॉल। धन्यवाद –