बनाना: प्रत्येक शर्त के लिए एक क्रिया निष्पादित करें

मैं अपने मेकफ़ाइल में इस तरह का नियम बनाना चाहता हूं:

log: test_A test_B
    ./test_A >> [email protected]
    ./test_B >> [email protected]

लेकिन test_A और test_B $ (TESTS) चर का हिस्सा हैं।

तो, जीएनयू/मेक में प्रत्येक शर्त के लिए एक क्रिया (यहां: प्रोग्राम को कॉल करें) करना संभव है?

नोट: मैं मेकफ़ाइल नियम को अपनी पूर्व शर्त कैसे निष्पादित करूं ? इस समस्या को पूरी तरह से हल नहीं करता है, क्योंकि लक्ष्य लॉग आवश्यक है ( लॉग करें )।

6

1 उत्तर

अनिवार्य रूप से आप पूर्व शर्त पर लूप करना चाहते हैं। ऐसा करने का स्पष्ट तरीका खोल के लिए शिकार करना है:

log: test_A test_B
        for f in $^; do ./$$f; done

या आप लूप को जीएनयू के रूप में लिख सकते हैं foreach लूप बनाएं, हालांकि आपको सावधान रहना होगा कि लूप के शरीर से होने वाले आदेश अलग-अलग लाइनों पर दिखाई देते हैं ( परिभाषित करें ) या एक खोल टर्मिनेटर के साथ समाप्त कर दिया जाता है (यानी, अर्द्ध-कोलन, जो आसान है):

log: test_A test_B
        $(foreach f,$^,./$(f);)

आखिरकार, इस मामले में आप इसे अधिक संक्षिप्त रूप से और अधिक अस्पष्ट रूप से लिख सकते हैं क्योंकि प्रत्येक आइटम पर एक पैटर्न प्रतिस्थापन को लूप किया जा सकता है:

log: test_A test_B
        $(patsubst %,./%;,$^)

(मुझे यकीन है कि आप आउटपुट रीडायरेक्शन और $ (टेस्ट्स) वैरिएबल को उचित के रूप में जोड़ सकते हैं।)

17
जोड़ा
यदि यह आपके लॉग नियम के लिए आदेश है, तो $ (shell ...) चीजों को घटाना है: नियम के लिए आदेश खाली होंगे, और <�कोड > परीक्षण _? निष्पादन आदेशों को समझने के बजाए (आदेशों को निष्पादित करने के बजाय) के उपज के रूप में होगा। दार्शनिक रूप से गलत, और - अधिक व्यावहारिक रूप से - आपके test _? स्क्रिप्ट्स में से किसी एक की विफलता को पकड़ने के लिए विस्तार करना असंभव है। (लेकिन फिर भी ऐसा लगता है कि आप इस उत्तर को स्वीकार के रूप में चिह्नित करना चाहते हैं ...)
जोड़ा लेखक John Marshall, स्रोत
Test_A के लिए एक बार और test_B के लिए एक बार इस लूप को दो बार नहीं? मेरे पास एक समान समस्या है और बहुत अजीब व्यवहार कर रहा है।
जोड़ा लेखक Jaseem, स्रोत
आपके उत्तर के लिए धन्यवाद, यह पुष्टि करता है कि मैंने क्या समाप्त किया: $ (foreach test, $ ^, $ (shell ./$(test) >> $ @))
जोड़ा लेखक CJlano, स्रोत