रेगेक्स पैटर्न मिलान के साथ स्वचालित मेक सिस्टम

मैं रिपोर्ट बनाने के लिए जीएनयू बनाने का उपयोग करता हूं (स्रोत के लिए लाटेक्स, आंकड़ों के लिए पायथन, आदि)। लक्ष्यों के लिए, मैं बड़े पैमाने पर पैटर्न मिलान का उपयोग करता हूं, उदाहरण के लिए:

 all : sample1_test1.png sample2_test1.png sample2_test.png

 sample%_test1.png : sample%.dat
    python gen_figure.py $< [email protected] --test 1

 sample%_test2.png : sample%.dat
    python gen_figure.py $< [email protected] --test 2

अब, नियमों को सरल बनाने के लिए मैं कई पैटर्न समूहों (जैसे रेगेक्स समूह) का उपयोग करना चाहता हूं और बिल्ड नियम में अलग-अलग मैचों का उपयोग करना चाहता हूं, उदाहरण के लिए:

 all : sample1_test1.png sample2_test1.png sample2_test.png

 sample(?P[0-9]+)_test(?P[0-9]+).png : sample$().dat
     python gen_figure.py $< [email protected] --test $()

(वाक्यविन्यास मनमाने ढंग से है, लेकिन मुद्दा यह है कि मैं नमूना और test नामक दो अलग-अलग मिलान समूहों को परिभाषित कर सकता हूं और उन्हें अपनी स्क्रिप्ट के पैरामीटर के रूप में उपयोग कर सकता हूं)।

मैं इसे बनाने या अन्य निर्माण प्रणाली (वाफ, स्कॉन्स इत्यादि) में कैसे प्राप्त करूं?

1

1 उत्तर

जीएनयू बनाने में इसे करने के लिए, आप जीएनयू द्वारा समर्थित दो अलग-अलग "मेटाप्रोग्रामिंग" मॉडल में से एक का उपयोग कर सकते हैं:

  1. स्वत: जेनरेट की गई फ़ाइलें शामिल हैं। अपने मुख्य मेकफ़ाइल में, -clude gener.mk जोड़ें, फिर लक्ष्य जेनरेट.एमके (शायद मेकफ़ाइल को एक शर्त के रूप में सूचीबद्ध करें) के साथ मेकफ़ाइल नियम लिखें ), जहां नुस्खा लक्ष्य की सूची के आधार पर उचित लक्ष्य उत्पन्न करता है। हालांकि आप अपनी लक्षित सूचियां बनाने के लिए खोल की पूर्ण शक्ति रखते हैं। हर बार जब आप मेकफ़ाइल संशोधित करते हैं, तो शामिल फ़ाइल को फिर से बनाया जाएगा, फिर जीएनयू मेक स्वचालित रूप से फिर से निष्पादित हो जाएगा, इसलिए आपको कुछ भी अतिरिक्त करने की आवश्यकता नहीं है।

  2. जीएनयू मेक का उपयोग करें $ (eval ...) फ़ंक्शन, शायद $ (कॉल ...) और $ (foreach। ..) , स्वचालित रूप से नियमों का मूल्यांकन करने के लिए। ऐसा करने के लिए आप define ... enddef का उपयोग करके नियम के लिए "टेम्पलेट" परिभाषित करते हैं, जहां चर स्थापित किए जाते हैं, जहां आप तर्क प्रदान करना चाहते हैं, फिर $ (कॉल ...) उन्हें तत्काल करने के लिए, $ (eval ...) का उपयोग कॉल के परिणाम पर करें, और प्रत्येक लक्ष्य के लिए इसे एक लूप में करें। कुछ ऐसा: $ (foreach टी, $ (TARGETS), $ ($ eval (कॉल डिफिनरयूएल, $ (टी)))

यहां विधि 1 का एक उदाहरण दिया गया है मान लीजिए कि आपके मेकफ़ाइल में यह पूर्वनिर्धारित सामग्री है:

TESTS := sample1_test1.png sample2_test1.png sample2_test.png

फिर आप उपरोक्त की तरह कुछ पाने के लिए इस मेकफ़ाइल का उपयोग कर सकते हैं:

all: $(TESTS)

-include generated.mk

generated.mk : Makefile
        @rm -f '[email protected]'
        @for t in $(TESTS); do \
            eval `echo "$$t" | sed 's/^sample\([0-9]*\)_test\([0-9]*\).*/sample=\1 test=\2/'`; \
            echo "$$t : sample$$sample.dat ; python gen_figure.py \$$< \[email protected] --test $$test" >> '[email protected]'; \
         done

ध्यान दें मैंने इसे अपने सिर के ऊपर से लिखा है लेकिन मुझे लगता है कि यह काम करेगा।

1
जोड़ा
मॉडल 1 में, मुझे अपने रेगेक्स लक्ष्य कहां लिखना चाहिए (नियम के भीतर gener.mk उत्पन्न करने के लिए?)
जोड़ा लेखक btel, स्रोत
उदाहरण के लिए धन्यवाद - यह बहुत समझाता है। मैं वास्तविक लक्ष्य के साथ रेगेक्स लक्ष्यों को प्रतिस्थापित करने के लिए पूर्व-प्रसंस्करण मेकफ़ाइल के बारे में सोच रहा था। मुझे लगता है कि मुझे पता है कि अब कहां देखना है। धन्यवाद!
जोड़ा लेखक btel, स्रोत
आप आरईजीएक्स लक्ष्यों को सभी में उपयोग नहीं कर सकते हैं। यह समर्थित नहीं है। लेकिन आप जेनरेट मेकफ़ाइल में नियमों के सेट में लक्ष्य की अपनी सरल सूची का विस्तार करने के लिए शैल टूल का उपयोग कर सकते हैं। आपके प्रश्न में सभी आवश्यक विवरण नहीं हैं लेकिन मैं एक उदाहरण जोड़ूंगा।
जोड़ा लेखक MadScientist, स्रोत