2009-10-27 10 views
42

में वाइल्डकार्ड लक्ष्य मैं फॉलोइंग मेकफ़ाइल लक्ष्य कैसे बना सकता हूं?मेकफ़ाइल

$(GRAPHDIR)/Complex.png: $(GRAPHDIR)/Complex.dot 
     dot $(GRAPHDIR)/Complex.dot -Tpng -o $(GRAPHDIR)/Complex.png 

$(GRAPHDIR)/Simple.png: $(GRAPHDIR)/Simple.dot 
     dot $(GRAPHDIR)/Simple.dot -Tpng -o $(GRAPHDIR)/Simple.png 

$(GRAPHDIR)/IFileReader.png: $(GRAPHDIR)/IFileReader.dot 
     dot $(GRAPHDIR)/IFileReader.dot -Tpng -o $(GRAPHDIR)/IFileReader.png 

$(GRAPHDIR)/McCabe-linear.png: $(GRAPHDIR)/McCabe-linear.dot 
     dot $(GRAPHDIR)/McCabe-linear.dot -Tpng -o $(GRAPHDIR)/McCabe-linear.png 

graphs: $(GRAPHDIR)/Complex.png $(GRAPHDIR)/Simple.png $(GRAPHDIR)/IFileReader.png $(GRAPHDIR)/McCabe-linear.png 

-

GNU Make 3.81 का उपयोग करना।

उत्तर

45

अवधारणा को पैटर्न नियम कहा जाता है। आप इसके बारे में GNU make manual में पढ़ सकते हैं।

$(GRAPHDIR)/%.png: $(GRAPHDIR)/%.dot 
     dot $< -Tpng -o [email protected] 

graphs: $(patsubst %,$(GRAPHDIR)/%.png, Complex Simple IFileReader McCabe)\ 

या सिर्फ

%.png: %.dot 
     dot $< -Tpng -o [email protected] 

graphs: $(patsubst %,$(GRAPHDIR)/%.png, Complex Simple IFileReader McCabe) 

उन्नत सामान: यह वहाँ पुनरावृत्ति है कि वहाँ की सूचना के लिए अजीब है ...

PNG_pattern=$(GRAPHDIR)/%.png 

$(PNG_pattern): $(GRAPHDIR)/%.dot 
     dot $< -Tpng -o [email protected] 

graphs: $(patsubst %,$(PNG_pattern), Complex Simple IFileReader McCabe) 
+2

"% .png:% .dot" के बारे में कैसे? – Beta

+1

@ बीटा, ठीक है, डुनो। मैं आमतौर पर उन परिस्थितियों से निपटता हूं जहां प्रसंस्करण निर्देशिका-विशिष्ट है, इसलिए मैंने इसका उपयोग अभी किया है। :) –

8

मुझे लगता है कि आप कुछ पैटर्न नियम चाहते हैं । इसे आज़माएं

TARGETS = $(GRAPHDIR)/Complex.png \ 
      $(GRAPHDIR)/Simple.png \ 
      $(GRAPHDIR)/IFileReader.png \ 
      $(GRAPHDIR)/McCabe-linear.png 

%.png : %.dot 
     dot $^ -Tpng -o [email protected] 

graphs: $(TARGETS) 
+2

और अधिक प्रबंधनीय: 'NAMES: = कॉम्प्लेक्स सरल IFileReader McCabe-linear' और फिर' लक्ष्य: = $ (NAMES:% = $ (GRAPHDIR) \%। Png' –

17

शायद ज़रुरत पड़े तो आप वास्तव में वर्तमान निर्देशिका के भीतर हर .dot के लिए एक .PNG उत्पन्न करना चाहते हैं:

%.png : %.dot 
    dot -Tpng -o [email protected] $< 

all: $(addsuffix .png, $(basename $(wildcard *.dot))) 

मैं @Pavel से जवाब पढ़ने के बाद इस Makefile के साथ आया था।

+0

वेंट बेसनाम ने GRAPHDIR को काट दिया? – monokrome

+1

नहीं: दस्तावेज़ों से: "$ (बेसनाम नाम ...) नामों में प्रत्येक फ़ाइल नाम के प्रत्यय के अलावा सभी को निकालता है। अगर फ़ाइल नाम में एक अवधि होती है, तो बेसनाम प्रत्येक अवधि (और इसमें शामिल नहीं) तक शुरू होता है। निर्देशिका भाग को अनदेखा किया जाता है। यदि कोई अवधि नहीं है, तो बेसनाम संपूर्ण फ़ाइल नाम है। उदाहरण के लिए, $ (बेसनाम नाम/foo.c src-1.0/बार हैक्स) परिणाम 'src/foo src-1.0/बार हैक्स '। " – Miguel