2009-12-26 11 views
14

मैं एक कंपाइलर के लिए एक (gmake) मेकफ़ाइल लिखना चाहता हूं - जीसीसी के विपरीत - सभी आउटपुट फ़ाइलों को एक विशिष्ट निर्देशिका में रखता है। दुर्भाग्यवश यह व्यवहार बदला नहीं जा सकता है।मेकफ़ाइल, पैटर्न-नियम और निर्देशिका

मेरे स्रोत एकाधिक निर्देशिका में हैं। मैं पैटर्न-नियम कैसे लिखूं जो मुझे स्रोतों को संकलित करने देता है।

ठीक है, यह थोड़ा अस्पष्ट है। यहाँ एक उदाहरण है। मेरे सूत्रों यह पसंद कर सकते हैं देखने के लिए:

./folder1/foo.c 
./folder2/bar.c 

और आउटपुट फ़ाइलें इस तरह खत्म हो जाएगा:

./obj/foo.obj 
./obj/bar.obj 

कैसे मेरा नियम मेरी सूत्रों की तरह लग रहे संकलित करने के लिए करना चाहिए?

%.obj : %.c 
    $(COMPILER) -c $< 

काम नहीं करेगा।

कोई विचार? मैं एक स्रोत फ़ाइल के लिए एक अंतर्निहित नियम से बचना चाहते हैं ...

+0

आप उस के लिए 'VPATH' का उपयोग कर सकते हैं = या = आप 'फ़ोल्डर 1/मेकफ़ाइल' और 'ओबीजे/मेकफ़ाइल' बना सकते हैं जिसमें '/fffof.inc' शामिल होगा, जिसमें सामान्य नियम होना चाहिए (उदाहरण के लिए एक जो आपने दिया है)। –

उत्तर

23

मेरा कुछ Makefile से निकाला गया:

OBJS := $(sort $(patsubst %.cpp,$(OBJECT_DIRECTORY)/%.o,$(patsubst %.c,$(OBJECT_DIRECTORY)/%.o,$(notdir $(SRCS)))))

कहाँ वस्तु निर्देशिका के लिए OBJECT_DIRECTORY अंक और SRCS स्रोत की सूची है फाइलें (जिसे आप $(wildcard) का उपयोग करके भी पॉप्युलेट कर सकते हैं)।

फिर Makefile में, मेरे पास है:

define define_compile_rules 
$(OBJECT_DIRECTORY)/%.o: $(1)%.c 
    @echo " + Compiling '$$<'" 
    @mkdir -p $$(@D) 
    $(CC) $$(CFLAGS) -o [email protected] -c $$< 
endef 

$(foreach directory,$(sort $(dir $(SRCS))),$(eval $(call define_compile_rules,$(directory)))) 

the $(eval) function देखें।

+1

eval और foreach फ़ंक्शन gmake की गंभीर रूप से कम उपयोग वाली विशेषता है। – JesperE

+0

शायद यह जीएनयू बनाने से पहले कीड़े की वजह से 3.81 बनाओ? –

+0

अच्छा लग रहा है। मैं इसे आज़मा दूंगा ... –

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