2013-05-02 8 views
5

मैं मेकफ़ाइल का उपयोग करने की कोशिश कर रहा हूं, मेरी समस्या यह है कि मेरे पास src निर्देशिका और Makefile के साथ एक निर्देशिका है। मैं tmp निर्देशिका का भी उपयोग करता हूं जो मुझे बनाना है। इसमें ऑब्जेक्ट फ़ाइलें हैं। और प्रदर्शन के लिए, मैं डीबगिंग करते समय इन्हें हटाने की कोशिश नहीं करता हूं। यदि मैं इसे बनाने के लिए tmp के लिए नियम बनाता हूं, तो यह हमेशा सभी सी फ़ाइलों का पुनर्निर्माण करता है। तो यह कैसे करें?यदि आवश्यक हो तो निर्देशिका कैसे बनाएं?

+1

संभावित फ़ाइल [फ़ाइल बनाने का उपयोग कर निर्देशिका बनाएं] का संभावित डुप्लिकेट (http://stackoverflow.com/questions/1950926/create-directories-using-make-file) – SimplyKnownAsG

उत्तर

8

कई तरीके हैं। यह इस बात पर निर्भर करता है कि आप किस make का उपयोग कर रहे हैं और आप किस ऑपरेटिंग सिस्टम का उपयोग कर रहे हैं।

एक चीज जो आपको कभी नहीं करना चाहिए एक निर्देशिका को एक सामान्य शर्त के रूप में उपयोग करना है। निर्देशिकाओं पर संशोधित समय को अद्यतन करने के लिए फाइल सिस्टम का उपयोग करने वाले नियम make के साथ अच्छी तरह से काम नहीं करते हैं।

एक POSIX सिस्टम पर

सरल make के लिए, आप निर्देशिका शासन में पूर्व बनाने के संकलन प्रदर्शन करने के लिए कर सकते हैं:

obj/foo.o: foo.c 
     @ mdkir -p obj 
     $(CC) $(CPPFLAGS) $(CFLAGS) -c -o [email protected] $< 

आप जीएनयू है, तो आपके पास दो विकल्प हैं। सबसे सरल एक बस के लिए मजबूर करने, इस तरह की एक पंक्ति जोड़कर निर्देशिका जब makefile से पहले कुछ और होता है में पढ़ा जाता है बनाया जाना है:

_dummy := $(shell mkdir -p obj) 

The, आसान, तेज, और विश्वसनीय है। इसका एकमात्र नकारात्मक पक्ष यह है कि निर्देशिका हमेशा बनाई जाएगी, भले ही इसकी आवश्यकता न हो। फिर भी मैं आमतौर पर ऐसा करता हूं।

obj/foo.o: foo.c | obj 
     $(CC) $(CPPFLAGS) $(CFLAGS) -c -o [email protected] $< 

obj: 
     mkdir -p [email protected] 

यह, लेकिन बलों obj लक्ष्य obj/foo.o लक्ष्य से पहले निर्मित किया जाना:

सबसे आधुनिक तरीका है, अगर आप एक नया पर्याप्त जीएनयू बनाने के लिए है, क्रम-केवल आवश्यक शर्तें उपयोग करने के लिए है पर टाइमस्टैम्प को यह निर्धारित करते समय अनदेखा किया जाता है कि obj/foo.o पुराना है या नहीं।

+0

क्या जीएनयू एक्सटेंशन के बिना इसे करने का कोई तरीका है? (प्रश्न 'मेकफ़ाइल' टैग किया गया है, न कि 'जीएनयूमेकफाइल')। – jww

+0

नहीं, POSIX-compliant makefiles लिखते समय निर्देशिका को किसी शर्त के रूप में उपयोग करने का कोई तरीका नहीं है (जैसे यह वांछित व्यवहार करता है)। एकमात्र चीज जो आप कर सकते हैं वह एक स्पष्ट 'mkdir -p' में जोड़ने के लिए अपने सभी नियमों को फिर से लिखना है, जो कि मौजूद निर्देशिका का उपयोग करने का प्रयास करने से पहले, और पूर्वापेक्षाएँ का उपयोग नहीं करते हैं या निर्देशिका बनाने के लिए नियम बनाते हैं। – MadScientist

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