मैं मेकफ़ाइल का उपयोग कर रहा हूं।फोर्स मेकफ़ाइल लक्ष्य बनाने से पहले स्क्रिप्ट निष्पादित करने के लिए
हालांकि, एक आदेश (zsh स्क्रिप्ट) है जिसे मैं किसी भी लक्ष्य को निष्पादित करने से पहले निष्पादित करना चाहता हूं। मैं यह कैसे कर सकता हूं?
धन्यवाद!
मैं मेकफ़ाइल का उपयोग कर रहा हूं।फोर्स मेकफ़ाइल लक्ष्य बनाने से पहले स्क्रिप्ट निष्पादित करने के लिए
हालांकि, एक आदेश (zsh स्क्रिप्ट) है जिसे मैं किसी भी लक्ष्य को निष्पादित करने से पहले निष्पादित करना चाहता हूं। मैं यह कैसे कर सकता हूं?
धन्यवाद!
कोड निष्पादित करने के लिए लक्ष्य कर रहे हैं इससे पहले कि कई तकनीकों हैं बनाने बनाने के बनाया। आपको कौन सा चुनना चाहिए, उस पर निर्भर करता है कि आप क्या करना चाहते हैं, और आप इसे क्यों करना चाहते हैं। (Zsh स्क्रिप्ट क्या करती है? आपको इसे निष्पादित क्यों करना है?)
आप या तो जॉन सुझावों की तरह कर सकते हैं; पहली निर्भरता के रूप में zsh स्क्रिप्ट को रखकर। आपको zsh
लक्ष्य को .PHONY
के रूप में चिह्नित करना चाहिए जब तक कि यह वास्तव में zsh
नाम की फ़ाइल उत्पन्न नहीं करता है।
एक अन्य समाधान (जीएनयू में बनाने के लिए, कम से कम) एक चर काम के हिस्से के रूप $(shell ...)
समारोह आह्वान करने के लिए है:
ZSH_RESULT:=$(shell zsh myscript.zsh)
यह जैसे ही makefile पार्स किया गया है स्क्रिप्ट को निष्पादित करेगा, और से पहले कोई भी लक्ष्य निष्पादित किए जाते हैं। यदि आप मेकफ़ाइल को पुनरावर्ती रूप से आमंत्रित करते हैं तो यह स्क्रिप्ट को भी निष्पादित करेगा।
बस ऐसे ही
foo.obj : zsh foo.c
rule for compileing foo.c
zsh:
rule for running zsh script.
या वैकल्पिक रूप से अन्य लक्ष्यों में से एक के एक dependancy, अपना पहला लक्ष्य पर निर्भर
goal: zsh foo.exe
पहले समाधान के साथ समस्या यह है कि यह हर बार पुनर्निर्मित करने के लिए 'foo.obj' को मजबूर करेगा, भले ही' foo.c' अपडेट नहीं किया गया हो। दूसरी समस्या यह है कि अब आप अपने मेकफ़ाइल को एकाधिक लक्ष्यों के साथ कॉल नहीं कर सकते हैं। –
मेकैमडोज़ल और डबल कॉलन नियमों का उपयोग करके मेकफ़ाइल में प्रीप्रोकैसिंग और पोस्टप्रोकैसिंग दोनों के लिए समाधान।
MAKECMDGOALS कमांड लाइन पर सूचीबद्ध लक्ष्य हैं।
पहला चरण कमांड लाइन, से पहले और अंतिम लक्ष्य प्राप्त करना है या यदि कोई लक्ष्य सूचीबद्ध नहीं है, तो डिफ़ॉल्ट लक्ष्य का उपयोग करें।
ifneq ($(MAKECMDGOALS),)
FIRST_GOAL := $(word 1, $(MAKECMDGOALS))
LAST_GOAL := $(word $(words $(MAKECMDGOALS)), $(MAKECMDGOALS))
else
FIRST_GOAL := all
LAST_GOAL := all
endif
डबल कॉलन नियम क्रमशः उसी लक्ष्य के लिए एकाधिक व्यंजनों को अनुमति देते हैं। आपको डबल कमांड नियमों के लिए सभी कमांड लाइन लक्ष्यों को बदलना होगा।
#Dummy rule to set the default
.PHONY: all
all ::
#Preprocessing
$(FIRST_GOAL) ::
echo "Starting make..."
all :: normal_prerequistes
normal_recipe
other_stuff
#Postprocessing
$(LAST_GOAL) ::
echo "All done..."
नोट, '$ (shell ...)' बनाता है जब भी -n, --just-print, --dry-run, --recon विकल्प दिया जाता है। – thejoshwolfe
अच्छा जवाब। बाहर निकलने पर आदेश चलाने का कोई तरीका है? यहां एक प्रश्न पोस्ट किया गया: http://stackoverflow.com/questions/20582006/force-makefile-to-execute-script-after-building-any-target-just-before-exiting – PonyEars