पर मौजूद हो सकता है या नहीं हो सकता है, मैं एक ऐसा लक्ष्य जोड़ना चाहता हूं जो envdir के साथ प्रोग्राम चलाता हो।
ENVDIR := $(shell command -v envdir)
serve: | $(ENVDIR)
$(ENVDIR) /usr/local/myservice/env python -m SimpleHTTPServer 8000
विचार यह है कि यदि उपयोगकर्ता को envdir इंस्टॉल नहीं है, तो यह उनके लिए इंस्टॉल करेगा। मुझे पाइप चरित्र की आवश्यकता है क्योंकि मैं हमेशा इसे चलाने के लिए नहीं चाहता; मैं बस इसके किसी संस्करण को उपस्थित होना चाहता हूं। दुर्भाग्य से, मैं बहुत अच्छी तरह से भविष्यवाणी नहीं कर सकता जहां envdir स्थापित किया जाएगा।
UNAME := $(shell uname)
$(ENVDIR):
ifeq ($(UNAME), Darwin)
brew install daemontools
endif
ifeq ($(UNAME), Linux)
sudo apt-get install daemontools
endif
# Add other operating systems here as appropriate...
दूसरी समस्या मैं में चलाने कि अगर उपयोगकर्ता envdir स्थापित नहीं है, चर रिक्त स्ट्रिंग का आकलन करती है। तो ए) मेरा "इंस्टॉल envdir" लक्ष्य वास्तव में नहीं चलता है, और बी) इसे चलाने के बाद, $ (ENVDIR) अभी भी खाली स्ट्रिंग पर सेट है, इसलिए इसे सेवा लक्ष्य में लोड करना काम नहीं करता है।
क्या कोई तरीका है ए) चलाने के लिए इंस्टॉल लक्ष्य प्राप्त करें, भले ही ENVDIR को अपरिभाषित किया गया हो, और बी) "इंस्टॉल envdir" लक्ष्य चलाने के अंत में चर के मान को फिर से परिभाषित करने के लिए?
कृपया "एनवीडीआईआर का उपयोग क्यों कर रहे हैं" के साथ प्रतिक्रिया न दें - मैं इस समस्या में विभिन्न प्रकार की विभिन्न बाइनरी के साथ दौड़ता हूं, यह सिर्फ एक आसानी से साझा करने योग्य उदाहरण होता है।
आप उन मामलों के बीच अंतर करने के लिए सशर्त उपयोग क्यों नहीं करते हैं जहां 'envdir' पहले से स्थापित है और जहां यह नहीं है? 'ifeq ($ (ENVDIR),) ... और ... endif' शायद इसे बना सकता है। और 'envdir' इंस्टॉल रेसिपी के अंत में, आप 'ENVDIR' चर के मूल्य को बदलने की कोशिश करने के बजाय बस फिर से आवेदक कर सकते हैं (मुझे पता है, * रिकर्सिव मेक खराब है *, लेकिन बुरी चीजें कभी-कभी बेहद उपयोगी होती हैं)। –