2009-10-21 8 views
7

हमारा मेकअप फ़ाइल इस तरह एक स्थिर पैटर्न शासन के साथ संकलित ग स्रोत फ़ाइलें अलग प्रत्यय कर सकते हैं एक उद्देश्य-सीएम फ़ाइल में फ़ाइलें। कंपाइलर को आमंत्रित करना दोनों स्रोत प्रकारों के लिए समान है, इसलिए मैं एक ही नियम का उपयोग करना चाहता हूं और इसे अधिक लचीला होने के लिए बस ट्विक करना चाहता हूं। मैं विकल्प वैरिएबल को नहीं बदलूंगा क्योंकि इसका उपयोग लिंकिंग चरण आदि के लिए भी किया जाता है।gnu मेकअप में, एक स्थिर पैटर्न शासन में आवश्यक शर्तें

क्या .c और .m फ़ाइलों दोनों को समायोजित करने के लिए नियम को अधिक लचीला बनाने का कोई तरीका है?

धन्यवाद

उत्तर

1

वास्तव में सिर्फ नकल नहीं करने के लिए

$(OBJECTS): %.o: %.m 
    $(CC) $< $(C_OPTIONS) -c -o [email protected] 
+0

यह त्रुटियां उत्पन्न करेगा। पहले उदाहरण के लिए कोई '% .m' फ़ाइलें नहीं मिलेगी (त्रुटि!), और दूसरी के लिए - कोई'% .c' (कोई अन्य त्रुटि नहीं!) –

+0

क्षमा करें केवल तभी दिखता है जब वहां नहीं है। सी फ़ाइल तो यह% .c नियम – Mark

-1

एक ही संकलक करने के लिए कॉल सिर्फ एक खुश अवसर है। आम तौर पर आप $(CC) के साथ उद्देश्य-सी कोड संकलित नहीं करते हैं। यह सिर्फ अजीब लगता है।

लेकिन जब से तुम एक कठोर तरीके से जाना है, मुझे क्या करना यह सही समाधान है, जहां आप दो अलग अलग $(OBJECTS) की तरह चर में सी लक्ष्य से उद्देश्य सी लक्ष्यों को अलग पोस्ट नहीं होगा और (दो नियमों करें कि आप जो वास्तव में करना चाहिए)। बहुत पकाऊ। इसके बजाय, एक हैक ले लो!

OBJC_FILES:=$(subst $(wildcard *.m)) 

real_name = `(test -h $(1) && readlink $(1)) || echo $(1)` 

$(OBJECTS): %.o: %.c 
    $(GCC) $< $(C_OPTIONS) -c -o $(call real_name,[email protected]) 

$(OBJC_FILES): %.c: %.m 
    ln -s $< [email protected] 

और भगवान इसे बनाए रखने में मदद करते हैं!

बीटीडब्ल्यू, यह स्पष्ट रूप से काम नहीं करेगा यदि आपकी एम-फाइलें उत्पन्न होती हैं।

7

हम इसे चीजों की सूची में या तो जोड़ सकते हैं, आसानी से करने में सक्षम होना चाहिए, लेकिन नहीं है। प्रत्येक ऑब्जेक्ट के लिए एक अलग नियम बनाने के लिए "eval" का उपयोग करके इसे करने का एक तरीका यहां दिया गया है।

 
define RULE_template 
$(1): $(wildcard $(basename $(1)).[cm]) 
endef 

OBJECTS = foo.o bar.o baz.o 

$(foreach obj,$(OBJECTS),$(eval $(call RULE_template,$(obj)))) 

$(OBJECTS): 
    $(CC) $< $(C_OPTIONS) -c -o [email protected] 

ध्यान दें कि यह स्रोत फ़ाइलें पहले से ही विद्यमान इससे पहले कि आप सुनिश्चित चलाने पर निर्भर करता है (foo.c या foo.m, लेकिन दोनों नहीं)। यदि आप एक ही चरण में उन स्रोतों को उत्पन्न कर रहे हैं, तो यह काम नहीं करेगा।

यहां एक कम चालाक, अधिक मजबूत विधि है।

 
CPP_OBJECTS = foo.o bar.o 
OBJECTIVE_OBJECTS = baz.o 
OBJECTS = $(CPP_OBJECTS) $(OBJECTIVE_OBJECTS) 

$(CPP_OBJECTS): %.o: %.c 

$(OBJECTIVE_OBJECTS): %.o: %.m 

$(OBJECTS): 
    $(CC) $< $(C_OPTIONS) -c -o [email protected] 

संपादित करें: ठीक किया OBJECTS काम, जोनाथन Leffler के लिए धन्यवाद।

+1

का आह्वान नहीं करेगा मैं अधिक मजबूत विधि से सहमत हूं - मैं इसका उपयोग करूंगा। लेकिन ओबीजेक्ट्स = मैक्रो को आरएचएस पर कुछ $ (...) की जरूरत है। –

+0

एएके! तुम सही हो, मुझे और सावधान रहना चाहिए था। – Beta

+0

अपना उदाहरण बनाना (दूसरा वाला) केवल पहली फ़ाइल foo.o उत्पन्न हो रहा है। क्या समस्या है? – BogdanSikach

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