कभी-कभी आपको अलग-अलग लक्ष्य ओएस पर चलने में सक्षम होने के लिए मेकफिल की आवश्यकता होती है और आप चाहते हैं कि बिल्ड जल्दी विफल हो जाए यदि एक आवश्यक निष्पादन योग्य PATH
विफल होने से पहले लंबे समय तक चलने के बजाय है।
इंजीनियरचुआन द्वारा प्रदान किए गए उत्कृष्ट समाधान को एक लक्ष्य बनाने की आवश्यकता है । हालांकि, यदि आपके पास परीक्षण करने के लिए कई निष्पादन योग्य हैं और आपके मेकफाइल के पास कई स्वतंत्र लक्ष्य हैं, जिनमें से प्रत्येक को परीक्षणों की आवश्यकता होती है, तो प्रत्येक लक्ष्य को एक निर्भरता के रूप में परीक्षण लक्ष्य की आवश्यकता होती है। जब आप एक समय में एक से अधिक लक्ष्य बनाते हैं, तो बहुत अधिक अतिरिक्त टाइपिंग के साथ-साथ प्रसंस्करण समय भी बनता है।
0xf द्वारा प्रदान किया गया समाधान एक लक्ष्य बनाए बिना एक निष्पादन योग्य के लिए परीक्षण कर सकता है। यह बहुत सारे टाइपिंग और निष्पादन के समय को बचाता है जब कई लक्ष्य होते हैं जिन्हें अलग-अलग या एक साथ बनाया जा सकता है।
बाद के समाधान के लिए मेरा सुधार which
निष्पादन योग्य ( where
विंडोज में) का उपयोग करना है , बजाय इसके कि --version
प्रत्येक निष्पादन योग्य में एक विकल्प होने पर भरोसा करना , सीधे जीएनयू में ifeq
निर्देश बनाना , एक नए चर को परिभाषित करने के बजाय, और जीएनयू का उपयोग करने के लिए। error
यदि आवश्यक निष्पादन योग्य नहीं है, तो निर्माण को रोकने के लिए कार्य करें ${PATH}
। उदाहरण के लिए, lzop
निष्पादन योग्य के लिए परीक्षण करने के लिए :
ifeq (, $(shell which lzop))
$(error "No lzop in $(PATH), consider doing apt-get install lzop")
endif
यदि आपके पास जांच करने के लिए कई निष्पादन योग्य हैं, तो आप निष्पादन योग्य के foreach
साथ एक फ़ंक्शन का उपयोग करना चाहते हैं which
:
EXECUTABLES = ls dd dudu lxop
K := $(foreach exec,$(EXECUTABLES),\
$(if $(shell which $(exec)),some string,$(error "No $(exec) in PATH")))
:=
आरएचएस अभिव्यक्ति के तत्काल मूल्यांकन को मजबूर करने के लिए आवश्यक असाइनमेंट ऑपरेटर के उपयोग पर ध्यान दें । यदि आपका मेकफाइल बदलता है PATH
, तो ऊपर की अंतिम पंक्ति के बजाय आपको आवश्यकता होगी:
$(if $(shell PATH=$(PATH) which $(exec)),some string,$(error "No $(exec) in PATH")))
यह आपको इसके समान आउटपुट देना चाहिए:
ads$ make
Makefile:5: *** "No dudu in PATH. Stop.