2010-11-22 9 views
18

मेकफ़ाइल के बारे में मैंने जो पढ़ा है उसके अनुसार, एक नकली लक्ष्य कोई लक्ष्य है जो वास्तविक फ़ाइल नाम से मेल नहीं खाता है। मेरा अंतर्ज्ञान कहता है कि एक लक्ष्य के रूप में एक निर्देशिका को फाइल के समान माना जाएगा।मेकफ़ाइल में, एक निर्देशिका नाम एक नकली लक्ष्य या "वास्तविक" लक्ष्य है?

यह महत्वपूर्ण क्यों है? मेरे पास मेरी मेकफ़ाइल में एक लक्ष्य के रूप में एक निर्देशिका है। जब मेरे पास यह मेरे प्राथमिक निष्पादन योग्य के लिए एक शर्त के रूप में है, तो निष्पादन योग्य हमेशा बनाया जाता है, चाहे सबकुछ अद्यतित हो या नहीं। यदि मैं इसे एक शर्त के रूप में बाहर ले जाता हूं, तो मेरी मेकफ़ाइल पर्याप्त समझदार है कि चीजों को बनाने की आवश्यकता होने पर, लेकिन मुझे यह जानने की समस्या है कि निर्देशिका को बनाने की आवश्यकता है या नहीं। जो मैंने पढ़ा है, उसके अनुसार, किसी भी नकली लक्ष्य पूर्व शर्त के रूप में अच्छे नहीं हैं क्योंकि उन्हें पता नहीं है कि वे अद्यतित हैं या नहीं, इसलिए वे हमेशा संबंधित लक्ष्य का पुनर्निर्माण करेंगे। यहां मेरे मेकफ़ाइल से एक अंश है।

$(EXEC_WITH_PATH): ${OBJ_DIR} $(DPEND) $(OBJS) 
    @echo "--------------------------------------------"; 
    @echo "$(THIS_DIR) $(MACHINE)"; 
    @echo "Linking Shared Library"; 
    @echo "ar -rc $(EXEC_WITH_PATH) INSERT::{OBJS}"; 
    ar -rc $(EXEC_WITH_PATH) $(OBJS); 
    @echo "--------------------------------------------"; 


# Make dirs for object code and links 
${OBJ_DIR} : 
     @if [ ! -d ${OBJ_DIR} ]; then \ 
       mkdir ${OBJ_DIR}; \ 
     fi; 
इस मामले में

तो, ${OBJ_DIR}, एक निर्देशिका का नाम, एक जाली लक्ष्य या नहीं है?

+1

वैसे भी आपकी समस्या का समाधान करने के लिए आप एक mkdir कमांड को "-" से पहले प्राप्त कर सकते हैं ताकि वापसी मूल्य को अनदेखा कर दिया जा सके। – siukurnin

+4

@siukurnin: नहीं, आपको 'mkdir -p' का उपयोग करना चाहिए, ताकि निर्देशिका पहले से मौजूद हो तो यह सफल हो जाएगी, लेकिन अगर निर्देशिका नहीं बनाई जा सकती है तो ठीक से विफल हो जाएंगे। – Cascabel

+0

इसके लायक होने के लिए, मुझे लगता है कि समस्या यह है कि निर्देशिका उस निर्देशिका में मौजूद फ़ाइल के लिए एक पूर्व शर्त है। तो ज्यादातर मामलों में पूर्व शर्त निर्देशिका और लक्ष्य का एक ही टाइमस्टैम्प होता है, जिससे लक्ष्य हर बार किया जाता है। – Chance

उत्तर

27

संपादित करें: यह केवल जीएनयू बनाने पर लागू होता है - "लिनक्स" टैग दिया गया एक उचित धारणा।

आपका लक्ष्य वास्तविक लक्ष्य है, न कि एक फोन। समस्या यह है कि आउटपुट निर्देशिका अद्यतन हो जाती है जब आप इसमें लक्ष्य डालते हैं ताकि यह आपके लक्ष्य से हमेशा नया हो। इसका मतलब है कि आपका लक्ष्य हमेशा बनाया जाएगा क्योंकि यह इसकी निर्भरताओं के संबंध में पुराना है।

आपको क्या चाहिए order-only prerequisite। ये पूर्वापेक्षाएँ आपको यह निर्दिष्ट करने की अनुमति देती हैं कि यदि यह अस्तित्व में नहीं है, तो इसे बनाने की आवश्यकता है, लेकिन टाइमस्टैम्प पर ध्यान नहीं देना है। यही है, ऑर्डर-केवल पूर्व शर्त के संबंध में एक लक्ष्य पुराना नहीं होगा।

आप इसे इस तरह निर्दिष्ट करें: लंबवत बार के बाद

$(EXEC_WITH_PATH): $(DPEND) $(OBJS) | ${OBJ_DIR} 
... 

कुछ भी एक आदेश-केवल शर्त है।

अब आप अपने OBJ_DIR लक्ष्य को आसान बनाने के कर सकते हैं:

${OBJ_DIR} : 
     mkdir -p ${OBJ_DIR} 

नोट: मैं बजाय ${OBJ_DIR} वाक्य रचना $(OBJ_DIR) का उपयोग किया है, क्योंकि यह है कि आप क्या करते थे।ऑर्डर-केवल पूर्वापेक्षाएँ उस वाक्यविन्यास पर निर्भर नहीं होती हैं।

+0

मैंने एक और लक्ष्य जोड़ना समाप्त कर दिया, ताकि मेरे पास $ (OBJ_DIR) और $ (EXEC_WITH_PATH) के आधार पर नया लक्ष्य हो, जो काम करता है। हालांकि मुझे "ऑर्डर-केवल" पूर्वापेक्षाएँ जांचनी होंगी। धन्यवाद। – Chance

+1

यहां लिंक मिला http://www.gnu.org/software/make/manual/make.html#Prerequisite- टाइप – Chance

+0

इस के साथ समस्या (ऐसा लगता है) यह है कि किसी के पास कोई निर्देशिका नहीं है जो एक लक्ष्य भी है। इसलिए, मेरे पास "डीबग" लक्ष्य और "डीबग" निर्देशिका नहीं हो सकती है जिसे मुझे बनाना है। – iheanyi

7

यह एक वास्तविक लक्ष्य है।

फोनी लक्ष्य स्वचालित रूप से मेक सिस्टम द्वारा नहीं खोजे जाते हैं - .PHONY लक्ष्य का उपयोग करके उन्हें आपके द्वारा पहचाना जाना चाहिए।

समझदार जाली लक्ष्य all और clean में शामिल हैं - इन वास्तविक फ़ाइलों के अनुरूप नहीं है, लेकिन कार्रवाई करने के आप makefile करना चाहते हैं। यहाँ समझाने के लिए कि यह कैसे बनाने के लिए है:

.PHONY: all clean install test 

निर्देशिकाएँ makefile नियम के वैध लक्ष्य कर रहे हैं। आपको इन मूर्खों को नहीं बनाना चाहिए।

mydir: 
    mkdir mydir 

.PHONY लक्ष्य, जाली निश्चित रूप से है।

जीएनयू दस्तावेज़ीकरण here पाया जा सकता है।

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