2008-10-30 11 views
13

में कोई फ़ाइल मौजूद है या नहीं, यह जांचने के लिए कि मेरे पास एक एकल DLL (प्लगइन सिस्टम के लिए) संकलित करने के लिए मेकफ़ाइल टेम्पलेट है। उपयोगकर्ता की makefile इस तरह दिखता है:मेकफ़ाइल

EXTRA_SRCS=file1 file2 
include makefile.in 

makefile.in मेरे पास में:

plugin.dll: plugin.os $(patsubst %,%.os,$(EXTRA_SRCS)) 

कहाँ plugin.os मुख्य सी ++ फ़ाइल है संकलित की। Btw, फ़ाइलों के अंत .os (gcc साथ अर्थात -fpic विकल्प का उपयोग) वस्तु साझा लाइब्रेरी के लिए संकलित फ़ाइलें हैं

अब, समस्या यह है कि अतिरिक्त स्रोतों शायद (लेकिन जरूरी नहीं) फ़ाइलों शीर्षक हो जाएगा है। आदर्श रूप में मैं उन्हें लक्ष्य plugin.os और file.cpp के लिए निर्भरता के रूप में जोड़ना चाहता हूं, लेकिन केवल तभी मौजूद हैं।

विधि को विंडोज़ और लिनक्स दोनों के लिए काम करना चाहिए, या कम से कम प्रत्येक के लिए अनुकूल होना चाहिए। हालांकि, मैं केवल बनाने के जीएनयू संस्करण का उपयोग करता हूं।

$(wildcard *.h) 

संपादित करें:

उत्तर

18

"वाइल्डकार्ड" फ़ंक्शन का उपयोग करने के लिए एक विशिष्ट सूची से मिलान करने में, कर

$(wildcard $(HEADER_FILES)) 

$ उपयोग करने के लिए कोई जरूरत नहीं है (फिल्टर ...), वाइल्डकार्ड फ़ंक्शन स्वचालित रूप से उन फ़ाइलों को फ़िल्टर करता है जो मौजूद नहीं हैं।

+0

कि नहीं मैं क्या चाहते हैं ... मैं ज फ़ाइल की एक विशिष्ट सूची के लिए ... – PierreBdR

+0

ठीक है का परीक्षण करने के लिए है, आप वाइल्डकार्ड का उपयोग करने की जरूरत नहीं। $ का उपयोग करें (वाइल्डकार्ड $ (HEADER_FILES)) – JesperE

4

आपने यह निर्दिष्ट नहीं किया है कि आप किस कंपाइलर का उपयोग कर रहे हैं, लेकिन यदि आपके पास जीसीसी/जी ++ तक पहुंच है तो आप -एमएम विकल्प का उपयोग कर सकते हैं।

मैं जो करता हूं वह प्रत्येक .c या .cpp फ़ाइल के लिए .d के विस्तार के साथ एक फ़ाइल बनाता है, और फिर .d फ़ाइलों को "शामिल" करता है। मैं अपने Makefile में कुछ इस तरह का उपयोग करें: और इस Makefile के तल पर

C_DEPS=$(C_SRCS:.c=.d) 
CPP_DEPS=$(CPP_SRCS:.cpp=.d) 
DEPS=$(C_DEPS) $(CPP_DEPS) 

:

%.d: %.c 
     gcc $(INCS) $(CFLAGS) -MM $< -MF [email protected] 

%.d: %.cpp 
     g++ $(INCS) $(CXXFLAGS) -MM $< -MF [email protected] 

मैं तो निर्भरता इस प्रकार बना

include $(DEPS) 

इस है किस तरह का व्यवहार आप जा रहे हैं? इस पद्धति का सौंदर्य है कि भले ही आप वास्तविक संकलन के लिए एक गैर जीएनयू संकलक का उपयोग कर रहे हैं, जीएनयू compilers निर्भरता की गणना के एक अच्छा काम करते हैं।

+0

मैं नहीं बल्कि makeflie पीढ़ी ... लेकिन धन्यवाद से बचने होगा! – PierreBdR

2

सरल

$(filter $(wildcard *.h),$(HEADER_FILES)) 

तुम क्या चाहते हो रहा है?

+0

mmhh .. मैं इस फिल्टर आदेश के बारे में पता नहीं था! यह क्या करता है – PierreBdR

+0

पढ़ें मेक के दस्तावेज़ (जानकारी पृष्ठों, नहीं मैनपेज): $ (फिल्टर पैटर्न, पाठ) पाठ में शब्द जो पैटर्न के कम से कम एक से मेल है। (पैटर्न फ़ाइलपटलर बना रहा है, regexes नहीं है, तो एक सादा फ़ाइल नाम बिल्कुल मेल खाना चाहिए।) – ephemient