वास्तव में आप सही हैं: यह मेक की एक और मिसाल है। एक संभावित समाधान होगा:
.PHONY : clearscr fresh clean all
all :
compile executable
clean :
rm -f *.o $(EXEC)
fresh : clean clearscr all
clearscr:
clear
कॉल करके make fresh
आप पहले clean
लक्ष्य प्राप्त करते हैं , फिर clearscreen
कौन चलाता है clear
और आखिर में all
कौन काम करता है।
EDIT 4 अगस्त
समानांतर के मामले में क्या होता है मेक -j
ऑप्शन के साथ? आदेश को ठीक करने का एक तरीका है। मेक मैनुअल से, धारा 4.2:
कभी-कभी, हालांकि, आपके पास एक ऐसी स्थिति होती है, जिसमें आप उन नियमों में से एक को निष्पादित करने के लिए लक्ष्य को मजबूर किए बिना निर्दिष्ट किए जाने वाले नियमों पर एक विशिष्ट आदेश देना चाहते हैं। उस स्थिति में, आप केवल ऑर्डर पूर्वापेक्षाएँ निर्धारित करना चाहते हैं। आदेश-केवल पूर्वापेक्षाएँ पूर्वापेक्षा सूची में एक पाइप प्रतीक (!) रखकर निर्दिष्ट की जा सकती हैं: पाइप प्रतीक के बाईं ओर कोई भी पूर्वापेक्षाएँ सामान्य हैं; किसी भी आवश्यक अधिकार के लिए केवल आदेश हैं: लक्ष्य: सामान्य-पूर्वापेक्षाएँ | आदेश-केवल-आवश्यक शर्तें
सामान्य पूर्वापेक्षाएँ अनुभाग बेशक खाली हो सकते हैं। इसके अलावा, आप अभी भी एक ही लक्ष्य के लिए किसी और चीज की कई लाइनें घोषित कर सकते हैं: वे उचित रूप से संलग्न हैं। ध्यान दें कि यदि आप एक ही फ़ाइल को सामान्य और ऑर्डर-ऑर्डर दोनों के रूप में घोषित करते हैं, तो सामान्य पूर्वापेक्षा पूर्वता लेता है (क्योंकि वे ऑर्डर-ओनली प्रीरेसी के व्यवहार के एक सख्त सुपरसेट होते हैं)।
इसलिए मेकफाइल बन जाता है
.PHONY : clearscr fresh clean all
all :
compile executable
clean :
rm -f *.o $(EXEC)
fresh : | clean clearscr all
clearscr:
clear
EDIT 5 दिसंबर
यह एक बड़ी बात नहीं है कि एक से अधिक मेकफाइल इंस्टेंस चलाना क्योंकि टास्क के अंदर प्रत्येक कमांड एक सब-शेल रास्ते होगा। लेकिन आपके पास कॉल फ़ंक्शन का उपयोग करके पुन: प्रयोज्य तरीके हो सकते हैं ।
log_success = (echo "\x1B[32m>> $1\x1B[39m")
log_error = (>&2 echo "\x1B[31m>> $1\x1B[39m" && exit 1)
install:
@[ "$(AWS_PROFILE)" ] || $(call log_error, "AWS_PROFILE not set!")
command1 # this line will be a subshell
command2 # this line will be another subshell
@command3 # Use `@` to hide the command line
$(call log_error, "It works, yey!")
uninstall:
@[ "$(AWS_PROFILE)" ] || $(call log_error, "AWS_PROFILE not set!")
....
$(call log_error, "Nuked!")
.PHONY :
कुछ कीवर्ड के रूप में किया जाता है जो हमेशा निष्पादित होता है, जबकि गैर-फ़ॉनी लक्ष्य फ़ाइलों के रूप में होते हैं।