2013-03-14 3 views
5

मैं वस्तुओं के लिए मेकफ़ाइल निर्भरता उत्पन्न करने के लिए जीसीसी में -MM ध्वज का उपयोग करता हूं। makefile संक्षेप में इस प्रकार है:जीसीसी मेकफ़ाइल निर्भरता उत्पादन पथ

-include autodep 
... 
$(TARGET): build $(OBJECTS) 
    $(CC) -shared -o [email protected] $(OBJECTS) 
    $(CC) -MM $(SOURCES) > autodep 

सूत्रों फ़ोल्डर src में स्थित हैं। हालांकि, autodep फ़ाइल उनके रिश्तेदार पथ के बिना वस्तु लक्ष्यों में शामिल होंगे:

foo.o: src/foo.c src/foo.h 
bar.o: src/bar.c src/bar.h src/baz.h 

कैसे मैं उन्हें इस में बदल जाते हैं चाहिए:

src/foo.o: src/foo.c src/foo.h 
src/bar.o: src/bar.c src/bar.h src/baz.h 

?

मैंने -MT ध्वज का उपयोग करने की कोशिश की, लेकिन ऐसा लगता है कि ऑब्जेक्ट लक्ष्यों को पूरी तरह से हटा दिया गया है।

उत्तर

6

-MT संपूर्ण लक्ष्य नाम सेट करता है। आप प्रत्येक स्रोत के लिए एक अलग लक्ष्य चाहते हैं, आप प्रत्येक स्रोत है, जो संकलक के कई आमंत्रण और एक foreach पाश का मतलब है के लिए एक अलग -MT तर्क की जरूरत है:

$(TARGET): build $(OBJECTS) 
    $(CC) -shared -o [email protected] $(OBJECTS) 
    rm autodep 
    $(foreach SRC,$(SOURCES),$(CC) -MM -MT $(SRC:.c=.o) $(SRC) >> autodep;) 

वैकल्पिक रूप से, आप उत्पादन की मालिश करने एसईडी का उपयोग कर सकते

$(TARGET): build $(OBJECTS) 
    $(CC) -shared -o [email protected] $(OBJECTS) 
    $(CC) -MM $(SOURCES) | sed 's|^|src/|' > autodep 

आसान अभी भी इसे में खुद .D फ़ाइल प्रत्येक स्रोत फ़ाइल के लिए निर्भरता डाल दिया और उत्पन्न करने के लिए -MMD झंडा उपयोग करने के लिए है कि जब आप स्रोत फ़ाइल संकलन:

-include $(SOURCES:.c=.d) 
CFLAGS += -MMD 

$(TARGET): build $(OBJECTS) 
    $(CC) -shared -o [email protected] $(OBJECTS) 
+0

धन्यवाद! मैं 'foreach' लूप का उपयोग करता हूं, और' autodep' की सामग्री अब सही हैं। लेकिन यह वास्तव में काम नहीं करता प्रतीत होता है। प्रश्न से उदाहरण का उपयोग करते हुए, यदि मैं 'src/bar.h' बदलता हूं और 'मेक' चलाता हूं तो मुझे बस 'मेक: \' src/foo.o' अद्यतित है '। –

+0

'सभी के बाद 'शामिल करें' को हटाकर इसे हल करें:'। –

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