2010-01-23 10 views
15

मैं मेकफ़ाइल का उपयोग कर रहा हूं।फोर्स मेकफ़ाइल लक्ष्य बनाने से पहले स्क्रिप्ट निष्पादित करने के लिए

हालांकि, एक आदेश (zsh स्क्रिप्ट) है जिसे मैं किसी भी लक्ष्य को निष्पादित करने से पहले निष्पादित करना चाहता हूं। मैं यह कैसे कर सकता हूं?

धन्यवाद!

उत्तर

19

कोड निष्पादित करने के लिए लक्ष्य कर रहे हैं इससे पहले कि कई तकनीकों हैं बनाने बनाने के बनाया। आपको कौन सा चुनना चाहिए, उस पर निर्भर करता है कि आप क्या करना चाहते हैं, और आप इसे क्यों करना चाहते हैं। (Zsh स्क्रिप्ट क्या करती है? आपको इसे निष्पादित क्यों करना है?)

आप या तो जॉन सुझावों की तरह कर सकते हैं; पहली निर्भरता के रूप में zsh स्क्रिप्ट को रखकर। आपको zsh लक्ष्य को .PHONY के रूप में चिह्नित करना चाहिए जब तक कि यह वास्तव में zsh नाम की फ़ाइल उत्पन्न नहीं करता है।

एक अन्य समाधान (जीएनयू में बनाने के लिए, कम से कम) एक चर काम के हिस्से के रूप $(shell ...) समारोह आह्वान करने के लिए है:

ZSH_RESULT:=$(shell zsh myscript.zsh) 

यह जैसे ही makefile पार्स किया गया है स्क्रिप्ट को निष्पादित करेगा, और से पहले कोई भी लक्ष्य निष्पादित किए जाते हैं। यदि आप मेकफ़ाइल को पुनरावर्ती रूप से आमंत्रित करते हैं तो यह स्क्रिप्ट को भी निष्पादित करेगा।

+2

नोट, '$ (shell ...)' बनाता है जब भी -n, --just-print, --dry-run, --recon विकल्प दिया जाता है। – thejoshwolfe

+0

अच्छा जवाब। बाहर निकलने पर आदेश चलाने का कोई तरीका है? यहां एक प्रश्न पोस्ट किया गया: http://stackoverflow.com/questions/20582006/force-makefile-to-execute-script-after-building-any-target-just-before-exiting – PonyEars

9

बस ऐसे ही

foo.obj : zsh foo.c 
    rule for compileing foo.c 

zsh: 
    rule for running zsh script. 

या वैकल्पिक रूप से अन्य लक्ष्यों में से एक के एक dependancy, अपना पहला लक्ष्य पर निर्भर

goal: zsh foo.exe 
+2

पहले समाधान के साथ समस्या यह है कि यह हर बार पुनर्निर्मित करने के लिए 'foo.obj' को मजबूर करेगा, भले ही' foo.c' अपडेट नहीं किया गया हो। दूसरी समस्या यह है कि अब आप अपने मेकफ़ाइल को एकाधिक लक्ष्यों के साथ कॉल नहीं कर सकते हैं। –

2

मेकैमडोज़ल और डबल कॉलन नियमों का उपयोग करके मेकफ़ाइल में प्रीप्रोकैसिंग और पोस्टप्रोकैसिंग दोनों के लिए समाधान।

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..." 
संबंधित मुद्दे

 संबंधित मुद्दे