2008-09-18 8 views
21

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

gcc $(INCLUDES) -E -MM $(CFLAGS) $(SRC) >>$(DEP) 

उत्तर

18

जवाब GCC manual में है: -MT ध्वज का उपयोग करें।

-MT target

बदलें नियम निर्भरता पीढ़ी द्वारा उत्सर्जित का लक्ष्य। डिफ़ॉल्ट रूप से सीपीपी मुख्य इनपुट फ़ाइल का नाम लेता है, किसी भी निर्देशिका घटकों को हटा देता है और .c जैसे किसी फ़ाइल प्रत्यय को हटा देता है, और प्लेटफ़ॉर्म के सामान्य ऑब्जेक्ट प्रत्यय को जोड़ता है। नतीजा लक्ष्य है।

एक -MT विकल्प लक्ष्य को आपके द्वारा निर्दिष्ट स्ट्रिंग के रूप में सेट करेगा। यदि आप एकाधिक लक्ष्य चाहते हैं, तो आप उन्हें -MT पर एकल तर्क के रूप में निर्दिष्ट कर सकते हैं, या एकाधिक -MT विकल्पों का उपयोग कर सकते हैं।

उदाहरण के लिए, -MT '$(objpfx)foo.o'

$(objpfx)foo.o: foo.c 
+0

'-एमटी' मेरे जीसीसी 2.9.5 के लिए उपलब्ध नहीं है, अतिथि – checksum

+2

