makefile किसी अन्य लक्ष्य को निष्पादित करता है


123

मैं एक makefile संरचित कुछ इस तरह है:

all : 
    compile executable

clean :
    rm -f *.o $(EXEC)

मुझे एहसास हुआ कि मैं "सभी बनाने" से पहले अपने टर्मिनल में "स्पष्ट" और उसके बाद "साफ" चल रहा था। मुझे कोशिश करने से पहले एक साफ टर्मिनल रखना पसंद है और गंदा सी ++ संकलन त्रुटियों के माध्यम से झारना। इसलिए मैंने तीसरा लक्ष्य जोड़ने की कोशिश की:

fresh :
    rm -f *.o $(EXEC)
    clear
    make all

यह काम करता है, हालांकि यह मेक का दूसरा उदाहरण है (मुझे विश्वास है)। वहाँ एक सही तरीका है बनाने के लिए दूसरा उदाहरण चलाने के बिना एक ही कार्यक्षमता पाने के लिए?

जवाबों:


172

वास्तव में आप सही हैं: यह मेक की एक और मिसाल है। एक संभावित समाधान होगा:

.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!")

6
@ sas4740: मूल रूप से सब कुछ का पालन .PHONY : कुछ कीवर्ड के रूप में किया जाता है जो हमेशा निष्पादित होता है, जबकि गैर-फ़ॉनी लक्ष्य फ़ाइलों के रूप में होते हैं।
डैकव

क्या "ऑर्डर-केवल पूर्वापेक्षाएँ" सशर्त हैं? टारगेट t2 के लिए मैं पहले t0 चाहता हूं, केवल तभी अगर t0 succeds t1 चलाते हैं, और केवल तभी दोनों succeds t3 में कुछ काम चलाते हैं
fantastory

1
@fantastory, नहीं, मुझे लगता है कि वे स्वतंत्र हैं। t2पर निर्भर करेगा t0, t1और t3। आप रखना चाहिए आप इस की जरूरत है t3के रूप में के लिए आवश्यक t2, t1के रूप में के लिए आवश्यक t3और t0के रूप में के लिए आवश्यक t1। इसका मतलब है 3 अलग-अलग नियम। हालाँकि, आपको इसे सत्यापित करना चाहिए। मुझे 100% यकीन नहीं है।
डैकव

3
"ऑर्डर-ओनली पूर्वापेक्षाएँ" स्वतंत्र हैं
कल्पनात्मक

2
मैं यह नहीं देखता कि 'सभी' से पहले 'स्वच्छ' प्रदर्शन की गारंटी कहाँ है? तथ्य यह है कि आप उन्हें सही से | उन्हें आदेश में निष्पादित नहीं करता है। आदेश-केवल निर्भरता का मतलब है कि इस तरह के ऑपरेशन के बाद लक्ष्य को आवश्यक रूप से अपडेट नहीं किया गया है। यह निर्भर तत्वों के आदेश के साथ कुछ नहीं करना है ... या?
साइग्नसएक्स 1

6

यदि आपने make allअपने "ताज़ा" लक्ष्य से लाइन हटा दी है :

fresh :
    rm -f *.o $(EXEC)
    clear

आप बस कमांड को चला सकते हैं make fresh all, जो इस प्रकार निष्पादित करेगा make fresh; make all

कुछ इसे मेक की दूसरी मिसाल के रूप में मान सकते हैं, लेकिन यह निश्चित रूप से मेक (मेक के अंदर एक मेक) का उप-उदाहरण नहीं है, जो कि आपके प्रयास का परिणाम है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.