2010-11-14 13 views
6

मुझे बहुत मेकअप सामग्री नहीं पता है जो मैं आवश्यकतानुसार बिट्स सीखने के लिए इच्छुक हूं।gmake कई निर्देशिकाओं से ऑब्जेक्ट फ़ाइलों की सूची प्राप्त करें

मेरी मेकफ़ाइल की सबसे बड़ी विफलता यह है कि मैं सभी फ़ाइलों को मैन्युअल रूप से सूचीबद्ध कर रहा हूं, जबकि यह कोई समस्या नहीं है, मेरी वर्तमान परियोजना अनावश्यक हो रही है। मेरे पास स्रोत फाइलों के साथ प्रत्येक 4 निर्देशिकाएं हैं।

मैं उन्हें ऑब्जेक्ट फ़ाइल सूची मैन्युअल रूप से सूचीबद्ध किए बिना कैसे प्राप्त कर सकता हूं।

यह काम नहीं करता है, लेकिन यह दिखाता है कि मैं क्या करने की कोशिश कर रहा हूं।

VPATH = Lib GameCode Moot/Moot Moot/Impl 

OBJS = $(subst .cpp, .o, $(VPATH)) 

foobar: $(OBJS) 
    g++ -o [email protected] $^ 

%.o: %.cpp 
    g++ -c $< -o [email protected] -I Moot 

clean: 
    rm main.o lib.o foo.o foobar 

उत्तर

5

व्यक्तिगत रूप से, मुझे मैन्युअल रूप से सभी फ़ाइलों को सूचीबद्ध करने में कोई समस्या नहीं थी। मेकफ़ाइल में फ़ाइल को सूचीबद्ध करना उपयोगी सामग्री के साथ भरने की तुलना में नगण्य समय लेता है।

विभिन्न निर्देशिकाओं से सभी फ़ाइलों को प्राप्त करने के लिए, कोई wildcard function का उपयोग करने का सुझाव दे सकता है। तो my_sources:=$(wildcard *.cpp dir1/*.cpp) परिवर्तनीय स्रोत फ़ाइलों को बना देगा जो वाइल्डकार्ड अभिव्यक्ति से मेल खाते हैं।

हालांकि, मैं खोल के माध्यम से हमेशा की तरह लिनक्स find आदेश का उपयोग की तुलना में यह कम सुविधाजनक लगता है:

# Find all sources 
my_sources:=$(shell find -iname '*.cpp') 
# Make targets out of them 
OBJS=$(my_sources:%.cpp=%.o) 

ढूँढें से बनाने के wildcard builtin अधिक शक्तिशाली है। आप अन्य शेल क्षमताओं का भी उपयोग करना चाहेंगे, जैसे पाइपलाइन, उदाहरण के लिए, find के आउटपुट फ़िल्टर करने के लिए (यदि मेक filter-out फ़ंक्शन पर्याप्त नहीं है)। या इस तरह कुछ, अत्यधिक चर से बचने के लिए:

OBJS:=$(shell find -iname '*.cpp' | sed 's/\.cpp$/.o/') 

आप इसे नाम दें!

+0

ओएस एक्स पर, आपको खोज कमांड के बाद वर्तमान निर्देशिका जोड़नी होगी। उदा। 'ढूंढें। -नाम '*। सीपीपी'। – deepak

0

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

foobar: $(shell ls Lib/*.cpp) $(shell ls GameCode/*.cpp) $(shell ls Moot/Moot/*.cpp) $(shell ls Moot/Impl/*cpp) 
    g++ -o [email protected] $^ 

clean: 
    rm foobar $(shell ls Lib/*.o) $(shell ls GameCode/*.o) $(shell ls Moot/Moot/*.o) $(shell ls Moot/Impl/*o) 

VPATH जानकारी की जरूरत नहीं है, सीपीपी के लिए ओ के प्रतिस्थापन के रूप में जा सकते हैं निहित नियम के ओवरराइड। इसके अतिरिक्त, specfified निर्देशिका में देखने के लिए खोजने के बजाय ls का उपयोग नहीं, और केवल अंदर।

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