@checksum से ऊपर 3.xx उपलब्ध होना चाहिए: ... [2.9.5] नहीं था (http://gcc.gnu.org /gcc-2.95/) 14 साल पहले जारी किया गया था? –

+0

यूप, मैंने पाया कि आउट ऑफ़ बिल्ड बिल्ड प्लेटफ़ॉर्म के साथ विरासत कोड बनाए रखने पर। : | यह अभी भी 2.9.1.57 का उपयोग कर रहा है (जीसीसी की जगह उदासीन कॉल था) और अच्छी बात यह है कि इसमें केवल 4 फाइलों के साथ न्यूनतम निर्भरता है और 700k से कम है। :) बुरी बात यह है कि इसमें कोई '-एमटी' समर्थन नहीं है। :( – checksum

0

यदि ऐसा करने के लिए जीसीसी के लिए कोई तर्क है, तो मुझे नहीं पता कि यह क्या है। हम $ {OBJDIR} /। O

0

ठीक है, बस यह सुनिश्चित करने के लिए कि मुझे सही प्रश्न मिल गया है: मुझे लगता है कि आपके पास परीक्षण है, हम सभी के पास निर्भरता आउटपुट पाइपिंग को समाप्त कर देते हैं। सी जो test.h शामिल है, और आप subdir/test.d उत्पन्न करना चाहते हैं (जबकि नहीं पैदा subdir/test.o) जहां subdir/test.d

subdir/test.o: test.c test.h 
बजाय

test.o: test.c test.h 
शामिल

जो आपको अभी मिलता है। क्या वह सही है?

मैं जो भी मांग रहा हूं उसे करने के लिए एक आसान तरीका के साथ आने में सक्षम नहीं था। हालांकि, http://www.gnu.org/software/gcc/news/dependencies.html को देखते हुए, आप .D फ़ाइल बनाने के लिए जब तुम ओ फाइल उत्पन्न चाहते हैं, तो आप उपयोग कर सकते

जीसीसी $ (शामिल) -MMD $ (CFLAGS) $ (एसआरसी) -ओ $ (subdir)/$ (OBJ)

(देखते हुए src = test.c, subdir = subdir, और OBJ = test.o) यह पैदा करेगा दोनों subdir/test.o और subdir/test.d, जहां subdir/test.d में वांछित आउटपुट शामिल है। उम्मीद है की वो मदद करदे।

0
  1. [जीएनयू] क्रोधित हो जाता है यदि आप वर्तमान निर्देशिका में आउटपुट नहीं डालते हैं। आपको वास्तव में क्या करना चाहिए बिल्ड निर्देशिका से बनाना है, और स्रोत कोड का पता लगाने के लिए VPATH बनाने चर का उपयोग करें। यदि आप एक कंपाइलर से झूठ बोलते हैं, जल्दी या बाद में यह अपना बदला लेगा।

  2. यदि आप किसी अन्य निर्देशिका में अपनी वस्तुओं और निर्भरताओं को उत्पन्न करने का आग्रह करते हैं, तो आपको एमिले द्वारा उत्तर दिए गए तर्क का उपयोग करने की आवश्यकता है।

36

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

include $(DEPS) 

तो इस पैटर्न नियम जोड़ने:

SRCS = \ 
     main.c \ 
     foo.c \ 
     stuff/bar.c 

DEPS = $(SRCS:.c=.d) 

फिर makefile में उत्पन्न निर्भरता शामिल

# automatically generate dependency rules 

%.d : %.c 
     $(CC) $(CCFLAGS) -MF"[email protected]" -MG -MM -MP -MT"[email protected]" -MT"$(<:.c=.o)" "$<" 

# -MF write the generated dependency rule to a file 
# -MG assume missing headers will be generated and don't stop with an error 
# -MM generate dependency rule for prerequisite, skipping system headers 
# -MP add phony target for each header to prevent errors when header is missing 
# -MT add a target to the generated dependency 

"$ @ "लक्ष्य (बाएं तरफ की चीज़:) है," $ < "पूर्वापेक्षा है (: दाईं ओर की चीज़:)। अभिव्यक्ति "$ (<: .c = .o)" .c एक्सटेंशन को .o के साथ बदल देती है।

यहां चाल दो बार जोड़कर दो लक्ष्य के साथ नियम उत्पन्न करना है; यह .o फ़ाइल और .d फ़ाइल दोनों को स्रोत फ़ाइल और उसके शीर्षकों पर निर्भर करता है; इस तरह निर्भरता फ़ाइल स्वचालित रूप से पुन: उत्पन्न हो जाती है जब भी संबंधित .c या .h फ़ाइलों में से कोई भी परिवर्तित हो जाता है।

-एमजी और -एमपी विकल्प हेडर फ़ाइल अनुपलब्ध होने पर फ्रेकिंग से बने रहते हैं।

+3

मेरे लिए, जीसीसी 4.1.2, जीएमके 3.8.1 पर, यदि कोई हेडर फ़ाइल नुस्खा '$ (सीसी) $ (सीसीएफएलजीएस) -एमएफ "$ @" -एमजी-एमएम -एमपी-एमटी " $ @ "-एमटी" $ (<:. c = .o) "" $ <"'अनंत लूप। // -एमपी विकल्प को हटाने से अनंत लूप बंद हो जाता है। –

9

आप डॉन McCaughey के जवाब के इस खनन संस्करण पसंद कर सकते हैं:

SRCS = \ 
    main.c \ 
    foo.c \ 
    stuff/bar.c 

DEPS = $(SRCS:.c=.d)

-include $(DEPS) टिप्पणी - उपसर्ग, जो त्रुटियों चुप्पी अगर .d फ़ाइलों को अभी तक अस्तित्व में नहीं है जोड़ें।

निर्भरता फ़ाइलों को उत्पन्न करने के लिए एक अलग पैटर्न नियम की आवश्यकता नहीं है। बस अपनी सामान्य संकलन रेखा में -MD या -MMD जोड़ें, और .d फ़ाइलों को उसी समय उत्पन्न किया जाता है जब आपकी स्रोत फ़ाइलों को संकलित किया जाता है। उदाहरण के लिए:

%.o: %.c 
    gcc $(INCLUDE) -MMD -c $< -o [email protected] 

# -MD can be used to generate a dependency output file as a side-effect of the compilation process. 
+2

वैसे, सुनिश्चित करें कि" शामिल करने से बचें "आपके पहले लक्ष्य से ऊपर।इसे मेकफ़ाइल के नीचे रखने के लिए तार्किक है, क्योंकि यह हमेशा निर्भरता रखने के लिए पारंपरिक जगह थी, जब उन्हें हाथ से तैयार किया जाना था! –

3

DGentry के जवाब पर विस्तृतीकरण यह मेरे लिए अच्छी तरह से काम किया है:

.depend: $(SOURCES) 
    $(CC) $(CFLAGS) -MM $(SOURCES) | sed 's|[a-zA-Z0-9_-]*\.o|$(OBJDIR)/&|' > ./.depend 

यह भी इस मामले में काम करता है जहां वहाँ केवल एक ही depency फ़ाइल है कि सभी स्रोत फ़ाइलों के लिए निर्भरता नियम शामिल हैं ।

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