2009-12-30 16 views
7

का उपयोग कर एक ही फ़ाइल में सभी प्रोजेक्ट निर्भरताओं को उत्पन्न करें, मैं एक एकल निर्भरता फ़ाइल उत्पन्न करना चाहता हूं जिसमें मेकफ़ाइल के माध्यम से gcc-m ध्वज का उपयोग करके स्रोत फ़ाइलों की सभी निर्भरताओं को शामिल किया जाए। मैं इस समाधान के लिए googled लेकिन, सभी समाधान कई वस्तुओं के लिए एकाधिक deps फ़ाइलों को उत्पन्न करने के लिए हैं।gcc-mM ध्वज

DEPS = make.dep 

$(OBJS): $(SOURCES) 
    @$(CC) -MM $(SOURCEs) > $(DEPS) 
    @mv -f $(DEPS) $(DEPS).tmp 
    @sed -e 's|[email protected]:|[email protected]:|' < $(DEPS).tmp > $(DEPS) 
    @sed -e 's/.*://' -e 's/\\$$//' < $(DEPS).tmp | fmt -1 | \ 
     sed -e 's/^ *//' -e 's/$$/:/' >> $(DEPS) 
    @rm -f $(DEPS).tmp 

लेकिन यह ठीक से काम नहीं कर रहा है। कृपया मुझे बताएं कि मैं गलती कर रहा हूं।

उत्तर

7
इन पंक्तियों के साथ

कुछ है जो मैं एक एकल फाइल में अपने सभी निर्भरता प्राप्त करने के लिए उपयोग करते हैं:

program_H_SRCS := $(wildcard *.h) 
program_C_SRCS := $(wildcard *.c) 
DEPS = make.deps 

make.deps: $(program_C_SRCS) $(program_H_SRCS) 
    $(CC) $(CPPFLAGS) -MM $(program_C_SRCS) > make.deps 

include $(DEPS) 

यह मूलतः सभी उपयोगकर्ता का कारण बनता है (के रूप में सिस्टम के खिलाफ) निर्भरता एक एकल फाइल जब भी में पुनर्निर्माण की परियोजना में कोई सी या एच फ़ाइल संशोधित है।

+++++++++ संपादित +++++++++++

मैं के बाद से काम करने के लिए एक बेहतर तरीका मिल गया है। मैं प्रत्येक स्रोत फ़ाइल के लिए एक अलग डीपी फ़ाइल उत्पन्न करता हूं। यहाँ बुनियादी makefile है:

program_NAME := myprogram 
program_SRCS := $(wildcard *.c) 
program_OBJS := ${program_SRCS:.c=.o} 
clean_list += $(program_OBJS) $(program_NAME) 

# C Preprocessor Flags 
CPPFLAGS += 
# compiler flags 
CFLAGS += -ansi -Wall -Wextra -pedantic-errors 

.PHONY: all clean distclean 

all: $(program_NAME) 

clean: 
    @- $(RM) $(clean_list) 

distclean: clean 

# Generate dependencies for all files in project 
%.d: $(program_SRCS) 
    @ $(CC) $(CPPFLAGS) -MM $*.c | sed -e '[email protected]^\(.*\)\.o:@\1.d \1.o:@' > [email protected] 

clean_list += ${program_SRCS:.c=.d} 

$(program_NAME): $(program_OBJS) 
    indent -linux -brf $(program_SRCS) 
    splint $(program_SRCS) 
    $(LINK.c) $(program_OBJS) -o $(program_NAME) 

ifneq "$(MAKECMDGOALS)" "clean" 
# Include the list of dependancies generated for each object file 
-include ${program_SRCS:.c=.d} 
endif 

यह दो बातें करता है:

  1. हैं फ़ाइलों कि बदलाव पर निर्भर foo.c तो foo.o में अन्य फ़ाइलों के पुनर्निर्माण के लिए बिना पुनर्निर्माण किया गया है में से किसी परियोजना।
  2. डीपी फ़ाइल में ऑब्जेक्ट फ़ाइल के समान ही निर्भरताएं हैं, ताकि यदि किसी भी डीपी को संशोधित किया गया हो तो डीपी फ़ाइल को भी पुन: उत्पन्न किया जाता है, ऑब्जेक्ट फ़ाइल डीपी की जांच होने से पहले।
+0

आपको बहुत बहुत धन्यवाद। मुझे लगता है कि यह किसी भी परियोजना के लिए मेरा नया अंतिम मेकफ़ाइल हो सकता है। – digy

+0

@ डिजी ग्लाड मैं मदद की हो सकती है :-) –

1

मुझे लगता है कि gcc -M, जहां आम तौर पर आप कुछ इस तरह करते हैं, उसके लिए व्यवहार की उम्मीद है है:

FOO_SOURCES= \ 
    src/foo.c \ 
    src/bar.c 

FOO_OBJECTS = $(FOO_SOURCES:.c=.o) 
FOO_DEPS = $(FOO_OBJECTS:.o=.d) 

(... लक्ष्य के बहुत सारे ...)

-include $(FOO_DEPS) 

ध्यान दें, -includeinclude नहीं क्योंकि निर्भरता स्पष्ट रूप से अस्तित्व में नहीं रहेगी जब तक कि कम से कम एक निर्माण नहीं चलाया जाता है। भले ही निर्भरता प्रति मॉड्यूल आधार पर उत्पन्न होती है।

यह भी ध्यान दें कि gcc -M हमेशा काम नहीं करता है क्योंकि आप इसे काम करने की उम्मीद करेंगे, व्यापक रूप से इस बात के आधार पर कि आप किस जीसीसी का उपयोग कर रहे हैं।

मुझे लगता है कि आप क्या चाहते हैं makedep कहा जाता है, जो मेकफ़ाइल में आप हैडरी के बिना जो चाहते हैं वह करता है।

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